
    wBf+                        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
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*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9  ee:      Z;ddZ< ejz                  d      Z>	 ddZ?d dZ@d!dZAddZBd ZCd"dZDd ZEy)#z Miscellaneous utility functions.    N)defaultdict)	getLogger)abspathdirnameexistsisdirisfilejoinrelpath   )context)on_macon_winopen)dashlist)expand)is_urljoin_urlpath_to_url)	get_index)PrefixSetupUnlinkLinkTransaction)PackageCacheDataProgressiveFetchExtract)
PrefixData)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_filesr5   %   sX    
 %C6"//1 /+"5

3txx,-./ J    z](?:(?P<url_p>.+)(?:[/\\]))?(?P<fn>[^/\\#]+(?:\.tar\.bz2|\.conda))(:?#(?P<md5>[0-9a-f]{32}))?$c           
         t        t              }||d<   g }| D ]  }|dk(  r	t        |      s	 t        t	        |            }t
        j                  |      }	|	t        d|z        |	j                  d      |	j                  d      |	j                  d      }}}
t        |
|      }|j                  |rt        ||      n
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 }t1        |      }t3        |      D ]{  \  }\  }}t        ||j4                        }|||   d<   |j7                  |j4                  d       }|sGt9        |j;                  |      d       r	d ||   d<   k|j                  |       } t=        ||t'        d |D              dt'        d |D              d      }t?        |      }|j!                          y c c}}w )NPREFIXz	@EXPLICITz Could not parse explicit URL: %surl_pfnmd5)r;   zUPackage caches prepared. UnlinkLinkTransaction cancelled with --download-only option.c              3   ^   K   | ]%  }|t        t        j                  |      d       g ' y wN)nextr   	query_all).0specs     r4   	<genexpr>zexplicit.<locals>.<genexpr>h   s-      AE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+   r@   sps     r4   rB   zexplicit.<locals>.<genexpr>        4bebe4   

r+   c              3   2   K   | ]  }|d    s	|d      yw)r   Nr+   rF   s     r4   rB   zexplicit.<locals>.<genexpr>   rH   rI   ) r   listr   r   r   url_patmatchr    groupr   appendr&   r   dry_runr   r   executedownload_onlyr   tuplestrlenAssertionErrorr
   r   	enumeraterD   r/   r>   queryr   r   )specsr0   verboseforce_extract
index_argsindexactionsfetch_specsrA   mr9   r:   md5sumurlpfespecs_pcrecspcrecspecs_with_missing_pcrecsmissing_precs_listprecs_to_removeprefix_dataqnew_specprecstptxns                             r4   explicitro   9   s~    $GGHK U;d| vd|,D MM$9?$FGGGGG,aggdmQWWU^6rub! 	9Sf5Ys^T1U4 l
!+
.CKKMK
 	
  IT L &2!!dEU]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,
- 4l44
4l44
C  
$CKKMI!s   8
I8I8c                 \    |t        |       dz   d  }t        r|r|j                  dd      }|S )Nr   \/)rU   r   replace)r0   pathwindows_forward_slashesr2   s       r4   rel_pathrv      s2    
s6{Q 
!C)kk$$Jr6   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r=   rC   )r@   entrys     r4   rB   zwalk_prefix.<locals>.<genexpr>   s     :euzz:s   binrq   rr   )r,   r   r   r.   osscandirr	   r
   addwalkr   r"   r   rs   )r0   ignore_predefined_filesru   r2   ignore	binignorer:   rootdirsr*   should_ignorefn2dnrt   s                 r4   walk_prefixr      sO   
%CV_FF 4I|^45:rzz&'9: 3"rV|$vr"#GGBK!#fb)9!: 		3D$3SVU@S8SM : SI%5T389:  3D"~$<GGGD&123		33" )478DT3'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)r5   r   endswithr   )r0   r1   conda_filesrt   s       r4   	untrackedr      sp    '0BCK  '+5
MM#k*}}V$Sb	[( 	
 
 
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)r0   fos     r4   touch_nonadminr      sl    &g11;?@V}KK$v{+S1 	RHHRL	 	 Av	 	s    A==Bc                 r	   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 ew xY w# t`        $ r Y w xY w# 1 sw Y   wxY w)z(Clone existing prefix1 into new prefix2.TFrD   r   z	conda-envzDThe following packages cannot be cloned out of the root environment:)filez - rb   )rD   versionbuildc              3   F   K   | ]  }j                  |      s|  y wr=   rM   )r@   rl   rA   s     r4   rB   zclone_env.<locals>.<genexpr>  s     N4TZZ=M$Ns   !!r   r   c              3   2   K   | ]  }t        |        y wr=   )r&   )r@   ss     r4   rB   zclone_env.<locals>.<genexpr>)  s     Iy|Is   c              3   @   K   | ]  }|j                          y wr=   r   )r@   drl   s     r4   rB   zclone_env.<locals>.<genexpr>+  s     1qwwt}1s   zPackages: %dz	Files: %drbNzutf-8wb)rZ   r]   r[   r\   r+   )5r   r   r-   combined_dependsr&   rD   r   jsonsysstderrstdoutprintvaluesdist_strr/   r   r   r   rS   rO   rU   remover   _get_best_prec_matchr   r'   graphdisallowed_packagesanyr   rP   r   r
   r   r"   r	   r!   r   r   r   r$   r#   r   readOSErrordecoders   encodeUnicodeDecodeErrorr   shutilcopystatro   )prefix1prefix2rZ   quietr\   untracked_filesfilterfoundrD   depfhrl   drecsr]   unknownsnotfoundprecsurls
disallowedfsrcdstdst_dirfidatar   r   r^   rA   s              `                @r4   	clone_envr      s   (O FE
w'446 	!D<Dv~w"&w{"&*{#,, !S>&&&0#'F4L E!	! & &||BV  8edmmo-B78 #7+88:
F|6) 
 
 #-W"5"B"B"DE$E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#()4DJ)D)IW-H-HIIJ /1j11(../ ns5z)*kC001l "7A7A#,'?fWo'NW~KK #;HSM3'	c4 !Bwwy!
	G$A		'7+A88G$D #t_ 	HHTN	S!7": 	G O##o
 F ?4 *6! ! 		 " 			 	sf   Q.
	Q3Q82Q8Q=?RRR%4R%R-R	R	RR	R*)R*-R6	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r=   )rM   channelrD   )r@   rl   channel_matchers     r4   rB   z'_get_best_prec_match.<locals>.<genexpr>a  s-      
o&;&;DLL<M<M&ND
s   *55zMultiple packages found: %sr   )r   channelsr%   rS   logwarnr   )r   r   prec_matchesr   s      @r4   r   r   ]  sm    L5## &w/ 
"
 
  HH*H\,BC?r6   )F)FTNN)T)TT)TFN)F__doc__r   rer   r   collectionsr   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   
exceptionsr   r   r   r   r    gateways.disk.deleter!   gateways.disk.linkr"   r#   r$   models.match_specr%   r&   models.prefix_graphr'   __name__r   r5   compilerL   ro   rv   r   r   r   r   r   r+   r6   r4   <module>r      s    ' 	 	  
 #  J J J ! / /   5 5 ! 9 N (  ( 9 9 6 ,
 "**$ NRXv)X z$zr6   