
    wBf[                     .   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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" 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`                  jc                  d e e
 e	e2      dddd                  Z3 e e
e3d            xZ4Z5 e e
e3d            Z6 ed      Z7dZ8d  Z9dMd!Z:edNd#       Z e"d$d%d&'      ed(e;d)dfd*              Z<dOd+Z=dOd,Z>dOd-Z?d. Z@d/ ZAed0        ZBd1 ZCd2 ZDd3efd4ZEd3efd5ZFdMd6ZGd7 ZHej                  d8d8fd9ZJej                  d"d8fd:ZK ed;      ej                  d"d8fd<       ZL ed;      ej                  d"d8fd=       ZM ed;      ej                  d8d8fd>       ZN ed;      ej                  d"d8fd?       ZOej                  d"d8fd@ZP	 	 	 	 	 	 	 dPdAZQ	 	 	 	 	 	 dQdBZRe	 	 	 	 	 	 dQdC       ZSe	 	 	 	 	 	 dQdD       ZTe	 	 	 	 	 	 dQdE       ZUe	 	 	 	 	 	 dQdF       ZVe	 	 	 	 	 	 dQdG       ZWe	 	 	 	 	 	 dQdH       ZXe	 	 	 	 	 	 dQdI       ZYe	 	 	 	 	 	 dQdJ       ZZdK Z[ ej                         dL        Z]y)Rz3Collection of helper functions used in conda tests.    N)contextmanager)	lru_cache)abspathdirnamejoin)Path)
gettempdirmkdtemp)patch)uuid4   )conda_tests_ctxt_mgmt_def_polcontext)captured)env_var)
PrefixData)
SubdirDatamake_feature_record)
deprecated)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|z        # | $ r*}|r||j                   d   v sJ t        |       Y d }~yd }~ww xY w)Nr   Tzdid not raise, gave %s)argsprint	Exception)	exceptionfuncstringaes        r*   raisesr6   0   sV    F ,q0
11  QVVAY&&&a	s    A AATc              #   b  K   	 t               5 }| d d d        t        j                        |_        | r%|j                  rt        d|j                  z        y y # 1 sw Y   KxY w# t        j                        |_        | r%|j                  rt        d|j                  z        w w xY ww)NzGot stderr output: %s)common_io_capturedr+   r)   r0   )disallow_stderrcs     r*   r   r   ;   s     @! 	QG	 "!((+qxx3ahh>??  (?		 	 "!((+qxx3ahh>??  (?s3   B/
A) AA) AB/A&"A) )AB,,B/z24.3z24.9zGUse `mocker.patch('conda.base.context.Context.active_prefix')` instead.)addendumprefixreturnc              #      K   t         j                  d   }	 | t         j                  d<   d  |t         j                  d<   y # |t         j                  d<   w xY ww)NCONDA_PREFIX)osenviron)r<   
old_prefixs     r*   set_active_prefixrC   G   sH      N+J0%+

>"%/

>"Z

>"s   AA AAAc                     | j                         d|j                         dz   |z   }| j                         |j                         k(  sJ |       y )Nz != z

lowerr4   boutputs      r*   assert_equalsrJ   W   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 rE   rG   s      r*   assert_not_inrM   \   sF    		"F
1779-7	}EF"r,   c                     | j                         |j                         v s+J | d| j                         d|j                                y )NrL   z cannot be found in rE   rG   s      r*   	assert_inrO   b   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_subdirrW   h   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itemsrW   listmapsettupler0   )iterablekvs      r*   add_subdir_to_iterrc   n   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   r@   makedirsr   r   )
tempdirdirr   r<   s      r*   tempdirri   {   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platformrS   z{}-{}packages)fnrl   rm   channelrS   priorityauth)getformatrr   r[   r   from_objects)indexrepodatarp   rq   repodata_inforl   rm   rS   rr   ro   rk   recs               r*   supplement_index_with_repodatarz      s    V$MV$D  ,Hx(Fj 9=;PQ<<DZ(..0 D((
 c
r,   c                     t               }| j                         D ]*  }|j                  s|j                  |j                         , |D ]  }t	        |      }|| |<    y r$   )r^   valuestrack_featuresupdater   )rv   all_featuresry   feature_names       r*   add_feature_records_legacyr      s_    5L||~ 4 2 234 % !,/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noarchNrS   rm   rl   featuresr}   z.conda_cache_control_etag_mod_url_add_pip)r   r   r   r   r   rk   rn   zpackages.conda)_internal_staterp   rS   iter_recordsr   
__fields___in_dumpdumpgetattrro   endswith)r   staterS   rn   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_DIRrp   namerS   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	1 Q		+K8!AQU	
 	
	
  s   "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   rQ   )r   urlr   _cache_rs   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      |r|i}nT|i di i}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
      <   t7        ||        i }|
D ]0  }|j9                  |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   rS   )rS   rl   rm   )rk   rn   zhttps://conda.anaconda.org/rQ   "CONDA_ADD_PIP_AS_PYTHON_DEPENDENCYstack_callbackTr   )channels)rY   rf   r@   PathLiker   r   TEST_DATA_DIRr   loadrZ   
ValueErrorr[   rs   r   	arch_namerm   r   appendr   r   rF   r   _process_raw_repodata_strdumps_loadedr   r   r   r~   r   r   )json_filename_or_packageschannel_namerS   add_pipmerge_noarchfiall_packagesrn   keyr   subdir_datasr   
subchannelsubchannel_pkgsrw   rp   sdrv   precrs                       r*   _get_index_r_baser     s;    +c2;;-?@$}&?@A 	)R99R=L	) 	)	-t	40LMML)B"-$**, 	,HCwwx H,0A*-"3'(+ %		, LH'/~~'7 3#
O %))#,,
 (
 7~QzlST  B0L 8
 	?
 ((H)=>	? 
AC
7;;;=> r2-32 E AR__->?TdDj?@A)A!8Oc	) 	)B	? 	? @s   H%8%H2
H>
%H/2H;	c                 "    t        dd| ||      S Nz
index.json	channel-1rS   r   r   r   r   s      r*   get_index_r_1r   I      ! r,   )maxsizec                 "    t        dd| ||      S )Nzindex2.json	channel-2r   r   r   s      r*   get_index_r_2r   S      ! r,   c                 "    t        dd| ||      S )Nzindex4.json	channel-4r   r   r   s      r*   get_index_r_4r   ^  r   r,   c                 "    t        dd| ||      S )Nzindex5.json	channel-5r   r   r   s      r*   get_index_r_5r   i  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   )rS   r   r   rw   s       r*   get_index_must_unfreezer   t  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   rp    )r   )r   r   r   r   r   r   rp   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   ru   _PrefixData__prefix_recordsr   r   rS   r   r   r   r   r   r   r   r   r   objectr   r   rf   rF   r   plugin_managerget_solver_backend)
channel_idtmpdirr	  r
  prefix_recordshistory_specsr   r   pdry   specspec_mapr   subdirss                 r*   _get_solver_baser    s#     ^^F	F	B<J&58,++C00&B" -::D		4:H:[ 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	*
 
,G4
 $$779%+
 	

 
 
e& ;^
 
 
 
sM   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!  P  r  r  c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r*   get_solver_4r#  f  r  r  c           
   #   F   K   t        d| ||||||      E d {    y 7 w)Nr   r  r  r  s          r*   get_solver_5r%  |  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$   )rp   _Channel__canonical_namer   r   dist_strr_   )solutionr1  r   canonical_names       r*   convert_to_dist_strr4    sg    H ? >>040A0A-(0>-? ?r,   c                  >    t         j                  j                         S r$   )r   r  r  r   r,   r*   solver_classr6    s    !!4466r,   r$   )T) )r4   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.contextr   r   	common.ior   r8   r   core.prefix_datar   core.subdir_datar   r   deprecationsr   gateways.disk.deleter   gateways.disk.readr   historyr   models.channelr   models.recordsr   r   resolver   rA   rs   __file__r   CHANNEL_DIRCHANNEL_DIR_V1CHANNEL_DIR_V2r   r%   r+   r6   rf   rC   rJ   rM   rO   rW   rc   ri   rz   r   r   r   r   r   rS   r   r   r   r   r   r   r   r  r  r  r!  r#  r%  r'  r*  r,  r.  r4  fixturer6  r   r,   r*   <module>rQ     s   :  	 %  * *  (    A 6  ) > % ( (  $ 8  

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