
    $TXg:D                       d Z ddlm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 ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZ ddlm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* ddl+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZF ddlGmHZH dd lImJZJ dd!lKmLZL dd"lMmNZN dd#lOmPZP dd$lQmRZR dd%lSmTZT erdd&lUmVZV dd'lQmWZW eNZXe1rd(nd)ZY eBj                  d*d+d,e:d-.       [:d/Z[d0Z\e1sd1nd2Z]e1sd3nd4Z^e1sd5nd6Z_d7Z` eea      Zbd8 Zce	 eBd9d*      d:               Zddae e j                  d;<       eBd9d*d=.      d>               Zg eBd9d*d=.      dTd?       Zh eBd9d*d=.      dUd@       Zi eBd9d*d=.      dTdA       Zj G dB dC      Zk eBdDd*dE.      dVdF       Zl eBd9d*dG.      edWdH              Zm eBd9d*dI.      edWdJ              Zn eBd9d*dK.      edWdL              Zo eBd9d*dM.      dXdN       Zp eBd9d*dM.      edWdO              Zq eBd9d*dP.      dYdQ       Zr	 	 	 	 	 	 dZdRZsej                  fdSZuy)[z
These helpers were originally defined in tests/test_create.py,
but were refactored here so downstream projects can benefit from
them too.
    )annotationsN)contextmanager)cache)	getLogger)dirnameisdirjoinlexists)Path)sample)copyfilermtree)check_output)
gettempdir)TYPE_CHECKING)uuid4   )Utf8NamedTemporaryFile)EntityEncoder)PACKAGE_CACHE_MAGIC_FILE)conda_tests_ctxt_mgmt_def_polcontextreset_context)do_callgenerate_parser)init_loggers)on_win)argvcaptureddashlistdisable_loggerenv_varstderr_log_level)BIN_DIRECTORY)path_to_url)PackageCacheData)
PrefixData)
deprecated)conda_exception_handler)mkdir_p)rm_rf)link)touch)DEBUG)	MatchSpec)PackageRecord)massage_arguments)Iterator)PrefixRecordz
python.exez
bin/pythonz25.3z25.9r$   z.Use `conda.common.path.BIN_DIRECTORY` instead.)addendumu   ōγђ家固한áêñßôçabcdefwhichwherecpcopyenvset c                &    | j                  dd      S )N\z\\)replace)ps    9lib/python3.12/site-packages/conda/testing/integration.pyescape_for_winpathrB   Z   s    99T6""    z24.9c                 &   d } t        dt        dz   d      5 }|j                  d       |j                  d       |j                  } d d d        | rw	 t	        | t        |       d d      }t        |d      r|j                  d	      n|}|j                  d
      r	 t        j                  |        y	 t        j                  |        yy# 1 sw Y   xY w# t        $ r Y t        j                  |        yw xY w# t        j                  |        w xY w)Nwz.batF)modesuffixdeletez@echo Hello World
z@exit 0
)cwdstderrshelldecodezutf-8zHello WorldT)r   UNICODE_CHARACTERSwritenamer   r   hasattrrL   
startswithosunlink	Exception)rO   
batch_fileouts      rA   1running_a_python_capable_of_unicode_subprocessingrW   ^   s     D 
 +f4U
	./%
 		tt5QC)0h)?#**W%SC~~m,
 IIdO	  IIdO#
 
  	IIdO	 IIdOs0   /C	AC 	C	C6C9 5C66C9 9DT)autousezQUse `tmp_path`, `conda.testing.path_factory`, or `conda.testing.tmp_env` instead.c                X    | st         S | j                  }t        j                  |v sJ |a y N)tmpdir_in_usestrpathrR   sep)tmpdirtds     rA   
set_tmpdirr`   {   s+     	B66R<<MrC   c                f   t         xs
 t               }t               }|r|r+t        }dj	                  t        |t        |                  }n,dj	                  t        t        t        t                          }t        j                  j                  d|  t        t                     d d t        z   |z   n|       }t	        ||      }t        r t        j                   j#                  dd      nt        j                   }t        j$                  j	                  |t        j$                  j'                  t        j                               }		 t)        ||	       	 t1        |	       |S # t*        $ r# t-        d| dt        j.                   d       Y 9w xY w# t2        $ r}
t-        |
       Y d }
~
|S d }
~
ww xY w)	N CONDA_TEST_TMPDIR_NAME   z.exez.pdbz?
WARNING :: You are testing `conda` with `tmpdir`:-
           z;
           not on the same FS as `sys.prefix`:
           z
           this will be slow and unlike the majority of end-user installs.
           Please pass `--basetemp=<somewhere-else>` instead.)r[   r   rW   UNICODE_CHARACTERS_RESTRICTEDr	   r   lenrM   rR   environgetstrr   SPACER_CHARACTERr   sys
executabler?   pathbasenamer,   OSErrorprintprefixr+   rT   )rO   use_restricted_unicoder^   capable
RESTRICTEDrandom_unicodetmpdir_namerq   srcdstes              rA   _get_temp_prefixrz      sf    *jlF?AG,2

C
O!DE(:C@R<S!TU**.. < 
UWbq	,	,~	=	K &+&F 5;#..
 
 
0C
'',,vrww//?
@C
S#c

 M  
OPVx XJJM** VLL	

  aM	s*   E" F ")FF	F0F++F0c                x    |st        | |      }	 t        j                  |       t        |      sJ |S #  Y xY w)a  
    When the env. you are creating will be used to install Python 2.7 on Windows
    only a restricted amount of Unicode will work, and probably only those chars
    in your current codepage, so the characters in UNICODE_CHARACTERS_RESTRICTED
    should probably be randomly generated from that instead. The problem here is
    that the current codepage needs to be able to handle 'sys.prefix' otherwise
    ntpath will fall over.
    rO   rr   )rz   rR   makedirsr   rO   rr   _temp_prefixs      rA   make_temp_prefixr      sH     '.D

L! s   5 9c                z    t        | |      }t        |       t        j                  |       t	        |      sJ |S )Nr|   )rz   r+   rR   r}   r   r~   s      rA   FORCE_temp_prefixr      s>     $*@L 
,KKrC   c                  8    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZy)CommandscompareconfigcleancreateinfoinstalllistremovesearchupdaterunN)__name__
__module____qualname__COMPARECONFIGCLEANCREATEINFOINSTALLLISTREMOVESEARCHUPDATERUN rC   rA   r   r      s9    GFEFDGDFFF
CrC   r   z23.9z&Use `conda.testing.conda_cli` instead.c           	        t        |t              sJ d       t        |      }|j                  dd      }| t        j
                  t        j                  t        j                  t        j                  fv }|j                  d|rdnd      }|j                  dd      }t               }| t        j                  u r,|j                  d       |j                  t        |d             | t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  fv r$|j!                  d	d
       |j!                  d|       | t        j
                  t        j                  t        j                  t        j                  fv r|j#                  ddg       |j!                  d	|        |r|j!                  dd       |r|j!                  dd       |j%                  |      }	t'        j(                  |	       t+                |j                  d      sdnd}
t-        dj/                  dj                  |            t0        j2                         t5        t6        d      5  t5        t6        d      5  t9        dg|      5  t;        |
 5 }|rt=        t>        |	|      }nt?        |	|      }d d d        d d d        j@                  }|j2                  }t-        |t0        j@                         t-        |t0        j2                         d d d        d d d        | t        j                  fv r<tC        tD        jF                  j                  |tD        jH                  z   d      g|	       fS # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   }xY w# 1 sw Y   xY w)Nz&run_command() arguments must be tuplesuse_exception_handlerFdevTdebug_wrapper_scriptsz--filecondarcr   z-p   z-yz-qz--devz--debug-wrapper-scripts
no_capturer   )NNz$

EXECUTING COMMAND >>> $ conda {}

r<   )filecondarequests
python_api)%
isinstancetupler1   rh   r   r   r   r   r   r   r   appendr	   r   r   r   insertextend
parse_argsr   _set_argparse_argsr   rp   formatrk   rJ   r#   TEST_LOG_LEVELr   r   r)   r   stdoutr   rR   rm   r]   )commandrq   	argumentskwargsr   command_defaults_to_devr   debugr@   argscap_argscresultr   rJ   s                  rA   run_commandr      s   i'Q)QQ'!),I"JJ'>F &	*  **U$;D
GCJJ.6EA(//!"fi01  	D!F#8??H$4$4hooxWW$&Q 
G$56 <<	"Dt$NL1r|H	299#((9:MNZZ
 	14<,),-x/Ba$0$B q)	 0C-
 f3::&f3::& 	5 	2 8??$$rww||FRVVOY?@$G66!! 0C/B-- 	54 	21sU   O"N51	N):!N	N)#AN59ON&"N))N2.N55N>	:OO
z$Use `conda.testing.tmp_env` instead.c               /  *  K   |j                  dd       }|j                  dd      }|j                  dd       xs t        ||      }|j                  dd       }|r*t        j                  j	                  |      rt        |       t        |      st        |||       t        d      5  	 t        t        j                  j                  |t        j                  z   d      g       t        t        j                  |g| i | | d	t        j                  vrt!        |d
       nt"        j%                  d|        	 d d d        y # d	t        j                  vrt!        |d
       w t"        j%                  d|        w xY w# 1 sw Y   y xY ww)NrO   rr   Frq   r|   clean_prefixfetchr   CONDA_TEST_SAVE_TEMPSTignore_errorsz1CONDA_TEST_SAVE_TEMPS :: retaining make_temp_env )poprz   rR   rm   existsr+   r   r   r!   r   r	   r]   r   r   r   rg   r   logwarning)packagesr   rO   rr   rq   r   s         rA   make_temp_envr   D  sG     ::fd#D#ZZ(@%HZZ$' +;*@,F ::nd3L77>>&!&M=5v>		 	
 277<<CDEE(EfEL&bjj8vT2GxP 
!	  'bjj8vT2GxP 
!	 s7   B'F)F+AE
9F	F
:FFFFz)Use `conda.testing.tmp_pkgs_dir` instead.c               #    K   t        t              } t        | d      }t        |       t	        t        |t
                     	 t        d|t              5  t        j                  |fk(  sJ | d d d        t        | d       t        j                  j                  |d        y # 1 sw Y   7xY w# t        | d       t        j                  j                  |d        w xY ww)N)rr   pkgsCONDA_PKGS_DIRS)stack_callbackTr   )r   r   r	   r*   r-   r   r"   r   r   	pkgs_dirsr   r&   _cache_r   )rq   pkgs_dirs     rA   make_temp_package_cacher   e  s      V<FFF#HH	$x1
23
58

 $$333N
 	vT*  $$Xt4
 
 	vT*  $$Xt4s6   AC%B3 B'1B3 9.C%'B0,B3 3/C""C%z(Use `conda.testing.tmp_channel` instead.c           	   #    K   | D cg c]  }|j                  dd       }}| D cg c]  }|j                  d      d    }}t        | 5 }| D ]   }t        ||j                  dd            r J  t	        |      j                         D cg c]  }|d   |v s| }}t        t        j                  |g|  | D ]   }t        ||j                  dd            s J  	 d d d        i i d}i }	D ]n  }
|
}|d   }t        t        j                         j                  |      |	|<   |j                         }dD ]  }|j                  |d         t        di ||d   |<   p t               5 }t        |t         j"                        }t        |d	      }t%        |      }t'        j(                  |       t'        j(                  |       |	j+                         D ]  \  }}t        ||      }t-        ||        t/        t        |d
      d      5 }|j1                  t3        j4                  |t6                     d d d        t/        t        |d
      d      5 }|j1                  t3        j4                  i t6                     d d d        | d d d        y c c}w c c}w c c}w # 1 sw Y   xY w# 1 sw Y   {xY w# 1 sw Y   >xY w# 1 sw Y   y xY ww)N-=r   rO   )r   r   fn)urlchannelschannelr   noarchzrepodata.jsonrE   )clsr   )r?   splitr   package_is_installedr'   iter_recordsr   r   r   r	   r&   first_writabler   dumpr   r0   r   subdirr%   rR   r}   itemsr   openrN   jsondumpsr   )r   pkgpackage_reqspackage_namesrq   packager@   datarepodatatarfilespackage_datapkg_datafnamefieldr   subchan
noarch_dirtar_old_pathtar_new_pathfs                       rA   make_temp_channelr   z  s     6>>XcCKKS)XL>2:;(3SYYs^A&(M;		%G'S0IJJJ   "&)668
8!AfI<VA8 	 
 	HOOV<m<G+FGOOC4MNNN   
& +HH/>>@II5Q==?3ELL% 4&3&?h&?U#  
Gw/'8,
g&
G
J#+>>#3E</L\<0 $4 $w0#6!GGDJJx];< 7$z?3S9QGGDJJr}56 :  
3 ?;

 
&	%@ 7699 
s   KJKJ
K"J&.J&J!J!>J&J& BK,B"K+J39K+J?KK!J&&J0+K3J<	8K?K	KKKz7Use `tmp_path` or `conda.testing.path_factory` instead.c                     t               S rZ   )rz   r   rC   rA   create_temp_locationr     s     rC   c               #     K   t               } 	 t        j                  |        |  t        |       rt	        |        y y # t        |       rt	        |        w w xY wwrZ   )r   rR   r}   r
   r+   )rq   s    rA   tempdirr     sL     
 "#F
F6?&M 76?&M s   A? AAAz/Use `conda.base.context.reset_context` instead.c                4    t        | d      }t        |g       y )Nr   )r	   r   )rq   prefix_condarcs     rA   reload_configr     s    &),N>"#rC   c                    t        |      }t        t        t        |       d      j	                  |            }|sy t        |      dkD  rt        dt        d |D                     |d   S )NT)pip_interop_enabledr   zMultiple packages installed.c              3  <   K   | ]  }|j                           y wrZ   )dist_str).0precs     rA   	<genexpr>z'package_is_installed.<locals>.<genexpr>  s     3\P[DMMOP[s   r   )r/   r   r'   ri   queryrf   AssertionErrorr    )rq   specprefix_recss      rA   r   r     sq     T?D
3v;DIOOPTUVK	[	A	*83\P[3\+\*]^
 	
 1~rC   c                   t         j                  dk(  r>t        t         j                  d      j	                         rdnd}	 ddlm} ||   d   d   S t        | d      }|j	                         rd}n#	 |j                          d}|j                          t         j                  d	k(  r#|dk(  rt        t        j                  d
   d      S yt         j                  dk(  r%|dk(  rt        t        j                  d
   ddd      S yt!        t         j                        # t        $ r4 	 ddlm} ||   d   d   cY S # t        $ r ddlm	} ||   d   cY cY S w xY ww xY w# t        $ r d}Y w xY w)Nwin32z	.nonadminusersystemr   )dirs_srcstart)dirsdarwinHOMEApplicationsz/Applicationslinuxz.localshareapplicationsz/usr/share/applications)rk   platformr   rq   is_file)menuinst.platforms.win_utils.knownfoldersr  ImportErrormenuinst.win32r  r-   rS   ro   r	   rR   rg   NotImplementedError)prefix_for_unix	user_moder  r  non_admin_files        rA   get_shortcut_dirr    s]   
||w"3::{;CCEF8		0JI&w/22 /;7N		$  " I!!#
||x

6*N;;
||w

6*Hg~NN(
cll
++A  	003	*73A66 0/Iw//0	0$  	! I	!sB   D 2E 	E%D85E8EEEEE)(E))NF)NFN)returnztuple[str, str, int])r  zIterator[str])r  ri   )r  None)rq   zstr | os.PathLike | Pathr  zstr | MatchSpecr  zPrefixRecord | None)v__doc__
__future__r   r   rR   rk   
contextlibr   	functoolsr   loggingr   os.pathr   r   r	   r
   pathlibr   randomr   shutilr   r   
subprocessr   tempfiler   typingr   uuidr   pytestauxlib.compatr   auxlib.entityr   base.constantsr   base.contextr   r   r   cli.conda_argparser   r   cli.mainr   common.compatr   	common.ior   r   r    r!   r"   r#   common.pathr$   
common.urlr%   core.package_cache_datar&   core.prefix_datar'   deprecationsr(   
exceptionsr)   gateways.disk.creater*   gateways.disk.deleter+   gateways.disk.linkr,   gateways.disk.updater-   gateways.loggingr.   models.match_specr/   models.recordsr0   utilsr1   collections.abcr2   r3   r   PYTHON_BINARYconstantrM   re   which_or_where
cp_or_copy
env_or_setrj   r   r   rB   rW   r[   fixturer`   rz   r   r   r   r   r   r   r   r   r   r   r   rq   r  r   rC   rA   <module>rL     s   #  	 
 %   1 1   # #      2 ) 5 P P 9 # "  ( $ 6 ) % 0 * ( % ( $ ) * %(- &L 
  

= 2  (  &GTV
 Ue
  # FF  0  

`
  

`
%
%P 

`

* 

`

  FF%MNR" OR"j FF%KL  M> FF%PQ5  R5& FF%OP)  Q)X 
FV 
FV   FF%VW$ X$
$
   &)ZZ (,rC   