
    DIe`                        d Z ddl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
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 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-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ej?        @                    d e
 e eeA          dddd                              ZB e
 eeBd                     ZC ed!"          ZDd#ZEd$ ZFd[d%ZGed\d'            Z)	 d]d)ZH ed*d+d,-          ed.eId/dfd0                        ZJd^d2ZKd^d3ZLd^d4ZM ed5d*d6-          d\d7eNfd8            ZOd9 ZPd: ZQed;             ZRd< ZSd= ZTd>e.fd?ZUd>e.fd@ZVd[dAZWdB ZXe"jY        d(d(fdCZZe"jY        d&d(fdDZ[ edE          e"jY        d&d(fdF            Z\ edE          e"jY        d&d(fdG            Z] edE          e"jY        d(d(fdH            Z^ edE          e"jY        d&d(fdI            Z_e"jY        d&d(fdJZ`	 	 	 	 	 	 	 d_dNZa	 	 	 	 	 	 d`dPZbe	 	 	 	 	 	 d`dQ            Zce	 	 	 	 	 	 d`dR            Zde	 	 	 	 	 	 d`dS            Zee	 	 	 	 	 	 d`dT            Zfe	 	 	 	 	 	 d`dU            Zge	 	 	 	 	 	 d`dV            Zhe	 	 	 	 	 	 d`dW            Zie	 	 	 	 	 	 d`dX            ZjdY Zk ejl                    dZ             ZmdS )az3Collection of helper functions used in conda tests.    N)contextmanager)	lru_cache)abspathdirnamejoin)Path)
gettempdirmkdtemp)patch)uuid4)shlex_split_unicode)
deprecated)main   )cli)conda_tests_ctxt_mgmt_def_polcontextreset_context)encode_arguments)argvenv_var)captured)
PrefixData)
SubdirDatamake_feature_record)rm_rf)lexists)initialize_logging)History)Channel)PackageRecordPrefixRecord)ResolveCONDA_TEST_DATA_DIRz..testsdataconda_format_repoz-test-conda-channels)suffixz6Using Anaconda Cloud api site https://api.anaconda.orgc                     t           rH|                     t                     r.| t          t                     d                                          } | S N)expected_error_prefix
startswithlenlstrip)stderrs    5lib/python3.11/site-packages/conda/testing/helpers.pystrip_expectedr1   0   sJ     ?!2!23H!I!I ?122445<<>>M    c                     	  |            }n5# | $ r-}|r||j         d         v sJ t          |           Y d }~dS d }~ww xY wt          d|z            )Nr   Tzdid not raise, gave %s)argsprint	Exception)	exceptionfuncstringaes        r0   raisesr<   6   s    DFF    	'QVAY&&&&attttt	
 ,q0
1
11s   
 ?":?Tc              #   R  K   	 t                      5 }|V  d d d            n# 1 swxY w Y   t          |j                  |_        | r|j        rt          d|j        z            d S d S # t          |j                  |_        | r|j        rt          d|j        z            w xY w)NzGot stderr output: %s)common_io_capturedr1   r/   r6   )disallow_stderrcs     r0   r   r   A   s     @!! 	QGGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 "!(++ 	@qx 	@3ah>???	@ 	@ 	@ 	@ "!(++ 	@qx 	@3ah>???????s&   A+ #A+ 'A+ 'A+ +;B&Fc                 F   t          | |          \  }}}|                    d          r=t          j        d|t          j                  }|r|                                d         }n|r|s|S 	 t          j        |                                          S # t          $ r  w xY w)Nrelaxedz\A.*?({.*})r   )
run_inprocess_conda_commandgetrematchDOTALLgroupsjsonloadsstrip
ValueError)commandr?   ignore_stderrkwargsstdoutr/   	exit_coderF   s           r0   capture_json_with_argvrR   M   s     !<G_ U UFFIzz) ;; 	'\\^^A&F	  z&,,..)))   s   .%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 V  |t           j        d<   d S # |t           j        d<   w xY w)NCONDA_PREFIX)osenviron)rT   
old_prefixs     r0   set_active_prefixr[   ^   sX       N+J0%+
>"%/
>"""Z
>"////s	   : A c                     |                                  d|                                 dz   |z   }|                                  |                                 k    s
J |            d S )Nz != z

)lowerr:   boutputs      r0   assert_equalsrb   n   s^    		....7&@F7799		!!!6!!!!!r2   c                     |                                  |                                 vsCJ d                    ||                                  |                                                       d S )Nz#{} {!r} should not be found in {!r}r^   formatr_   s      r0   assert_not_inrf   s   s[    7799AGGII%%%'L'S'S						( (%%%%%r2   c                     |                                  |                                 v sCJ d                    ||                                  |                                                       d S )Nz{} {!r} cannot be found in {!r}rd   r_   s      r0   	assert_inrh   {   sY    7799		!!!#D#K#K		17799$ $!!!!!r2   z23.9z&Use `conda.testing.conda_cli` instead.r?   c                 R   t          d           |                     d          r#|                     dd          } t          j        }nt
          j        }t          t          t          |                               5  t          |          5 }t                       	  |            }n# t          $ r Y nw xY wd d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          |j        t          j                   t          |j                   |j        |j        |fS )N z	conda envenvr\   )file)r   r,   replaceconda_env_clir   r   r   r   r   r   r   
SystemExitr5   r/   sysrP   )rM   r?   	main_funcr@   rQ   s        r0   rC   rC      s    " +&& //%,,!&		H	 
27;;<<	=	=  x@ @ 	
	!	II 	 	 	D	                              
!($$$$	!(OOO8QXy((sZ   =CC
B('C(
B52C4B55C8CC	CC	CC"Cc                     |                      d          \  }}|dz   t          j        z   }d                    ||g          S )Nz::/)splitr   subdirr   )dist_stringchannel_strpackage_strs      r0   
add_subdirry      sB    *0066K#gn4K99k;/000r2   c                    t          | t                    rd |                                 D             S t          | t                    r"t          t	          t
          |                     S t          | t                    r"t          t	          t
          |                     S t          | t                    r"t          t	          t
          |                     S t          d          )Nc                 4    i | ]\  }}t          |          |S rj   )ry   ).0kvs      r0   
<dictcomp>z&add_subdir_to_iter.<locals>.<dictcomp>   s$    >>>TQ
1q>>>r2   z/Unable to add subdir to object of unknown type.)	
isinstancedictitemslistmapry   settupler6   )iterables    r0   add_subdir_to_iterr      s    (D!! 	K>>X^^-=-=>>>>	Hd	#	# KC
H--...	Hc	"	" K3z8,,---	He	$	$ KSX..///IJJJr2   c               #   F  K   t                      } t          t                                d d         }t          | |          }	 t	          j        |           |V  t          |          rt          |           d S d S # t          |          rt          |           w w xY w)N   )r	   strr   r   rX   makedirsr   r   )
tempdirdirr   rT   s      r0   tempdirr      s      J%''ll2A2G*g&&F
F6?? 	&MMMMM	 	76?? 	&MMMM	s   A? ?!B c                 l   |d         }|                     d          }|                     d          }|                     d          }|s"d                    |d         |d                   }|j        }|d                                         D ]&\  }	}
t	          j        |
|	||||||          }|| |<   'd S )Ninfoarchplatformru   z{}-{}packages)fnr   r   channelru   priorityauth)rD   re   r   r   r!   from_objects)indexrepodatar   r   repodata_infor   r   ru   r   r   r   recs               r0   supplement_index_with_repodatar      s    V$MV$$D  ,,Hx((F Rj 9=;PQQ<DZ(..00  D(
 
 
 c

 r2   c                     t                      }|                                 D ]#}|j        r|                    |j                   $|D ]}t	          |          }|| |<   d S r*   )r   valuestrack_featuresupdater   )r   all_featuresr   feature_names       r0   add_feature_records_legacyr      sv    55L||~~ 4 4 	4 2333$  !,//c

 r2   subdir_datac                 |   | j         }| j        j        }i }|                                 D ]i}|                                }|dk    r t          |dd          rd|d<   dx|d<   |d<   |j        r
|j        |d<   d|v r|d         |d<   |d= |||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.
    noarchNru   r   r   	timestampfeaturesr   _cache_control_etag_mod_url_add_pip)r   r   r   r   r   r   r   )_internal_stater   ru   iter_recordsdumpgetattrr   r   )r   stateru   r   pkgr&   s         r0   _export_subdir_data_to_repodatar      s
    'E 'FH''))    xxzzX'#x">">%DN.22DtF|= 	. #D &**%5D!"Z  01wff*%f
 
 
 
r2   c                    t          t                    | j        j        z  }|| j        j        z  }|                    dd           t          |dz  d          5 }t          j        t          |           |d           |
                                 t          j        |                                           ddd           dS # 1 swxY w Y   dS )r   T)parentsexist_okrepodata.jsonwr   )indentN)r   EXPORTED_CHANNELS_DIRr   nameru   mkdiropenrI   r   r   flushrX   fsyncfileno)r   basesubdir_pathfs       r0   _sync_channel_to_diskr     s    %&&)<)AAD,33KdT222	kO+S	1	1 Q	1+>>!LLLL				
                 s   ACCCc                    |Dt          |                               d          df}t          j                            |          }|r@t          t
           d|            }|t          j        |                    d          df<   dS dS )r   NTwith_credentialsr   rs   )r    urlr   _cache_rD   r   )r   r   	cache_keylocal_proxy_channels       r0   4_alias_canonical_channel_name_cache_to_file_prefixedr     s     DMM%%t%<<oM	 (,,Y77 %)>&G&G&G&GHH  	 $$d$;;_M	
 	
 	
 r2   c                 l    t          | |           t          |           t          d          |_        dS )r   infN)r   r   float_mtime)r   r   s     r0   _patch_for_local_exportsr   $  s8     9{KKK +&&&uKr2   c                    t          | t          t          j        f          rOt	          t          t          |                     5 }t          j        |          }d d d            n# 1 swxY w Y   n't          | t                    r| }nt          d          |r||i}ne|i di i}|                                D ]J\  }}	|	                    d          dk    s|	                    d          r|	|d         |<   ?|	||         |<   Kg }
g }|                                D ] \  }}|t          j        t          j        d|d}t!          d| d|           }|                    |           t%          |          }|
                    |           t'          dt          |                                          t*          	          5  |                    t          j        |                     d d d            n# 1 swxY w Y   d
|_        |t$          j        |                    d
          <   t7          ||           "i }|
D ]3}|                    d |                                D                        4t=          ||          }||fS )Nz1'json_filename_or_data' must be path-like or dictr   ru   )ru   r   r   )r   r   zhttps://conda.anaconda.org/rs   "CONDA_ADD_PIP_AS_PYTHON_DEPENDENCYstack_callbackTr   c                     i | ]}||S rj   rj   )r|   precs     r0   r   z%_get_index_r_base.<locals>.<dictcomp>l  s    ???TdD???r2   )channels)r   r   rX   PathLiker   r   TEST_DATA_DIRrI   loadr   rL   r   rD   r   	arch_namer   r    appendr   r   r^   r   _process_raw_repodata_strdumps_loadedr   r   r   r   r   r#   )json_filename_or_packageschannel_nameru   add_pipmerge_noarchfiall_packagesr   keyr   subdir_datasr   
subchannelsubchannel_pkgsr   r   sdr   rs                      r0   _get_index_r_baser   6  s3    +c2;-?@@ N$}&?@@AA 	)R9R==L	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)	-t	4	4 N0LMMM ,L)B"-$**,, 	, 	,HCwwx  H,,0A0A,*-"3''(+ %%LH'/~~'7'7 3 3#
O %)#, 
 (
 
 SSSzSSTT     B0LL  8
 
 
 	? 	?
 ((H)=)=>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 
AC
7;;;==> r2222 E A A??R__->->???@@@@)))A!8Os$   A%%A),A)(G77G;	>G;	c                 *    t          dd| ||          S Nz
index.json	channel-1ru   r   r   r   r   s      r0   get_index_r_1r   s  (    !   r2   )maxsizec                 *    t          dd| ||          S )Nzindex2.json	channel-2r   r   r   s      r0   get_index_r_2r   }  (    !   r2   c                 *    t          dd| ||          S )Nzindex4.json	channel-4r   r   r   s      r0   get_index_r_4r     r   r2   c                 *    t          dd| ||          S )Nzindex5.json	channel-5r   r   r   s      r0   get_index_r_5r    r   r2   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| ||            d S )!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   )ru   r   r   r   s       r0   get_index_must_unfreezer    s]    &75&!
 !
 &75!
 !
 5&!
 !
 5&!
 !
 5&!
 !
 5&!
 !
 &75&
 
 &75&
 
H HHR !     r2   c                 *    t          dd| ||          S r   r   r   s      r0   get_index_cudar    r   r2   r:   r  r  c                 .    t          d| ||pg ||||d|S )N)r   r  r
  r  r	  r   r   rj   )r!   )r   r  r
  r  r	  r   r   rO   s           r0   recordr    sC      	2!	 	 	 	 	r2   rj   c           	   #     K   |j         }t          |          }d |D             |_        d |D             }	| dk    rDt          t          j        ||           t          d           t          t           d          f}
n| dk    rDt          t          j        ||           t          d           t          t           d          f}
n8| dk    rDt          t          j        ||           t          d           t          t           d          f}
n| d	k    rDt          t          j        ||           t          d	           t          t           d
          f}
n| dk    rt          t          j        ||           t          t          j        ||           t          d           t          d           t          t           d          t          t           d          f}
n| dk    rt          t          j        ||           t          t          j        ||           t          d           t          d           t          t           d          t          t           d          f}
n| dk    rCt          t          j        ||           t          d           t          t           d          f}
nH| dk    rBt          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%          |                                          t(                    5  t	          j                                        ||
|||          V  d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nc                 B    i | ]}|j         t          j        |          S rj   )r   r"   r   )r|   r   s     r0   r   z$_get_solver_base.<locals>.<dictcomp>  s4     & & &58,+C00& & &r2   c                     i | ]
}|j         |S rj   )r   )r|   specs     r0   r   z$_get_solver_base.<locals>.<dictcomp>"  s    :::D	4:::r2   r   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   _PrefixData__prefix_recordsr   r   ru   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   pdspec_mapr   subdirss               r0   _get_solver_baser5    su      ^F	F		B& &<J& & &B" ;:M:::H[  gng|<<<<[III4@@@AAC	{	"	"gng|<<<<[III4@@@AAC	{	"	"gng|<<<<[III4@@@AAC	{	"	"gng|<<<<[III4@@@AAC	}	$	$gng|<<<gng|<<<<[III<[III,88899,88899
 
}	$	$gng|<<<gng|<<<<[III<[III ,88899,88899
 
	&	&FFF<=MNNN4EEEFFH	v		w~w===<[III4@@@AAC#/Ow~gnh5OG	*
 
 
 
 
,G4  
 
 $7799%+
 
 
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s6   ;7O2.N, O,N0	0O3N0	4OOOc           
   #   D   K   t          d| ||||||          E d {V  d S )Nr   r'  r(  r0  r1  r   r   r5  r/  r'  r(  r0  r1  r   r   s          r0   
get_solverr:  d  _        !'%#!	 	 	 	 	 	 	 	 	 	 	 	r2   c           
   #   D   K   t          d| ||||||          E d {V  d S )Nr   r7  r8  r9  s          r0   get_solver_2r=  z  r;  r2   c           
   #   D   K   t          d| ||||||          E d {V  d S )Nr   r7  r8  r9  s          r0   get_solver_4r?    r;  r2   c           
   #   D   K   t          d| ||||||          E d {V  d S )Nr  r7  r8  r9  s          r0   get_solver_5rA    r;  r2   c           
   #   D   K   t          d| ||||||          E d {V  d S )Nr!  r7  r8  r9  s          r0   get_solver_aggregate_1rC    _        !'%#!	 	 	 	 	 	 	 	 	 	 	 	r2   c           
   #   D   K   t          d| ||||||          E d {V  d S )Nr"  r7  r8  r9  s          r0   get_solver_aggregate_2rF    rD  r2   c           
   #   D   K   t          d| ||||||          E d {V  d S )Nr#  r7  r8  r9  s          r0   get_solver_must_unfreezerH    s_        !'%#!	 	 	 	 	 	 	 	 	 	 	 	r2   c           
   #   D   K   t          d| ||||||          E d {V  d S )Nr$  r7  r8  r9  s          r0   get_solver_cudarJ    s_        !'%#!	 	 	 	 	 	 	 	 	 	 	 	r2   c                     g }| D ]W}|j         j        }|j         j        |j         _        |                    |                                           ||j         _        Xt          |          S r*   )r   _Channel__canonical_namer   r   dist_strr   )solutionrM  r   canonical_names       r0   convert_to_dist_strrP    sd    H ? ? >040A-(((0>--??r2   c                  >    t           j                                        S r*   )r   r,  r-  rj   r2   r0   solver_classrR     s    !44666r2   r*   )T)TF)r\   )r:   r  Nr  r   r   N)rj   rj   rj   rj   FF)n__doc__rI   rX   rE   rp   
contextlibr   	functoolsr   os.pathr   r   r   pathlibr   tempfiler	   r
   unittest.mockr   uuidr   pytestconda.auxlib.compatr   conda.deprecationsr   conda_env.clir   rn   r\   r   base.contextr   r   r   common.compatr   	common.ior   r   r   r>   core.prefix_datar   core.subdir_datar   r   gateways.disk.deleter   gateways.disk.readr   gateways.loggingr   historyr   models.channelr    models.recordsr!   r"   resolver#   rY   rD   __file__r   CHANNEL_DIRr   r+   r1   r<   rR   r   r[   rb   rf   rh   boolrC   ry   r   r   r   r   r   r   r   r   ru   r   r   r   r   r  r  r  r  r5  r:  r=  r?  rA  rC  rF  rH  rJ  rP  fixturerR  rj   r2   r0   <module>ro     s   : 9  				 				 



 % % % % % %       * * * * * * * * * *       ( ( ( ( ( ( ( (              3 3 3 3 3 3 ) ) ) ) ) ) / / / / / /       P P P P P P P P P P , , , , , , % % % % % % % % 6 6 6 6 6 6 ) ) ) ) ) ) > > > > > > > > ( ( ( ( ( ( ( ( ( ( ( ( 1 1 1 1 1 1       $ $ $ $ $ $ 8 8 8 8 8 8 8 8       
7744(9(94wPV#W#WXX  gdd=*=>>??'=>>>  Q   2 2 2 2 @ @ @ @ 27   " 

V  
 0c 0d 0 0 0  0* * * *
       FF%MNNN) )$ ) ) ) ON)21 1 1
K 
K 
K 	 	 	  0  # # # # #Lz       "& & &* >9 9 9 9z !E     4 E     4 E     4 U     4#*>4e P P P Ph ".$U     

   2 N
 N
 N
 N
b     *     *     *     *     *     *     *     *	 	 	 7 7 7 7 7r2   