
    <Bh,[                       S r SSKJr  SSKrSSKrSSKrSSK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  SS
KJr  SSKrSSKJr  SSK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/J0r0  SSK1J2r2  \Rf                  Ri                  S\" \" \" \55      SSSS5      5      5      r6\" \" \6S5      5      =r7r8\" \" \6S5      5      r9\" SS9r:S r;S! r<SGS" jr=\SHS$ j5       rSIS% jr>SIS& jr?SIS' jr@S( rAS) rB\S* 5       rCS+ rDS, rESJS- jrFSJS. jrGSGS/ jrHS0 rI\R                  S1S14S2 jrK\R                  S#S14S3 jrL\
\R                  S#S14S4 j5       rM\
\R                  S#S14S5 j5       rN\
\R                  S1S14S6 j5       rO\
\R                  S#S14S7 j5       rP\R                  S#S14S8 jrQ       SKS9 jrR      SLS: jrS\      SLS; j5       rT\      SLS< j5       rU\      SLS= j5       rV\      SLS> j5       rW\      SLS? j5       rX\      SLS@ j5       rY\      SLSA j5       rZ\      SLSB j5       r[SC r\\R                  " 5       SD 5       r^SE r_  SMSF jr`g)Nz3Collection of helper functions used in conda tests.    )annotationsN)contextmanager)cache)abspathdirnamejoin)Path)
gettempdirmkdtemp)patch)uuid4   )REPODATA_FN)conda_tests_ctxt_mgmt_def_polcontext)captured)env_var)
PrefixData)
SubdirData)rm_rf)lexists)History)Channel)PackageRecordPrefixRecord)ResolveCONDA_TEST_DATA_DIRz..testsdataconda_format_repobase_url_channelz-test-conda-channels)suffixz6Using Anaconda Cloud api site https://api.anaconda.orgc                    [         (       a:  U R                  [         5      (       a   U [        [         5      S  R                  5       n U $ N)expected_error_prefix
startswithlenlstrip)stderrs    5lib/python3.13/site-packages/conda/testing/helpers.pystrip_expectedr+   .   s:    !2!23H!I!I1245<<>M    c                     U" 5       n[        SU 35      e! U  a0  nU(       a  X$R                   S   ;   d   e[        U5         S nAgS nAff = f)Nr   Tzdid not raise, gave )argsprint	Exception)	exceptionfuncstringaes        r*   raisesr6   4   sV    F *1#.
//  VVAY&&&a	s    A&AATc              #    #     [        5        nUv   S S S 5        [        WR                  5      Ul        U (       a*  UR                  (       a  [        SUR                   35      eg g ! , (       d  f       NZ= f! [        WR                  5      Ul        U (       a*  UR                  (       a  [        SUR                   35      ef f = f7f)NzGot stderr output: )common_io_capturedr+   r)   r0   )disallow_stderrcs     r*   r   r   ?   s     >!QG " "!((+qxx1!((<==  (?	 "! "!((+qxx1!((<==  (?s3   C
A8 A'A8 AC'
A51A8 8ACCc                    U R                  5       < SUR                  5       < 3S-   U-   nU R                  5       UR                  5       :X  d   U5       eg )Nz != z

lowerr4   boutputs      r*   assert_equalsrA   K   sG    	}D.7&@F779	!)6)!r,   c                    U R                  5       UR                  5       ;  d-   U SU R                  5       < SUR                  5       < 35       eg )N z should not be found in r<   r>   s      r*   assert_not_inrD   P   sD    779AGGI% (!AGGI= 8F%r,   c                    U R                  5       UR                  5       ;   d-   U SU R                  5       < SUR                  5       < 35       eg )NrC   z cannot be found in r<   r>   s      r*   	assert_inrF   V   sD    779	! (!AGGI= 4QWWYMB!r,   c                x    U R                  S5      u  pUS-   [        R                  -   nSR                  X/5      $ )N::/)splitr   subdirr   )dist_stringchannel_strpackage_strs      r*   
add_subdirrO   \   s:    *006K#gnn4K99k/00r,   c                   [        U [        5      (       a.  U R                  5       VVs0 s H  u  p[        U5      U_M     snn$ [        U [        5      (       a  [	        [        [        U 5      5      $ [        U [        5      (       a  [        [        [        U 5      5      $ [        U [        5      (       a  [        [        [        U 5      5      $ [        S5      es  snnf )Nz/Unable to add subdir to object of unknown type.)	
isinstancedictitemsrO   listmapsettupler0   )iterablekvs      r*   add_subdir_to_iterr[   b   s    (D!!-5^^-=>-=TQ
1q -=>>	Hd	#	#C
H-..	Hc	"	"3z8,--	He	$	$SX.//IJJ ?s   Cc               #    #    [        5       n [        [        5       5      S S n[        X5      n [        R
                  " U5        Uv   [        U5      (       a  [        U5        g g ! [        U5      (       a  [        U5        f f = f7f)N   )r
   strr   r   osmakedirsr   r   )
tempdirdirr   prefixs      r*   tempdirrc   o   sh     J%'l2AG*&F
F6??&M 76??&M s   ,BA& 	B&BBc                @   US   nUR                  S5      nUR                  S5      nUR                  S5      nU(       d  SR                  US   US   5      nUR                  nUS   R                  5        H$  u  p[        R
                  " U
U	UUUUUUS9nXU'   M&     g )NinfoarchplatformrK   z{}-{}packages)fnrf   rg   channelrK   priorityauth)getformatrl   rS   r   from_objects)indexrepodatarj   rk   repodata_inforf   rg   rK   rl   ri   re   recs               r*   supplement_index_with_repodatart   |   s    V$MV$D  ,Hx(Fj 9=;PQ<<DZ(..0((
 c
 1r,   c                    [        5       nU R                  5        H1  nUR                  (       d  M  UR                  UR                  5        M3     U H  n[        R
                  " U5      nX U'   M     g r$   )rV   valuestrack_featuresupdater   feature)rp   all_featuresrs   feature_names       r*   add_feature_records_legacyr|      s\    5L||~ 2 23  %##L1c
 %r,   c           	     
   U R                   nU R                  R                  n0 n0 nU R                  5        H  nUR                  (       a  SUR
                  S   l        UR                  5       nUS:X  a!  [        USS5      (       a  SUS'   S=US'   US'   SU;   a  US   US	'   US	 UR                  R                  S
5      (       a  XdUR                  '   M  XcUR                  '   M     US   US   US   US   US   SU0UUS.$ )
This function is only temporary and meant to patch wrong / undesirable
testing behaviour. It should end up being replaced with the new class-based,
backend-agnostic solver tests.
T	timestampnoarchNrK   rg   rf   featuresrw   z.conda_cache_control_etag_mod_url_add_pip)r   r   r   r   r   re   rh   zpackages.conda)_internal_staterj   rK   iter_recordsr   
__fields___in_dumpdumpgetattrri   endswith)subdir_datastaterK   rh   packages_condapkgr   s          r*   _export_subdir_data_to_repodatar      s%    ''E  ''FHN'')== 48CNN;'0xxzX'#x">">%DN.22DtF| &**%5D!"Z 66??8$$%)366"#SVV) *,   01wff*%f
 ( r,   c                   [        [        5      U R                  R                  -  nXR                  R                  -  nUR                  SSS9  [        US-  S5       n[        R                  " [        U 5      USSS9  UR                  5         [        R                  " UR                  5       5        SSS5        g! , (       d  f       g= f)r~   T)parentsexist_okrepodata.jsonwr   )indent	sort_keysN)r	   EXPORTED_CHANNELS_DIRrj   namerK   mkdiropenjsonr   r   flushr_   fsyncfileno)r   basesubdir_pathfs       r*   _sync_channel_to_diskr      s     %&)<)<)A)AAD,,333KdT2	kO+S	1Q		+K8!AQU	
 	
	
 
2	1	1s   AB<<
C
c                    Uc9  [        U 5      R                  SS9S4n[        R                  R	                  U5      nU(       a7  [        [
         SU  35      nU[        R                  UR                  SS9S4'   gg)r~   NTwith_credentialsr   rI   )r   urlr   _cache_rm   r   )r   r   	cache_keylocal_proxy_channels       r*   4_alias_canonical_channel_name_cache_to_file_prefixedr      s     DM%%t%<oM	 ((,,Y7%)>(?q&GH  	 $$d$;_M	
 r,   c                P    [        X5        [        U5        [        S5      Ul        g)r~   infN)r   r   float_mtime)r   r   s     r*   _patch_for_local_exportsr      s"     9K +&uKr,   Fc                   [        U [        [        R                  45      (       a9  [	        [        [        U 5      5       n[        R                  " U5      nS S S 5        O#[        U [        5      (       a  U nO[        S5      eU0 S0 0nU(       a  WXr'   OTWR                  5        H@  u  pU	R                  S5      S:X  d  U	R                  S5      (       a	  XS   U'   M9  XU   U'   MB     / n
/ nUR                  5        H  u  pU[        R                  [        R                  S.US.n[!        SU SU 35      nUR#                  U5        [%        U5      nU
R#                  U5        ['        S[        U5      R)                  5       [*        S	9   UR-                  [        R.                  " U5      5        S S S 5        S
Ul        U[$        R2                  UR5                  S
S9[6        4'   [9        UU5        M     0 nU
 H3  nUR;                  UR=                  5       Vs0 s H  nUU_M     sn5        M5     [?        UUS9nUU4$ ! , (       d  f       GN= f! , (       d  f       N= fs  snf )Nz1'json_filename_or_data' must be path-like or dictr   rK   )rK   rf   rg   )re   rh   zhttps://conda.anaconda.org/rI   "CONDA_ADD_PIP_AS_PYTHON_DEPENDENCYstack_callbackTr   )channels) rQ   r^   r_   PathLiker   r   TEST_DATA_DIRr   loadrR   
ValueErrorrS   rm   r   	arch_namerg   r   appendr   r   r=   r   _process_raw_repodata_strdumps_loadedr   r   r   r   rx   r   r   )json_filename_or_packageschannel_namerK   add_pipmerge_noarchfiall_packagesrh   keyr   subdir_datasr   
subchannelsubchannel_pkgsrq   rj   sdrp   precrs                       r*   _get_index_r_baser      s(    +c2;;-?@@$}&?@AR99R=L BA	-t	4	40LMMHb)H'$**,HCwwx H,0A0A*-"3'(+ %	 - LH'/~~'7#
 %))#,,
 (
 7~QzlST  B0L 8

 ((H)=>
 
PR
GKKK>LM r2- (82 ER__->?->TdDj->?@ )A!8Oc BAB
 
 @s   H>
&II!
>
I
I	c                    [        SSU UUS9$ Nz
index.json	channel-1rK   r   r   r   r   s      r*   get_index_r_1r   =      ! r,   c                    [        SSU UUS9$ )Nzindex2.json	channel-2r   r   r   s      r*   get_index_r_2r   G      ! r,   c                    [        SSU UUS9$ )Nzindex4.json	channel-4r   r   r   s      r*   get_index_r_4r   R  r   r,   c                    [        SSU UUS9$ )Nzindex5.json	channel-5r   r   r   s      r*   get_index_r_5r   ]  r   r,   c                    SSSS/SSSSS	.SSSS
/SSSS.SS/ SSSSS	.SS/ SSSSS	.SS/ SSSSS	.SS/ SSSSS	.SSSS/SSSSS	.SSSS
/SSSSS	.S.n[        USU UUS 9  g )!N0r   zlibbar 2.0.*zlibfoo 1.0.* 11ec1194bcc56b9a53c127142a272772foobarl   -MC1.0)buildbuild_numberdependsmd5r   r   versionzlibfoo 2.0.* f8eb5a7fa1ff6dead4e360631a6cd048z2.0)r   r   r   r   r   r    f51f4d48a541b7105b5e343704114f0flibbarl   KC 27f4e717ed263f909074f64d9cbf935dl   LC ad7c088566ffe2389958daedf8ff312clibfool   i6HC daf7af7086d8f22be49ae11bdc41f332l   SJC 18604cbe4f789fe853232eef4babd4f9quxl   WCzlibbar 1.0.* 892aa4b9ec64b67045a46866ef1ea488l   [C)zfoobar-1.0-0.tar.bz2zfoobar-2.0-0.tar.bz2zlibbar-1.0-0.tar.bz2zlibbar-2.0-0.tar.bz2zlibfoo-1.0-0.tar.bz2zlibfoo-2.0-0.tar.bz2zqux-1.0-0.tar.bz2zqux-2.0-0.tar.bz2channel-freezer   r   )rK   r   r   rq   s       r*   get_index_must_unfreezer   h  s    &75&!
 &75!
 5&!
 5&!
 5&!
 5&!
 &75&
 &75&
HHR !r,   c                    [        SSU UUS9$ r   r   r   s      r*   get_index_cudar     r   r,   c                :    [        SU UU=(       d    / UUUUS.UD6$ )N)r   r   r   r   r   r   rj    )r   )r   r   r   r   r   r   rj   kwargss           r*   recordr     s9      	2!	 	 	r,   c           
   #  H  #    UR                   n[        U5      nUV	s0 s H#  oR                  [        R                  " U	5      _M%     sn	Ul        UV
s0 s H  oR                  U
_M     nn
U S:X  a:  [        [        R                  Xg5        [        S5        [        [         S35      4nGO'U S:X  a:  [        [        R                  Xg5        [        S5        [        [         S35      4nGOU S:X  a:  [        [        R                  Xg5        [        S5        [        [         S35      4nGOU S:X  a:  [        [        R                  Xg5        [        S5        [        [         S35      4nGOgU S	:X  ao  [        [        R                  Xg5        [        [        R                  Xg5        [        S5        [        S5        [        [         S35      [        [         S35      4nOU S
:X  ao  [        [        R                  Xg5        [        [        R                  Xg5        [        S5        [        S5        [        [         S35      [        [         S35      4nO}U S:X  a9  [        [        R                  Xg5        [        S5        [        [         S35      4nO>U S:X  a8  [!        [        R                  Xg5        [        S5        [        [         S35      4nU(       a  [        R                  4O[        R                  S4n["        R$                  " [&        SUS9   [)        S[+        U5      R-                  5       [.        S9   [        R0                  R3                  5       " UWUUUS9v   S S S 5        S S S 5        g s  sn	f s  sn
f ! , (       d  f       N!= f! , (       d  f       g = f7f)Nr   z
/channel-1r   z
/channel-2r   z
/channel-4r   z
/channel-5aggregate-1aggregate-2must-unfreezer   z/channel-freezecudar   get_requested_specs_map)return_valuer   r   )specs_to_addspecs_to_remove)strpathr   r   r   ro   _PrefixData__prefix_recordsr   r   rK   r   r   r   r   r   r   r   r   r   objectr   r   r^   r=   r   plugin_managerget_solver_backend)
channel_idtmpdirr  r  prefix_recordshistory_specsr   r   pdrs   specspec_mapr   subdirss                 r*   _get_solver_baser    s     ^^F	F	B<J&<JS,++C00N&B" -::MD		4MH:[ gnng<<[I45Z@AC	{	"gnng<<[I45Z@AC	{	"gnng<<[I45Z@AC	{	"gnng<<[I45Z@AC	}	$gnng<gnng<<[I<[I,-Z89,-Z89
 
}	$gnng<gnng<<[I<[I ,-Z89,-Z89
 
	&F<=MN45_EFH	v	w~~w=<[I45Z@AC#/w~~gnnh5OG 	W7hO0L 8	
 $$779%+
 	
	
 	POg& ;b	
 	
 	POsM   N"*M6N"M;(J-N"'N<)N %N-N" 
N	
N
NN"c              #  @   #    [        SU UUUUUUS9 S h  vN   g  N7f)Nr   r  r  r  r  r   r   r  r  r  r  r  r  r   r   s          r*   
get_solverr  /  1       !'%#!	 	 	   c              #  @   #    [        SU UUUUUUS9 S h  vN   g  N7f)Nr   r  r  r  s          r*   get_solver_2r  E  r  r  c              #  @   #    [        SU UUUUUUS9 S h  vN   g  N7f)Nr   r  r  r  s          r*   get_solver_4r  [  r  r  c              #  @   #    [        SU UUUUUUS9 S h  vN   g  N7f)Nr   r  r  r  s          r*   get_solver_5r  q  r  r  c              #  @   #    [        SU UUUUUUS9 S h  vN   g  N7f)Nr   r  r  r  s          r*   get_solver_aggregate_1r!    1       !'%#!	 	 	r  c              #  @   #    [        SU UUUUUUS9 S h  vN   g  N7f)Nr   r  r  r  s          r*   get_solver_aggregate_2r$    r"  r  c              #  @   #    [        SU UUUUUUS9 S h  vN   g  N7f)Nr   r  r  r  s          r*   get_solver_must_unfreezer&    s1       !'%#!	 	 	r  c              #  @   #    [        SU UUUUUUS9 S h  vN   g  N7f)Nr   r  r  r  s          r*   get_solver_cudar(    s1       !'%#!	 	 	r  c                $    [        S U 5       5      $ )Nc              3  >   #    U  H  oR                  S S9v   M     g7f)F)canonical_nameN)dist_str).0r   s     r*   	<genexpr>&convert_to_dist_str.<locals>.<genexpr>  s     Je4s   )rW   )solutions    r*   convert_to_dist_strr1    s    JJJJr,   c                 >    [         R                  R                  5       $ r$   )r   r  r	  r   r,   r*   solver_classr3    s    !!4466r,   c                 @    [        [        R                  " S5      5      $ )N_RERUN_IN_SUBPROCESS)boolr_   getenvr   r,   r*   in_subprocessr8    s    		0122r,   c                   [        5       (       a  g U=(       d    Sn[        R                  R                  5       nSUS'   UR	                  UR                  S0 5      5        [        R                  " [        R                  SS/UQU R                  R                   SU R                  R                   3P4UR                  SS	5      US
.UD6$ )N)z--no-headerz--disable-warningsz
--color=noz-vvv1r5  envz-mpytestrH   checkT)r=  r;  )r8  r_   environcopyrx   pop
subprocessrunsys
executablenodepathr   )requestcli_argssubprocess_kwargsr.   r;  s        r*   forward_to_subprocessrJ    s       D **//
C"%CJJ $$UB/0>>NN	
 		

 ||  !GLL$5$5#67	
  ##GT2  r,   r$   )T) )r   r   )r4   r   Nr   r   r   N)r   r   r   r   FF)returnz"subprocess.CompletedProcess | None)a__doc__
__future__r   r   r_   rA  rC  
contextlibr   	functoolsr   os.pathr   r   r   pathlibr	   tempfiler
   r   unittest.mockr   uuidr   r<  base.constantsr   base.contextr   r   	common.ior   r8   r   core.prefix_datar   core.subdir_datar   gateways.disk.deleter   gateways.disk.readr   historyr   models.channelr   models.recordsr   r   resolver   r>  rm   __file__r   CHANNEL_DIRCHANNEL_DIR_V1CHANNEL_DIR_V2r   r%   r+   r6   rA   rD   rF   rO   r[   rc   rt   r|   r   r   r   r   rK   r   r   r   r   r   r   r   r   r  r  r  r  r  r!  r$  r&  r(  r1  fixturer3  r8  rJ  r   r,   r*   <module>rf     s   : "  	  
 %  * *  (    ( A 6  ) ) ( (  $ 8  

74(94wPV#WX  'tM;N'OP Pnm-?@A'=>  Q 0 > >*
1
K 	 	0*Z""&* >>9z !E   E    E    U   #*>>4e P Ph "..$U  

2 O
d   *   *   *   *   *   *   *   *K 7 73'r,   