
    $TXg-                     *   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZmZmZmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ ddlmZmZm Z  ddl!m"Z" ddl#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z; ddl<m=Z=  e
e>      Z?d&dZ@ ej                  d      ZBdeeC   dee;   fdZD e,j                  ddd      d'd       ZF e,dd      d(d        ZGd)d!ZHd&d"ZId# ZJd*d$ZKd% ZLy)+z Miscellaneous utility functions.    N)defaultdict)Iterable)	getLogger)abspathdirnameexistsisdirisfilejoinrelpath   )context)on_macon_win	open_utf8)dashlist)expand)is_urljoin_urlpath_to_url)	get_index)PrefixSetupUnlinkLinkTransaction)PackageCacheDataProgressiveFetchExtract)
PrefixData)
deprecated)CondaExitZeroDisallowedPackageError
DryRunExitPackagesNotFoundError
ParseError)rm_rf)islinkreadlinksymlink)ChannelMatch	MatchSpec)PrefixGraphc           	          t               }t        |       j                         D ]3  }|rd|v r
|j                  t        |j	                  dd                   5 |S )zb
    Return the set of files which have been installed (using conda) into
    a given prefix.
    	file_hashfiles )setr   iter_recordsupdateget)prefixexclude_self_buildresmetas       *lib/python3.12/site-packages/conda/misc.pyconda_installed_filesr7   '   sS    
 %C6"//1+"5

3txx,-. 2 J    z(?:(?P<url_p>.+)(?:[/\\]))?(?P<fn>[^/\\#]+(?:\.tar\.bz2|\.conda))(?:#((?P<md5>[0-9a-f]{32})|((sha256:)?(?P<sha256>[0-9a-f]{64}))))?$specsreturnc              #     K   | D ]  }|dk(  r	t        |      s	 t        t        |            }t        j	                  |      }|t        d|       |j                  d      |j                  d      }}t        ||      }i }|j                  d      x}r||d<   |j                  d      x}r||d<   t        |fi |  y w)Nz	@EXPLICITzCould not parse explicit URL: url_pfnmd5sha256)	r   r   r   url_patmatchr"   groupr   r(   )	r9   specmr<   r=   url	checksumsr>   r?   s	            r6   _match_specs_from_explicitrG   >   s     ;d| vd|,D MM$9=dVDEEGGG$aggdmrub!	''%. 3 "IeWWX&&6&"(Ih)y))9 s   CCz25.3z25.9
index_argsc           
         t        t              }||d<   t        t        |             }t        j                  r
t               t        |      }|j                          t        j                  rt        d      t        d |D              }|D 	
cg c]  \  }	}
|
	t        |	       }}	}
|rAt        |      t        |      k(  rt        d      dj                  |      }t        d|       g }t        |      }t!        |      D ]{  \  }\  }	}
t#        |	|
j$                        }|||   d<   |j'                  |
j$                  d       }|sGt)        |j+                  |      d       r	d ||   d<   k|j-                  |       } t/        ||t        d	 |D              d
t        d |D              d
      }t1        |      }t        j2                  s t        j4                  s|j7                          |j                          y c c}
}	w )NPREFIXzUPackage caches prepared. UnlinkLinkTransaction cancelled with --download-only option.c              3   ^   K   | ]%  }|t        t        j                  |      d       g ' y wN)nextr   	query_all).0rC   s     r6   	<genexpr>zexplicit.<locals>.<genexpr>s   s,      ITt$..t4d;<s   +-zNo package cache records foundz, z#Missing package cache records for: namer   c              3   2   K   | ]  }|d    s	|d     yw)r   r   Nr-   rO   sps     r6   rP   zexplicit.<locals>.<genexpr>        4lbebel   

r-   c              3   2   K   | ]  }|d    s	|d      yw)r   Nr-   rT   s     r6   rP   zexplicit.<locals>.<genexpr>   rV   rW   )r   listrG   r   dry_runr    r   executedownload_onlyr   tuplestrlenAssertionErrorr   r   	enumerater(   rR   r1   rM   queryappendr   r   jsonquietprint_transaction_summary)r9   r2   verboseforce_extractindexactionsfetch_specspfespecs_pcrecsrC   pcrecspecs_with_missing_pcrecsmissing_precs_listprecs_to_removeprefix_dataqnew_specprecstptxns                       r6   explicitrx   ^   s   $GGH1%89Kl
!+
.CKKMK
 	
  IT L &2!%1kdEU]D	\  ! !()S->> !ABB!%+D!E 56H5IJ  OV$K%l3=D%T

3%Quzz40K%%h/6%)Q"&&t, 4 4l44
4l44
C  
$C<<%%'KKMM!s   
H H c                 \    |t        |       dz   d  }t        r|r|j                  dd      }|S )Nr   \/)r_   r   replace)r2   pathwindows_forward_slashesr4   s       r6   rel_pathr      s2    
s6{Q 
!C)kk$$Jr8   c                    t               }t        |       } h d}h d}t        r|j                  ddh       d t	        j
                  |       D        D ]  }|r||v r
t        t        | |            r|j                  |       1t	        j                  t        | |            D ]  \  }}}	|xr |t        | d      k(  }
|	D ].  }|
r||v r
|j                  t        t        ||      |              0 |D ]5  }t        ||      }t        |      s|j                  t        ||              7   t        r"|r |D ch c]  }|j                  dd       c}S |S c c}w )	z8Return the set of all files in a given prefix directory.>   .index.unionfs	conda-bld
conda-meta.conda_lockLICENSE.txtconda-recipesenvsinfopkgsusers	.nonadmin>   condaactivate
deactivatez
python.appzLauncher.appc              3   4   K   | ]  }|j                     y wrL   rQ   )rO   entrys     r6   rP   zwalk_prefix.<locals>.<genexpr>   s     :'9euzz'9s   binrz   r{   )r.   r   r   r0   osscandirr
   r   addwalkr   r$   r   r|   )r2   ignore_predefined_filesr~   r4   ignore	binignorer=   rootdirsr,   should_ignorefn2dnr}   s                 r6   walk_prefixr      s?   
%CV_FF 4I|^45:rzz&'9:"rV|$vr"#GGBK!#fb)9!:D$3SVU@S8SM SI%5T389  D"~$<GGGD&12  "; ;" )478CDT3'C88
 9s   :Ec                     t        | |      }t        |       |z
  D ch c]D  }|j                  d      s1t        r|j                  d      s|j                  d      r|dd |v s|F c}S c c}w )z;Return (the set) of all untracked files for a given prefix.~z	.DS_Storez.pycN)r7   r   endswithr   )r2   r3   conda_filesr}   s       r6   	untrackedr      su    '0BCK  '+5
5DMM#k*}}V$Sb	[( 	5
 
 
s   A	A)c                    t         rut        t        t        j                  d            rQt        |       st        j                  |        t        t        | d      d      5 }|j                  d       ddd       yyy# 1 sw Y   yxY w)zFCreates $PREFIX/.nonadmin if sys.prefix/.nonadmin exists (on Windows).r   w N)
r   r   r   r   root_prefixr	   r   makedirsr   write)r2   fos     r6   touch_nonadminr      sc    &g11;?@V}KKtFK0#6"HHRL 76 Av 76s    A==Bc                 p	   t        |       }i }d}|ryd}t        |       j                         D ]X  d   }||v r|dk(  r	|d<   d} n@|dk(  r	|d<   d} n2j                  D ]!  }	t	        |	      j
                  |v s||<   d}# Z |ry|r|spt        j                  rt        j                  nt        j                  }
t        d|
       |j                         D ]   t        dj                         z   |
       " t        |       j                         D ch c]  }|d   |vr| }}n&t        |       j                         D ch c]  }| }}i }|D cg c]  }|j                  d	      r| }}g }|r|xs i }t        di |}|D ]  t	        j
                  j                   j"                  
      t%        fd|j                         D              }|s|j'                         et)        |      dkD  r,|j+                         |j-                  t/        |             |j+                         |j-                  |d           |rt1        |      i }|D ]
  d	   |<    t%        t3        |      j4                        }|D cg c]  }||   	 }}t%        d t        j6                  D              }|D ]!  t9        fd|D              st;               |r.t        dt)        |      z         t        dt)        |      z         t        j<                  r
t?               |D ]  }tA        | |      }tA        ||      }tC        |      }tE        |      stG        |      rtI        |       tK        |      stM        jN                  |       tE        |      rtQ        tS        |      |       	 tU        |d      5 }|jW                         }ddd       	 j[                  d      }|j]                  | |      }|j_                  d      }tU        |d      5 }|jc                         ddd       te        jf                  ||       " ti        ||| |d      }||fS c c}w c c}w c c}w c c}w # 1 sw Y   xY w# tX        $ r Y dw xY w# t`        $ r Y w xY w# 1 sw Y   vxY w)z(Clone existing prefix1 into new prefix2.TFrR   r   z	conda-envzDThe following packages cannot be cloned out of the root environment:)filez - rE   )rR   versionbuildc              3   F   K   | ]  }j                  |      s|  y wrL   rA   )rO   ru   rC   s     r6   rP   zclone_env.<locals>.<genexpr>#  s     N>4TZZ=M$>s   !!r   r   c              3   2   K   | ]  }t        |        y wrL   )r(   )rO   ss     r6   rP   zclone_env.<locals>.<genexpr>7  s     I-Hy|-Hs   c              3   @   K   | ]  }|j                          y wrL   r   )rO   dru   s     r6   rP   zclone_env.<locals>.<genexpr>9  s     1jqwwt}js   zPackages: %dz	Files: %drbNzutf-8wb)rg   ri   rh   r-   )5r   r   r/   combined_dependsr(   rR   r   rd   sysstderrstdoutprintvaluesdist_strr1   r   r   r   r]   rc   r_   remover   _get_best_prec_matchr!   r)   graphdisallowed_packagesanyr   rZ   r    r   r   r$   r
   r#   r	   r   r   r&   r%   r   readOSErrordecoder|   encodeUnicodeDecodeErrorr   shutilcopystatrx   )prefix1prefix2rg   re   rH   untracked_filesfilterfoundrR   depfhru   drecsri   unknownsnotfoundprecsurls
disallowedfsrcdstdst_dirfidatar   r   rj   rC   s              `                @r6   	clone_envr      sd   (O FE
w'446D<Dv~w"&w{"&*{#,,S>&&&0#'F4L E - 7 & &||BV edmmo-B7 ( #7+88:
:F|6) : 	 
 #-W"5"B"B"DE"D$"DE E!&>dhhuoH>H%2
'J'D$))T\\TDN5<<>NNE%UaT"		.u56T"		%(#  #H-- D%[T
  +d#))*E#()54DJ5D)IW-H-HIIJ1j11(..  ns5z)*kC001l7A7A#,'?fWo'NW~KK #;HSM3'	3%wwy &
	G$A		'7+A88G$D sD!RHHTN "S!7 : 	G O##m
 F ?4 *6 &% 		 " 		 "!sf   Q-
	Q2Q72Q7Q<?RRR%4R%R,R
	R	RR	R)(R),R5	c                     | sJ t         j                  D ]%  }t        |      t        fd| D              }|s% n | }t        j                  dt        |             |d   S )Nc              3   n   K   | ],  }j                  |j                  j                        s)| . y wrL   )rA   channelrR   )rO   ru   channel_matchers     r6   rP   z'_get_best_prec_match.<locals>.<genexpr>n  s,      
"To&;&;DLL<M<M&NDUs   *55zMultiple packages found: %sr   )r   channelsr'   r]   logwarningr   )r   r   prec_matchesr   s      @r6   r   r   j  sh    L5##&w/ 
"
 
  $ KK-x/EF?r8   )F)FTN)T)TT)TFN)M__doc__r   rer   r   collectionsr   collections.abcr   loggingr   os.pathr   r   r   r	   r
   r   r   base.contextr   common.compatr   r   r   	common.ior   common.pathr   
common.urlr   r   r   
core.indexr   	core.linkr   r   core.package_cache_datar   r   core.prefix_datar   deprecationsr   
exceptionsr   r   r    r!   r"   gateways.disk.deleter#   gateways.disk.linkr$   r%   r&   models.match_specr'   r(   models.prefix_graphr)   __name__r   r7   compiler@   r^   rG   argumentrx   r   r   r   r   r   r   r-   r8   r6   <module>r     s   ' 	 	  
 # $  J J J ! 4 4   5 5 ! 9 N ( $  ( 9 9 6 ,
 "***hsm *8K *@ VV\2? 3?D FF )X y$xr8   