
    si/!                       S r SSKJr  SSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJrJrJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSK!J"r"  SSK#J$r$  SSK%J&r&  SSK'J(r(J)r)J*r*  SSK+J,r,  SSK-J.r.J/r/  SSK0J1r1J2r2  SSK3J4r4J5r5  SSK6J7r7  SSK8J9r9J:r:  \(       a  SSKJ;r;  \" \<5      r=S r>S r?S0S  jr@S! rAS" rBS# rCS$ rDS% rES& rFS' rGS( rHS) rIS* rJ\&" S+S,S-S.9S/ 5       rKg)1z@Disk utility functions for reading and processing file contents.    )annotationsN)	b64encode)
namedtuple)ENOENT)partial)chain)	getLogger)isdirisfilejoin)Path)TYPE_CHECKING   )first)shlex_split_unicode)dals)PREFIX_PLACEHOLDER)	open_utf8)json)
deprecated)CondaUpgradeErrorCondaVerificationErrorPathNotFoundError)Channel)FileModePathEnum)PackageInfoPackageMetadata)
PathDataV1	PathsData   )TemporaryDirectory)islinklexists)Literalc                N    [        S [        R                  " U 5       5       5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7fN)name).0entrys     8lib/python3.13/site-packages/conda/gateways/disk/read.py	<genexpr><lambda>.<locals>.<genexpr>'   s     ?   )listosscandir)ds    r,   <lambda>r4   '   s    D?A??    c              #  b  #     [        U 5      n U R                  5        nU H8  nUR                  5       nU(       d  M  UR                  S5      (       a  M4  Uv   M:     SSS5        g! , (       d  f       g= f! [         a     g[
         a  nUR                  [        :X  a   SnAge SnAff = f7f)zGenerator function for lines in file.  Empty generator if path does not exist.

Args:
    path (str): path to file

Returns:
    iterator: each line in file, not starting with '#'

#N)r   openstrip
startswithFileNotFoundErrorOSErrorerrnor   )pathflinees       r,   yield_linesrB   *   s     DzYY[Azz|4 4 4J  [[
   77f	sn   B/A8 A'A'A'A8 &B/'
A51A8 4B/5A8 8
B,B/	B,B'!B/&B''B,,B/c                   [        U 5      n U R                  5       (       d  [        U 5      e[        R                  " U5      nU R                  S5       n[        [        UR                  S5      S5       H  nUR                  U5        M     S S S 5        UR                  5       $ ! , (       d  f       UR                  5       $ = f)Nrbi    r5   )r   is_filer   hashlibnewr8   iterr   readupdate	hexdigest)r>   algohasherfhchunks        r,   compute_sumrP   D   s    :D<<>>%% [[F	4B'"''40#6EMM%  7 
  
 s   9B$$
Cc                    UR                   n[        U5      n[        U5      n[        U5      n[	        UUR
                  [        U R                  =(       d    U R                  5      U UR                  UUUS9$ )N)extracted_package_dirpackage_tarball_full_pathchannelrepodata_recordurlicondatapackage_metadata
paths_data)
rR   read_icondataread_package_metadataread_paths_jsonr   rS   r   channel_namerT   rV   )recordpackage_cache_recordepdrW   rX   rY   s         r,   read_package_infora   V   sq    

4
4CS!H,S1 %J!"6"P"P++=v~~> $$)	 	r5   c                    [        [        U SS5      5       n[        R                  " U5      sS S S 5        $ ! , (       d  f       g = f)Ninfo
index.jsonr   r   r   loadextracted_package_directoryfis     r,   read_index_jsonrj   h   s.    	43V\J	Kryy} 
L	K	K	   7
Ac                   SS K n[        5        nUR                  R                  XS5        [	        [        USS5      5       n[        R                  " U5      nS S S 5        S S S 5        W$ ! , (       d  f       N= f! , (       d  f       W$ = f)Nr   rc   rd   )conda_package_handling.apir"   apiextractr   r   r   rf   )rS   conda_package_handlingtmpdirr?   	json_datas        r,   read_index_json_from_tarballrs   m   sp    %		""**+DfUtFFL9:a		!I ; 
  ;: 
	 s#   3A<A+A<+
A9	5A<<
Bc                    [        [        U SS5      5       n[        R                  " U5      sS S S 5        $ ! , (       d  f       g = f)Nrc   zrepodata_record.jsonre   rg   s     r,   read_repodata_jsonru   w   s6    	(&2HI
	yy}
 
 
rk   c                    [        U SS5      n[        U5      (       a?  [        US5       nUR                  5       nS S S 5        [	        W5      R                  S5      $ g ! , (       d  f       N)= f)Nrc   zicon.pngrD   zutf-8)r   r   r   rI   r   decode)rh   icon_file_pathr?   datas       r,   rZ   rZ   ~   sY    5vzJNn~t,668D -%%g..	 -,s   A
A,c                F  ^  U 4S jn[        U" 5       [        S9nU(       d  g [        U5       n[        R                  " UR                  5       5      nUR                  S5      S:w  a  [        [        S5      5      e S S S 5        [        S0 WD6nU$ ! , (       d  f       N= f)Nc               3  J   >#    [        T SS5      v   [        T SS5      v   g 7f)Nrc   z	link.jsonzpackage_metadata.json)r   )rh   s   r,   _paths%read_package_metadata.<locals>._paths   s'     .DD.8OPPs    #)keypackage_metadata_versionr!   z
                The current version of conda is too old to install this package. (This version
                only supports link.json schema version 1.)  Please update conda to install
                this package.
                 )
r   r   r   r   loadsrI   getr   r   r   )rh   r|   r>   r?   ry   rX   s   `     r,   r[   r[      s    Q v&Dt_::affh'Dxx23q8'  9  +2T2 _s   AB
B c                  ^ ^^^	 [        T S5      m[        TS5      n[        U5      (       ai  [        U5       n[        R                  " U5      nS S S 5        WR                  S5      S:w  a  [        [        S5      5      e[        SS US    5       S9nU$ [        [        TS	5      5      m[        T5      m	U UUU	4S
 jn[        U" 5       5      n[        SUS9nU$ ! , (       d  f       N= f)Nrc   z
paths.jsonpaths_versionr!   z
            The current version of conda is too old to install this package. (This version
            only supports paths.json schema version 1.)  Please update conda to install
            this package.c              3  8   #    U  H  n[        S0 UD6v   M     g 7f)Nr   )r   )r*   r?   s     r,   r-   "read_paths_json.<locals>.<genexpr>   s     :Mq:??Mr/   paths)r   r   
has_prefixc               3  t  >#    [        TS5      n S S [        U 5       5        5        H  nSU0nUTR                  5       ;   a  TU   S   US'   TU   S   US'   UT;   a  S	US
'   [        [        TU5      5      (       a  [        R
                  US'   O[        R                  US'   [        S0 UD6v   M     g 7f)Nfilesc              3  6   #    U  H  o(       d  M  Uv   M     g 7fr(   r   )r*   lns     r,   r-   ;read_paths_json.<locals>.read_files_file.<locals>.<genexpr>   s      OrSUOs   
	c              3  @   #    U  H  oR                  5       v   M     g 7fr(   r9   )r*   r@   s     r,   r-   r      s     O7Ntjjll7Ns   _pathr   prefix_placeholderr!   	file_modeTno_link	path_typer   )r   rB   keysr#   r   softlinkhardlinkr   )
files_pathr?   	path_inforh   has_prefix_filesinfo_dirr   s      r,   read_files_file(read_paths_json.<locals>.read_files_file   s     h0JO{:7NO %aL	(--//6Fq6I!6LI23-=a-@-CIk*<+/Ii($:A>??-5->->Ik*-5->->Ik* -9--s   B5B8r   )r   r   r   r   rf   r   r   r   r    read_has_prefixread_no_linktuple)
rh   paths_json_path
paths_jsonry   rY   r   r   r   r   r   s
   `      @@@r,   r\   r\      s    /8H8\2Oo':99Z(D (88O$)#  :DM:

< 3 +4,+GHx(	. 	." o'(

 S ('s   C
C)c                   ^ ^^ [        SS5      mUU 4S jmU4S j[        T 5       5       nU Vs0 s H%  o"R                  UR                  UR                  4_M'     sn$ s  snf )zReads `has_prefix` file and return dict mapping filepaths to tuples(placeholder, FileMode).

A line in `has_prefix` contains one of:
  * filepath
  * placeholder mode filepath

Mode values are one of:
  * text
  * binary
ParseResult)placeholderfilemodefilepathc                  > [        S [        U SS9 5       5      n[        U5      S:X  a  T" [        [        R
                  US   5      $ [        U5      S:X  a  T" US   [	        US   5      US   5      $ [        ST 35      e)	Nc              3  B   #    U  H  oR                  S 5      v   M     g7f)z"'Nr   )r*   xs     r,   r-   6read_has_prefix.<locals>.parse_line.<locals>.<genexpr>   s     U.Tggenn.Ts   F)posixr!   r   r      z!Invalid has_prefix file at path: )r   r   lenr   r   textr   )r@   partsr   r>   s     r,   
parse_line#read_has_prefix.<locals>.parse_line   s|    U.A$e.TUUu:?18==%(KKZ1_uQx%();U1XFF(+LTF)STTr5   c              3  4   >#    U  H  nT" U5      v   M     g 7fr(   r   )r*   r@   r   s     r,   r-   "read_has_prefix.<locals>.<genexpr>   s     C1BJt$$1Bs   )r   rB   r   r   r   )r>   parsed_linesprr   r   s   `  @@r,   r   r      sV     ],STKU DT1BCLAMN2KK".."++66NNNs   ,Ac                x    [        [        [        [        U S5      5      [        [        U S5      5      5      5      $ )Nr   no_softlink)setr   rB   r   )r   s    r,   r   r      s5    Xy12X}56	
 r5   c                .   ^  [        U 4S jU 5       5      $ )Nc              3  `   >#    U  H#  n[        [        TU5      5      (       d  M  Uv   M%     g 7fr(   )r#   r   )r*   r?   rh   s     r,   r-   "read_soft_links.<locals>.<genexpr>   s"     REqVD1La,P%QEs   .	.)r   )rh   r   s   ` r,   read_soft_linksr      s    RERRRr5   z25.9z26.3zJUse 'conda.plugins.prefix_data_loaders.pypi.pkg_format.read_python_record')addendumc                     SSK Jn  U" XU5      $ )Nr   )read_python_record)+plugins.prefix_data_loaders.pypi.pkg_formatr   )prefix_pathanchor_filepython_versionr   s       r,   r   r      s     RkGGr5   )r>   zstr | os.PathLikerL   zLiteral['md5', 'sha256']returnstr)L__doc__
__future__r   rF   r1   base64r   collectionsr   r=   r   	functoolsr   	itertoolsr   loggingr	   os.pathr
   r   r   pathlibr   typingr   auxlib.collectionr   auxlib.compatr   
auxlib.ishr   base.constantsr   common.compatr   common.serializer   deprecationsr   
exceptionsr   r   r   models.channelr   models.enumsr   r   models.package_infor   r   models.recordsr   r    creater"   linkr#   r$   r%   __name__loglistdirrB   rP   ra   rj   rs   ru   rZ   r[   r\   r   r   r   r   r   r5   r,   <module>r      s    G "  	  "     ' '    & 0  0 & $ & V V % . ? 3 & !
?4
$$
 2-`O6S 

Y
H
Hr5   