
    wBfC                       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 erdd%lmSZS dd&lOmTZT eLZUe1rd'nd(ZVe1rd)nd*ZWd+ZXd,ZYe1sd-nd.ZZe1sd/nd0Z[e1sd1nd2Z\d3Z] ee^      Z_d4 Z` e	d5       e@d6d7      d8               Zadab e j                  d9:       e@d6d7d;<      d=               Zd e@d6d7d;<      dSd>       Ze e@d6d7d;<      dTd?       Zf e@d6d7d;<      dSd@       Zg G dA dB      Zh e@dCd7dD<      dUdE       Zi e@d6d7dF<      edVdG              Zj e@d6d7dH<      edVdI              Zk e@d6d7dJ<      edVdK              Zl e@d6d7dL<      dWdM       Zm e@d6d7dL<      edVdN              Zn e@d6d7dO<      dXdP       Zo	 	 	 	 	 	 dYdQZpej                  fdRZry)Zz
These helpers were originally defined in tests/test_create.py,
but were refactored here so downstream projects can benefit from
them too.
    )annotationsN)contextmanager)	lru_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)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/pythonScriptsbinu   ōγђ家固한áêñßôç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   R   s    99T6""    )maxsizez24.9z25.3c                 &   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   hasattrrM   
startswithosunlink	Exception)rP   
batch_fileouts      rA   1running_a_python_capable_of_unicode_subprocessingrX   V   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.)addendumc                X    | st         S | j                  }t        j                  |v sJ |a y N)tmpdir_in_usestrpathrS   sep)tmpdirtds     rA   
set_tmpdirrb   s   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   rX   UNICODE_CHARACTERS_RESTRICTEDr	   r   lenrN   rS   environgetstrr   SPACER_CHARACTERr   sys
executabler?   pathbasenamer+   OSErrorprintprefixr*   rU   )rP   use_restricted_unicoder`   capable
RESTRICTEDrandom_unicodetmpdir_namers   srcdstes              rA   _get_temp_prefixr|      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.
    rP   rt   )r|   rS   makedirsr   rP   rt   _temp_prefixs      rA   make_temp_prefixr      sH     '.D

L! s   5 9c                z    t        | |      }t        |       t        j                  |       t	        |      sJ |S )Nr~   )r|   r*   rS   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dj                  |      z  t.        j0                         t3        t4        d      5  t3        t4        d      5  t7        dg|      5  t9        |
 5 }|rt;        t<        |	|      }nt=        |	|      }d d d        d d d        j>                  }|j0                  }t-        |t.        j>                         t-        |t.        j0                         d d d        d d d        | t        j                  fv r<tA        tB        jD                  j                  |tB        jF                  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 %s

r<   )filecondarequests
python_api)$
isinstancetupler0   rj   r   r   r   r   r   r   r   appendr	   r   r   r   insertextend
parse_argsr   _set_argparse_argsr   rr   rm   rK   r#   TEST_LOG_LEVELr   r   r(   r   stdoutr   rS   ro   r_   )commandrs   	argumentskwargsr   command_defaults_to_devr   debugr@   argscap_argscresultr   rK   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	2SXXi5HHZZ 
.'	2 '4D
5 ' <,),- 	*x/B 	*a$0$B q)		* 	*
 f3::&f3::&' ' 8??$$rww||FRVVOY?@$G66!!	* 	* 	* 	*' ' ' 'sU   N5N)%	N.!N	NAN)-N5NNN&"N))N2	.N55N>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)NrP   rt   Frs   r~   clean_prefixfetchr   CONDA_TEST_SAVE_TEMPSTignore_errorsz1CONDA_TEST_SAVE_TEMPS :: retaining make_temp_env )popr|   rS   ro   existsr*   r   r   r!   r   r	   r_   r   r   r   ri   r   logwarning)packagesr   rP   rt   rs   r   s         rA   make_temp_envr   ;  sP     ::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)rt   pkgsCONDA_PKGS_DIRS)stack_callbackTr   )r   r   r	   r)   r,   r   r"   r   r   	pkgs_dirsr   r%   _cache_r   )rs   pkgs_dirs     rA   make_temp_package_cacher   \  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   rP   )r   r   fn)urlchannelschannelr   noarchzrepodata.jsonrF   )clsr   )r?   splitr   package_is_installedr&   iter_recordsr   r   r   r	   r%   first_writabler   dumpr   r/   r   subdirr$   rS   r   itemsr   openrO   jsondumpsr   )r   pkgpackage_reqspackage_namesrs   packager@   datarepodatatarfilespackage_datapkg_datafnamefieldr   subchan
noarch_dirtar_old_pathtar_new_pathfs                       rA   make_temp_channelr   q  s     6>>cCKKS)>L>2:;3SYYs^A&;M;		% O 	KG'S0IJJJ	K "&)668
AfI<VA
 
 	HOOV<m< 	OG+FGOOC4MNNN	OO +HH @/>>@II5Q==?3 	&ELL%	&&3&?h&?U#@ 
 Gw/'8,
g&
G
J#+>>#3 	1E</L\<0	1 $w0#6 	=!GGDJJx];<	=$z?3S9 	7QGGDJJr}56	7  3 ?;

O O@	= 	=	7 	7 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 r\   )r|   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r\   )r   rS   r   r
   r*   )rs   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   )rs   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              z        |d   S )NT)pip_interop_enabledr   zMultiple packages installed.%sc              3  <   K   | ]  }|j                           y wr\   )dist_str).0precs     rA   	<genexpr>z'package_is_installed.<locals>.<genexpr>  s     @D@s   r   )r.   r   r&   rk   queryrh   AssertionErrorr    )rs   specprefix_recss      rA   r   r     sq     T?D
3v;DIOOPTUVK	[	A	,@K@@B
 	

 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)rm   platformr   rs   is_file)menuinst.platforms.win_utils.knownfoldersr  ImportErrormenuinst.win32r  r,   rT   rq   r	   rS   ri   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   rk   )r   None)rs   zstr | os.PathLike | Pathr  zstr | MatchSpecr   zPrefixRecord | None)s__doc__
__future__r   r   rS   rm   
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.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.recordsr/   utilsr0   r1   r2   r   PYTHON_BINARYBIN_DIRECTORYrN   rg   which_or_where
cp_or_copy
env_or_setrl   r   r   rB   rX   r]   fixturerb   r|   r   r   r   r   r   r   r   r   r   r   r   rs   r  r   rC   rA   <module>rK     s   #  	 
 %   1 1   # #      2 ) 5 P P 9 # "  % 6 ) % 0 * ( % ( $ ) * %- &L#	2  (  &GTV
 Ue
  # 4FF  0  

`
  

`
%
%P 

`

* 

`

  FF%MNQ" OQ"h 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   