
    siWZ                       S r SSKJ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  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.J/r/  SSK0J1r1  \Rd                  Rg                  S\" \" \" \45      SSSS5      5      5      r5\" \" \5S5      5      =r6r7\" \" \5S5      5      r8\" SS9r9S r:S! r;SGS" jr<\SHS$ j5       rSIS% jr=SIS& jr>SIS' jr?S( r@S) rA\S* 5       rBS+ rCS, rDSJS- jrESJS. jrFSGS/ jrGS0 rH\R                  S1S14S2 jrJ\R                  S#S14S3 jrK\	\R                  S#S14S4 j5       rL\	\R                  S#S14S5 j5       rM\	\R                  S1S14S6 j5       rN\	\R                  S#S14S7 j5       rO\R                  S#S14S8 jrP       SKS9 jrQ      SLS: jrR\      SLS; j5       rS\      SLS< j5       rT\      SLS= j5       rU\      SLS> j5       rV\      SLS? j5       rW\      SLS@ j5       rX\      SLSA j5       rY\      SLSB j5       rZSC 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)context)captured)json)
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)   raisesr5   3   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(   r/   )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r3   boutputs      r)   assert_equalsr@   J   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_inrC   O   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 )NrB   z cannot be found in r;   r=   s      r)   	assert_inrE   U   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_subdirrN   [   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itemsrN   listmapsettupler/   )iterablekvs      r)   add_subdir_to_iterrZ   a   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)   tempdirrb   n   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platformrJ   z{}-{}packages)fnre   rf   channelrJ   priorityauth)getformatrk   rR   r   from_objects)indexrepodatari   rj   repodata_infore   rf   rJ   rk   rh   rd   recs               r)   supplement_index_with_repodatars   {   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#   )rU   valuestrack_featuresupdater   feature)ro   all_featuresrr   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noarchNrJ   rf   re   featuresrv   z.conda_cache_control_etag_mod_url_add_pip)r   r   r   r   r   rd   rg   zpackages.conda)_internal_stateri   rJ   iter_recordsr~   
__fields___in_dumpdumpgetattrrh   endswith)subdir_datastaterJ   rg   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_DIRri   namerJ   mkdiropenr   r   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   rH   )r   urlr   _cache_rl   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        [        R&                  " SU5         UR)                  [        R*                  " U5      5        S S S 5        S	Ul        U[$        R.                  UR1                  S	S
9[2        4'   [5        UU5        M     0 nU
 H4  nUR7                  UR9                  5        Vs0 s H  nUU_M     sn5        M6     [;        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   rJ   )rJ   re   rf   )rd   rg   zhttps://conda.anaconda.org/rH   add_pip_as_python_dependencyTr   )channels)rP   r]   r^   PathLiker   r   TEST_DATA_DIRr   loadrQ   
ValueErrorrR   rl   r   	arch_namerf   r   appendr   	_override_process_raw_repodata_strdumps_loadedr   r   r   r   rw   r   r   )json_filename_or_packageschannel_namerJ   add_pipmerge_noarchfiall_packagesrg   keyr   subdir_datasr   
subchannelsubchannel_pkgsrp   ri   sdro   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=wG((H)=> H 
PR
GKKK>LM r2) (8. ER__->?->TdDj->?@ )A!8O_ BAD HG @s   H0;&I
I
0
H?
I	c                    [        SSU UUS9$ Nz
index.json	channel-1rJ   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   D      ! r+   c                    [        SSU UUS9$ )Nzindex4.json	channel-4r   r   r   s      r)   get_index_r_4r   O  r   r+   c                    [        SSU UUS9$ )Nzindex5.json	channel-5r   r   r   s      r)   get_index_r_5r   Z  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   )rJ   r   r   rp   s       r)   get_index_must_unfreezer   e  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~   ri    )r   )r   r   r   r   r   r~   ri   kwargss           r)   recordr     s9      	2!	 	 	r+   c           
   #  .  #    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5         [$        R&                  " [(        SUS9   [        R*                  R-                  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   r   get_requested_specs_map)return_value)specs_to_addspecs_to_remove)strpathr   r   r   rn   _PrefixData__prefix_recordsr   r   rJ   r   r   r   r   r   r   r   r   r   r   objectr   plugin_managerget_solver_backend)
channel_idtmpdirr   r  prefix_recordshistory_specsr   r   pdrr   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			97	C\\'#<8T ((;;=) / 	 U 
D	Ce& ;` UT 
D	CsM   N*M)NM.*J*NN/)M3N N3
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  <  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  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  h  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   )rV   )solutions    r)   convert_to_dist_strr.    s    JJJJr+   c                 >    [         R                  R                  5       $ r#   )r   r  r  r   r+   r)   solver_classr0    s    !!4466r+   c                 @    [        [        R                  " S5      5      $ )N_RERUN_IN_SUBPROCESS)boolr^   getenvr   r+   r)   in_subprocessr5    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1r2  envz-mpytestrG   checkT)r:  r8  )r5  r^   environcopyrw   pop
subprocessrunsys
executablenodepathr   )requestcli_argssubprocess_kwargsr-   r8  s        r)   forward_to_subprocessrG    s       D **//
C"%CJJ $$UB/0>>NN	
 		

 ||  !GLL$5$5#67	
  ##GT2  r+   r#   )T) )r   r   )r3   r   Nr   r   r   N)r   r   r   r   FF)returnz"subprocess.CompletedProcess | None)`__doc__
__future__r   r^   r>  r@  
contextlibr   	functoolsr   os.pathr   r   r   pathlibr	   tempfiler
   r   unittest.mockr   uuidr   r9  base.constantsr   base.contextr   	common.ior   r7   common.serializer   core.prefix_datar   core.subdir_datar   gateways.disk.deleter   gateways.disk.readr   historyr   models.channelr   models.recordsr   r   resolver   r;  rl   __file__r   CHANNEL_DIRCHANNEL_DIR_V1CHANNEL_DIR_V2r   r$   r*   r5   r@   rC   rE   rN   rZ   rb   rs   r{   r   r   r   r   rJ   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r!  r#  r%  r.  fixturer0  r5  rG  r   r+   r)   <module>rd     s   : " 	  
 %  * *  (    ( " 6 # ) ) ( (  $ 8  

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