
    \Zi                       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&J'r'J(r(  SSK)J*r*  SSK+J,r,J-r-  SSK.J/r/J0r0  SSK1J2r2J3r3  SSK4J5r5  SSK6J7r7J8r8  \(       a  SSKJ9r9  \" \:5      r;S r<S r=S*S jr>S  r?S! r@S" rAS# rBS$ rCS% rDS& rES' rFS( rGS) rHg)+z@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)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>r3   &   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_linesrA   )   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    r4   )r   is_filer   hashlibnewr7   iterr   readupdate	hexdigest)r=   algohasherfhchunks        r+   compute_sumrO   C   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)
rQ   read_icondataread_package_metadataread_paths_jsonr   rR   r   channel_namerS   rU   )recordpackage_cache_recordepdrV   rW   rX   s         r+   read_package_infor`   U   sq    

4
4CS!H,S1 %J!"6"P"P++=v~~> $$)	 	r4   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_jsonri   g   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   rb   rc   )conda_package_handling.apir!   apiextractr   r   r   re   )rR   conda_package_handlingtmpdirr>   	json_datas        r+   read_index_json_from_tarballrr   l   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)Nrb   zrepodata_record.jsonrd   rf   s     r+   read_repodata_jsonrt   v   s6    	(&2HI
	yy}
 
 
rj   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)Nrb   zicon.pngrC   zutf-8)r   r   r   rH   r   decode)rg   icon_file_pathr>   datas       r+   rY   rY   }   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)Nrb   z	link.jsonzpackage_metadata.json)r   )rg   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   loadsrH   getr   r   r   )rg   r{   r=   r>   rx   rW   s   `     r+   rZ   rZ      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)Nrb   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'   r8   )r)   r?   s     r+   r,   r      s     O7Ntjjll7Ns   _pathr   prefix_placeholderr    	file_modeTno_link	path_typer   )r   rA   keysr"   r   softlinkhardlinkr   )
files_pathr>   	path_inforg   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   re   r   r   r   r   read_has_prefixread_no_linktuple)
rg   paths_json_path
paths_jsonrx   rX   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Tr4   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   rA   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   rA   r   )r   s    r+   r   r      s5    Xy12X}56	
 r4   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>   rg   s     r+   r,   "read_soft_links.<locals>.<genexpr>   s"     REqVD1La,P%QEs   .	.)r   )rg   r   s   ` r+   read_soft_linksr      s    RERRRr4   )r=   zstr | os.PathLikerK   zLiteral['md5', 'sha256']returnstr)I__doc__
__future__r   rE   r0   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   
exceptionsr   r   r   models.channelr   models.enumsr   r   models.package_infor   r   models.recordsr   r   creater!   linkr"   r#   r$   __name__loglistdirrA   rO   r`   ri   rr   rt   rY   rZ   r[   r   r   r   r   r4   r+   <module>r      s    G "  	  "     ' '    & 0  0 & $ V V % . ? 3 & !
?4
$$
 2-`O6Sr4   