
    $TXg]Y                        d 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
 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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"m#Z# d
dl$m%Z% d
dl&m'Z' d
dl(m)Z) d
dl*m+Z+m,Z, d
dl-m.Z. ej^                  ja                  d e e
 e	e1      dddd                  Z2 e e
e2d            xZ3Z4 e e
e2d            Z5 ed      Z6dZ7d  Z8dEd!Z9edFd#       ZdGd$Z:dGd%Z;dGd&Z<d' Z=d( Z>ed)        Z?d* Z@d+ ZAd,e!fd-ZBd,e!fd.ZCdEd/ZDd0 ZEej                  d1d1fd2ZGej                  d"d1fd3ZHeej                  d"d1fd4       ZIeej                  d"d1fd5       ZJeej                  d1d1fd6       ZKeej                  d"d1fd7       ZLej                  d"d1fd8ZM	 	 	 	 	 	 	 dHd9ZN	 	 	 	 	 	 dId:ZOe	 	 	 	 	 	 dId;       ZPe	 	 	 	 	 	 dId<       ZQe	 	 	 	 	 	 dId=       ZRe	 	 	 	 	 	 dId>       ZSe	 	 	 	 	 	 dId?       ZTe	 	 	 	 	 	 dId@       ZUe	 	 	 	 	 	 dIdA       ZVe	 	 	 	 	 	 dIdB       ZWdC ZX ej                         dD        ZZy)Jz3Collection of helper functions used in conda tests.    N)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                 |    t         r5| j                  t               r | t        t               d  j                         } | S N)expected_error_prefix
startswithlenlstrip)stderrs    5lib/python3.12/site-packages/conda/testing/helpers.pystrip_expectedr*   *   s4    !2!23H!I1245<<>M    c                     	  |       }t        d|       # | $ r*}|r||j                   d   v sJ t        |       Y d }~yd }~ww xY w)Nr   Tzdid not raise, gave )argsprint	Exception)	exceptionfuncstringaes        r)   raisesr5   0   sX    F *1#.
//  QVVAY&&&a	s    A AATc              #   b  K   	 t               5 }| d d d        t        j                        |_        | r%|j                  rt        d|j                         y y # 1 sw Y   KxY w# t        j                        |_        | r%|j                  rt        d|j                         w w xY ww)NzGot stderr output: )common_io_capturedr*   r(   r/   )disallow_stderrcs     r)   r   r   ;   s     >!QG " "!((+qxx1!((<==  (?	 "! "!((+qxx1!((<==  (?s3   B/
A) AA) AB/A&"A) )AB,,B/c                     | j                         d|j                         dz   |z   }| j                         |j                         k(  sJ |       y )Nz != z

lowerr3   boutputs      r)   assert_equalsr@   G   sG    	}D.7&@F779	!)6)!r+   c                     | j                         |j                         vs+J | d| j                         d|j                                y )N z should not be found in r;   r=   s      r)   assert_not_inrC   L   sF    		"F
1779-7	}EF"r+   c                     | j                         |j                         v s+J | d| j                         d|j                                y )NrB   z cannot be found in r;   r=   s      r)   	assert_inrE   R   sF    		QWWYB
1779-3AGGI=ABr+   c                 |    | j                  d      \  }}|dz   t        j                  z   }dj                  ||g      S )Nz::/)splitr   subdirr   )dist_stringchannel_strpackage_strs      r)   
add_subdirrM   X   s>    *006K#gnn4K99k;/00r+   c                    t        | t              r-| j                         D ci c]  \  }}t        |      | c}}S t        | t              rt	        t        t        |             S t        | t              rt        t        t        |             S t        | t              rt        t        t        |             S t        d      c c}}w )Nz/Unable to add subdir to object of unknown type.)	
isinstancedictitemsrM   listmapsettupler/   )iterablekvs      r)   add_subdir_to_iterrY   ^   s    (D!-5^^-=>-=TQ
1q -=>>	Hd	#C
H-..	Hc	"3z8,--	He	$SX.//IJJ ?s   Cc               #      K   t               } t        t                     d d }t        | |      }	 t	        j
                  |       | t        |      rt        |       y y # t        |      rt        |       w w xY ww)N   )r	   strr   r   osmakedirsr   r   )
tempdirdirr   prefixs      r)   tempdirra   k   sg     J%'l2AG*g&F
F6?&M 76?&M s   -A=A! 	A=!A::A=c                 :   |d   }|j                  d      }|j                  d      }|j                  d      }|sdj                  |d   |d         }|j                  }|d   j                         D ]'  \  }	}
t	        j
                  |
|	||||||      }|| |<   ) y )NinfoarchplatformrI   z{}-{}packages)fnrd   re   channelrI   priorityauth)getformatrj   rQ   r   from_objects)indexrepodatarh   ri   repodata_inford   re   rI   rj   rg   rc   recs               r)   supplement_index_with_repodatarr   x   s    V$MV$D  ,Hx(Fj 9=;PQ<<DZ(..0D((
 c
 1r+   c                     t               }| j                         D ]*  }|j                  s|j                  |j                         , |D ]  }t	        j
                  |      }|| |<    y r#   )rT   valuestrack_featuresupdater   feature)rn   all_featuresrq   feature_names       r)   add_feature_records_legacyrz      s[    5L||~ 2 23  %##L1c
 %r+   subdir_datac           	         | j                   }| j                  j                  }i }i }| j                         D ]  }|j                  rd|j
                  d   _        |j                         }|dk(  rt        |dd      rd|d<   dx|d<   |d<   d|v r|d   |d	<   |d= |j                  j                  d
      r|||j                  <   |||j                  <    |d   |d   |d   |d   |d   d|i||d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noarchNrI   re   rd   featuresru   z.conda_cache_control_etag_mod_url_add_pip)r   r   r   r   r   rc   rf   zpackages.conda)_internal_staterh   rI   iter_recordsr~   
__fields___in_dumpdumpgetattrrg   endswith)r{   staterI   rf   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$%)N366"#HSVV) *,   01wff*%f
 ( r+   c                    t        t              | j                  j                  z  }|| j                  j                  z  }|j                  dd       t        |dz  d      5 }t        j                  t        |       |dd       |j                          t        j                  |j                                ddd       y# 1 sw Y   yxY w)r}   T)parentsexist_okrepodata.jsonwr   )indent	sort_keysN)r   EXPORTED_CHANNELS_DIRrh   namerI   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CC
c                     |<t        |       j                  d      df}t        j                  j	                  |      }|r:t        t
         d|        }|t        j                  |j                  d      df<   yy)r}   NTwith_credentialsr   rG   )r   urlr   _cache_rk   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                 R    t        | |       t        |       t        d      |_        y)r}   infN)r   r   float_mtime)r   r{   s     r)   _patch_for_local_exportsr      s$     9{K +&uKr+   Fc                    t        | t        t        j                  f      r8t	        t        t        |             5 }t        j                  |      }d d d        nt        | t              r| }nt        d      |i di i}|r||<   nNj                         D ];  \  }}	|	j                  d      dk(  s|	j                  d      r	|	|d   |<   4|	||   |<   = g }
g }|j                         D ]  \  }}|t        j                  t        j                  d|d}t!        d| d|       }|j#                  |       t%        |      }|
j#                  |       t'        dt        |      j)                         t*        	      5  |j-                  t        j.                  |             d d d        d
|_        |t$        j2                  |j5                  d
      t6        f<   t9        ||        i }|
D ]0  }|j;                  |j=                         D ci c]  }|| c}       2 t?        ||      }||fS # 1 sw Y   xY w# 1 sw Y   xY wc c}w )Nz1'json_filename_or_data' must be path-like or dictr   rI   )rI   rd   re   )rc   rf   zhttps://conda.anaconda.org/rG   "CONDA_ADD_PIP_AS_PYTHON_DEPENDENCYstack_callbackTr   )channels) rO   r\   r]   PathLiker   r   TEST_DATA_DIRr   loadrP   
ValueErrorrQ   rk   r   	arch_namere   r   appendr   r   r<   r   _process_raw_repodata_strdumps_loadedr   r   r   r   rv   r   r   )json_filename_or_packageschannel_namerI   add_pipmerge_noarchfiall_packagesrf   keyr   subdir_datasr   
subchannelsubchannel_pkgsro   rh   sdrn   precrs                       r)   _get_index_r_baser      s)    +c2;;-?@$}&?@AR99R=L BA	-t	40LMMHb)H'$**,HCwwx H,0A*-"3'(+ %	 - LH'/~~'7#
O %))#,,
 (
 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,9%H9
I
,H69I	c                 "    t        dd| ||      S Nz
index.json	channel-1rI   r   r   r   r   s      r)   get_index_r_1r   9      ! r+   c                 "    t        dd| ||      S )Nzindex2.json	channel-2r   r   r   s      r)   get_index_r_2r   C      ! r+   c                 "    t        dd| ||      S )Nzindex4.json	channel-4r   r   r   s      r)   get_index_r_4r   N  r   r+   c                 "    t        dd| ||      S )Nzindex5.json	channel-5r   r   r   s      r)   get_index_r_5r   Y  r   r+   c                     ddddgddddd	dddd
gddddddg ddddd	ddg ddddd	ddg ddddd	ddg ddddd	ddddgddddd	dddd
gddddd	d}t        |d| ||        y )!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   )rI   r   r   ro   s       r)   get_index_must_unfreezer   d  s    &75&!
 &75!
 5&!
 5&!
 5&!
 5&!
 &75&
 &75&
HHR !r+   c                 "    t        dd| ||      S r   r   r   s      r)   get_index_cudar     r   r+   c                 0    t        d| ||xs g ||||d|S )N)r   r   r   r   r   r~   rh    )r   )r   r   r   r   r   r~   rh   kwargss           r)   recordr     s9      	2!	 	 	r+   c           	   #   6  K   |j                   }t        |      }|D 	ci c]"  }	|	j                  t        j                  |	      $ c}	|_        |D 
ci c]  }
|
j                  |
 }}
| dk(  r;t        t        j                  ||       t        d       t        t         d      f}n)| dk(  r;t        t        j                  ||       t        d       t        t         d      f}n| dk(  r;t        t        j                  ||       t        d       t        t         d      f}n| dk(  r;t        t        j                  ||       t        d       t        t         d      f}ni| d	k(  rqt        t        j                  ||       t        t        j                  ||       t        d       t        d       t        t         d      t        t         d      f}n| d
k(  rqt        t        j                  ||       t        t        j                  ||       t        d       t        d       t        t         d      t        t         d      f}n}| dk(  r:t        t        j                  ||       t        d       t        t         d      f}n>| dk(  r9t!        t        j                  ||       t        d       t        t         d      f}|rt        j                  fnt        j                  df}t#        j$                  t&        d|      5  t)        dt+        |      j-                         t.              5  t        j0                  j3                         ||||       d d d        d d d        y c c}	w c c}
w # 1 sw Y   xY w# 1 sw Y   y xY ww)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   rm   _PrefixData__prefix_recordsr   r   rI   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   pdrq   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'M7NM<%J,N*N;+N&N.NN
	NNNc           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r
  r  r   r   r  r	  r  r  r
  r  r   r   s          r)   
get_solverr  +  2       !'%#!	 	 	   !!c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r)   get_solver_2r  A  r  r  c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r)   get_solver_4r  W  r  r  c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r)   get_solver_5r  m  r  r  c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r)   get_solver_aggregate_1r    2       !'%#!	 	 	r  c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r)   get_solver_aggregate_2r"    r   r  c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r)   get_solver_must_unfreezer$    s2       !'%#!	 	 	r  c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r)   get_solver_cudar&    s2       !'%#!	 	 	r  c                     g }| D ]m  }|j                   j                  }|j                   j                  |j                   _        |j                  |j	                                ||j                   _        o t        |      S r#   )rh   _Channel__canonical_namer   r   dist_strrU   )solutionr)  r   canonical_names       r)   convert_to_dist_strr,    sb    H >>040A0A-(0>-  ?r+   c                  >    t         j                  j                         S r#   )r   r  r  r   r+   r)   solver_classr.    s    !!4466r+   r#   )T) )r3   r   Nr   r   r   N)r   r   r   r   FF)[__doc__r   r]   
contextlibr   	functoolsr   os.pathr   r   r   pathlibr   tempfiler	   r
   unittest.mockr   uuidr   pytestbase.constantsr   base.contextr   r   	common.ior   r7   r   core.prefix_datar   core.subdir_datar   gateways.disk.deleter   gateways.disk.readr   historyr   models.channelr   models.recordsr   r   resolver   environrk   __file__r   CHANNEL_DIRCHANNEL_DIR_V1CHANNEL_DIR_V2r   r$   r*   r5   r@   rC   rE   rM   rY   ra   rr   rz   r   r   r   r   rI   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r"  r$  r&  r,  fixturer.  r   r+   r)   <module>rJ     s   :  	 %  * *  (    ( A 6  ) ) ( (  $ 8  

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