
    siT                       S r SSKJr  SSKrSSKJr  SSKJrJrJ	r	J
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  SSK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"J#r#  SSK$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3  SSK4J5r5J6r6  SSK7J8r8  SSK9J:r:J;r;J<r<  SSK=J>r>  SSK?J@r@  SSKAJBrB  SSKCJDrD  SSKEJFrFJGrG  SSKHJIrI  SSKIJJrJ  SSKKJLrL  \" \M5      rN\" S5      rOS:S  jrP\#" S!S"S#S$9S;S% j5       rQ\#" S!S"S&S$9S<S=S' jj5       rR\#" S!S"S(S$9S<S>S) jj5       rSS?S* jrT\#" S!S"S+S$9S, 5       rUS<S- jrVS@S. jrW " S/ S05      rX " S1 S25      rYSASBS3 jjrZSCS4 jr[SAS5 jr\S6 r]S7 r^SDSES8 jjr_S<S9 jr`g)FzConda package installation logic.

Core logic for `conda [create|install|update|remove]` commands.

See conda.cli.main_create, conda.cli.main_install, conda.cli.main_update, and
conda.cli.main_remove for the entry points into this module.
    )annotationsN)	getLogger)abspathbasenameexistsisdir)Path)
IndexedSet   )REPODATA_FNRESERVED_ENV_NAMESUpdateModifier)context)DEFAULT_CONDARC_FILENAME)NULL)Index)PrefixSetupUnlinkLinkTransaction)
PrefixData)diff_for_unlink_link_precs)
deprecated)CondaEnvExceptionCondaExitZeroCondaImportErrorCondaIndexErrorCondaSystemExitCondaUpdatePackageErrorCondaValueError"DirectoryNotACondaEnvironmentError
DryRunExitNoBaseEnvironmentErrorPackageNotInstalledErrorPackagesNotFoundErrorResolvePackageNotFoundSpecsConfigurationConflictErrorUnsatisfiableError)delete_trashpath_is_clean)History)_get_best_prec_match	clone_envinstall_explicit_packages)all_channel_urls)Environment)	MatchSpec)PrefixGraph)
confirm_ynget_spinner   )common)check_non_admin)set_keyszconda.stderrc                   Xl         UR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  S	S5      U l        UR                  S
S5      U l	        UR                  SS5      U l
        UR                  SS5      U l        [        U S5      $ )a!  Reinstall packages using conda install.

Helper for health fixes that need to reinstall packages.

:param args: Parsed arguments namespace
:param specs: Package specs to reinstall
:param kwargs: Override default install options (e.g., force_reinstall=True)
:return: Exit code from install
channelNoverride_channelsFforce_reinstallsatisfied_skip_solveupdate_deps	only_depsno_depsprunefreeze_installedsolver_retriesr   )packagesgetr8   r9   r:   r;   r<   r=   r>   r?   r@   rA   install)argsspecskwargss      1lib/python3.13/site-packages/conda/cli/install.pyreinstall_packagesrI   F   s     M::i.DL#ZZ(;UCD!::&7?D &

+A5 IDzz-7DZZU3DN::i/DLGU+DJ"JJ'95AD **%5q9D4    25.926.3zUse PrefixData.exists())addendumc                Z    [        U 5      n U R                  5       (       d  [        S5      eg)zQ
Validate that we are receiving at least one valid value for --name or --prefix.
z2The environment you have specified does not exist.N)r	   r   r   prefixs    rH   validate_prefix_existsrQ   _   s)    
 &\F==?? TUU rJ   z4Use PrefixData.exists() + PrefixData.validate_path()c                V   SSK JnJn  SSKJn  [
        R                  U ;   a	  U" U 5      n OU" XSS9n U(       do  [
        R                  R                  U 5      (       aK  [
        R                  R                  [
        R                  R                  U 5      5      n[        SU S35      eU $ )z*Ensure that the new prefix does not exist.r   )r   validate_prefix_name)expandF)ctx
allow_basezThe environment 'z&' already exists. Override with --yes.)base.contextr   rS   common.pathrT   osseppathr   r   normpathr   )destforcer   rS   rT   env_names         rH   validate_new_prefixr`   i   s    
 =$	vv~d|#D%HRWW^^D))77##BGG$4$4T$:;z)OP
 	
 KrJ   zOUse PrefixData.exists(), PrefixData.validate_path(), PrefixData.validate_name()c                   [         R                  U ;   a  [        S[         R                   S35      e[        U 5      nS nU[        ;   a  SU S3n[        U 5      (       a@  [        U 5      (       a+  S[        S [         R                  " U 5       5       5      ;  a  g SU  3nU(       a  [        X15      eSU ;   a  [        R                  S	U  S
35        g g )Nz(Cannot create a conda environment with 'z' in the prefix. Aborting.'z ' is a reserved environment namez
conda-metac              3  8   #    U  H  oR                   v   M     g 7fN)name).0entrys     rH   	<genexpr>check_prefix.<locals>.<genexpr>   s      7
$65JJ$6s   zprefix already exists:  zCWARNING: A space was detected in your requested environment path:
'z'
Spaces in paths can sometimes be problematic. To minimize issues,
make sure you activate your environment before running any executables!
)rY   pathsepr   r   r   r   r   tuplescandir	stderrlogwarning)rP   jsonre   errors       rH   check_prefixrr      s     
zzV6rzzlB\]
 	
 FDE!!D69:f~~==\ 7
$&JJv$67
 2
 
 )&2e**
f}x XX	
 rJ   c                   [         R                  U ;   a  [        [        U 5      5      nO[        R                  " U 5      nUR                  5         [        UR                  5      nU(       d  [        SU 35        [        SU 35        [        XaU(       + X4S9u  pxU(       a!  [        R                  " U[        U5      UUS9  g g )NzSource:      zDestination: )verbosequiet
index_args)actionsuntracked_files
src_prefix
dst_prefix)rY   rZ   r   r   	from_nameassert_environmentstrprefix_pathprintr+   r4   stdout_json_successlist)	src_argrz   rp   ru   rv   source_prefix_datary   rw   rx   s	            rH   cloner      s    	vv'(89'11':))+'334Jj\*+j\*+(D G "" 1!!		
 rJ   z%Use conda.cli.common.print_activate()c                     SSK Jn  U" U 5        g )Nr3   )print_activate)r4   r   )env_name_or_prefix_print_activates     rH   r   r      s    9&'rJ   c                V     [        U 5      $ ! [         a    [        SU  S3U5      ef = f)Nz expected revision number, not: 'rb   )int
ValueErrorr   )argrp   s     rH   get_revisionr      s9    O3x O @QGNNOs   
 (c                \    [         R                  U R                  (       + U R                  S.$ )z}Returns a dict of args required for fetching an index
:param args: The args provided by the cli
:returns: dict of index args
)channel_urlsprepend	use_local)r   channelsr9   r   rE   s    rH   get_index_argsr      s,      (( ---^^ rJ   c                  &    \ rS rSrS rS rS rSrg)TryRepodata   c                @    Xl         X l        X0l        X@l        XPl        g rd   )notify_successrepodatalast_repodatarv   allowed_errors)selfr   r   r   rv   r   s         rH   __init__TryRepodata.__init__   s      - *$,rJ   c                    U R                   $ rd   )r   r   s    rH   	__enter__TryRepodata.__enter__   s    }}rJ   c                D   U(       d  U R                  5         [        X R                  5      (       a-  U R                  U R                  :w  a  [        USS5      (       a  g[        U[        5      (       a-  [        UR                  [        [        R                  5      5      eg )Nallow_retryT)r   
isinstancer   r   r   getattrr$   r#   _formatted_chainsr-   r   r   )r   exc_type	exc_value	tracebacks       rH   __exit__TryRepodata.__exit__   s    !$ y"5"566$"4"44	=$77	#9::'++ !1!12  ;rJ   )r   rv   r   r   r   N)__name__
__module____qualname____firstlineno__r   r   r   __static_attributes__ rJ   rH   r   r      s    -rJ   r   c                  *    \ rS rSrSS jrS rS rSrg)	Repodatasi  c                R    Xl         X l        SU l        [        [        /UQ7U l        g )NF)repodata_fnsrv   successr$   r#   r   )r   r   rv   allows_errorss       rH   r   Repodatas.__init__  s.    ($"!
 
rJ   c              #     #    U R                    HR  n[        U R                  UU R                   S   U R                  U R                  5      v   U R
                  (       d  MR    g    g 7f)N)r   r   succeedrv   r   r   )r   r   s     rH   __iter__Repodatas.__iter__  sX     ))H!!"%##  ||| *s   AA&!A&c                    SU l         g )NT)r   r   s    rH   r   Repodatas.succeed  s	    rJ   )r   rv   r   r   N)r   )r   r   r   r   r   r   r   r   r   rJ   rH   r   r     s    

rJ   r   c                   [         R                  " 5         [        5         [        U 5      n[         R                  (       a   UR                  5       (       a  [        S5      eUS;   a8   UR                  5         [         R                  (       a  UR                  5         ggg! [         aN  nU[        [         R                  5      :X  a  [        5       Ue[        U 5        [        U 5      (       d  e  SnAN{SnAff = f)a  Executes a set of validations that are required before any installation
command is executed. This includes:
  * ensure the configuration is valid
  * ensuring the user in not an admin
  * ensure the user is not forcing 32bit installs in the root prefix

:param prefix: The prefix where the environment will be created
:param command: Type of operation being performed
:raises: error if the configuration for the install is bad
z*cannot use CONDA_FORCE_32BIT=1 in base env)rD   updateremoveN)r   validate_configurationr5   r   force_32bitis_baser   assert_writabler   conda_prefixr!   r'   r(   protect_frozen_envsassert_not_frozen)rP   commandprefix_dataexcs       rH   validate_install_commandr   !  s     ""$V$K{2244JKK11	'') &&))+ ' 2 2 	j)=)=>>,.C7  (( )		s   'B 
C7)AC22C7c                    [        U 5      nU H`  n[        U5      nUR                  (       d  [        U5      eUR	                  UR
                  S5      (       a  MM  [        XR
                  5      e   g)a5  Checks that each spec that is requested as an update exists in the prefix

:param prefix: The target install prefix
:param specs: List of specs to be updated
:raises CondaError: if there is an invalid spec provided
:raises PackageNotInstalledError: if the requested specs to install don't exist in the prefix
N)r   r/   is_name_only_specr   rC   re   r"   )rP   rF   r   specs       rH   ensure_update_specs_existr   A  sY     V$K%%)$//tyy$//*699== rJ   c                r   US:H  nUS:H  nUS:H  nU(       a3  U R                   (       a"  [        R                  " SSSSS9  [        X5      $ [        R
                  n[        U S	9n[        XbS
9  [        R                  (       a  SU l	        [        R                  " U US:H  =(       a    U R                  (       + S9nU(       al  UR                  (       a  [        UR                  5      eUR                  R                   ["        R$                  :w  a  ['        UR(                  UR*                  S9  [-        UR                  5      S:  a9  [-        UR*                  5      S:X  a   [/        UR                  UR(                  5      $ U R                  n	U	(       d  [1        UR                  R                  5      n	[2        U	;  a  U	R5                  [2        5        [7        U S[8        5      ["        R:                  ["        R<                  4;  =(       a    U(       + n
U(       a%  U R                   [8        :X  a  ["        R:                  nOUR                  R                   nUR                  R>                  n[A        U	U[B        [D        [F        45       H  nU n[        RH                  RK                  5       nU" UUR                  RL                  [        RN                  UR*                  UU RP                  S9n URS                  UU[        RT                  =(       d    [        RV                  U
=(       d    XS   :g  S9nSSS5        M     [_        WX`U5        g! [B        [D        4 aq  n[7        USS5      (       d  UeU
(       aO  URS                  U["        R<                  [        RT                  =(       d    [        RV                  XS   :g  S9n SnANUeSnAf[F         aS  n[7        USS5      (       d  UeURX                  (       a'  SURX                  S   ;   a  [[        []        U5      5      eUeSnAff = f! , (       d  f       GM  = f)z>Logic for `conda install`, `conda update`, and `conda create`.creater   rD   rK   rL   z-This function will not handle clones anymore.z/Use `conda.cli.install.install_clone()` instead)topicrM   r   rP   r   zrepodata.json)rE   add_default_packages)rP   rF   r   update_modifier)specs_to_addrepodata_fnr   r   )deps_modifierr   r:   should_retry_solver   TNzcould not import)0r   r   r   install_cloner   target_prefixr   r   use_only_tar_bz2r   r.   from_clino_default_packagesexplicit_packagesr   configr   r   
UPDATE_ALLr   rP   requested_packageslenr,   r   r   appendr   r   FREEZE_INSTALLEDUPDATE_SPECSr   r   r&   r%   
SystemExitplugin_managerget_cached_solver_backendr   subdirscmdsolve_for_transactionr:   r^   rE   r   r}   
handle_txn)rE   parserr   newenvisupdate	isinstallrP   rv   envr   _should_retry_unfrozenr   r   r   r   solver_backendsolverunlink_link_transactiones                      rH   rD   rD   R  sq    F("H9$I $**AF		
 T**""FT*J F<.


$0Q9Q9Q5QC   )#*?*?@@::%%)B)BB%SZZs?U?UV 3  !A%#c.D.D*E*J()>)>

KK$$LCJJ334,&K(
 	'.//1L1LM	N * 
 T))T1(99**44JJ,,M 	<jI
 H$33MMON#

## 33$F*0*F*F"/$3$+$;$;$Lw}}.N(2>N2N +G +' [V &f=' '(GH q-66G).4.J.J&3(6(C(C(/(?(?(P7==,4R8H,H	 /K /+ G q-66G660AFF1I=*3q622? [sF   A P&(AMP#A%O<P&OP#APP##P&&
P6	c                    [         R                  n[        U 5      n[        USS9  [	        U R                  U[         R
                  [         R                  US9  g)z:Executes an install of a new conda environment by cloning.r   r   )rp   ru   rv   N)r   r   r   r   r   rp   ru   )rE   r   rP   rv   s       rH   r   r     sF    ""F%J FH=	

\\mmrJ   c                   [         R                  n[        U 5      n[        USS9  [         R                  (       a  SU l        [        U5        U R
                  nU(       d  [        [         R
                  5      n[        U;  a  UR                  [        5        [        XC5       Hu  nU n[        SU S35         [        US   US   SUS	   UUS
9nSSS5        [        U R                  5      n[        SU 35         [        X(W5      n	SSS5        SSS5        Mw     [!        W	X SS9  g! , (       d  f       N^= f! , (       d  f       N7= f! , (       d  f       M  = f)z1Install a previous version of a conda environmentrD   r   r   zCollecting package metadata ()r   r   Nr   )r   r   platformr   rP   r   zReverting to revision F)r   )r   r   r   r   r   r   r'   r   r   r   r   r2   r   r   revisionrevert_actionsr   )
rE   r   rP   rv   r   r   r   indexrevision_idxr   s
             rH   install_revisionr    s2   ""F%J FI>
 . $$LG001,&K( :H<XJaHI'7&y1! )5! ( J (6L5l^DE*8u*U' F! [ ;( &UC% JI FE! [s<   (E
8D(+E
;D9E
(
D62E
9
EE


E	c                  ^ [        U 5      nUR                  5       R                  5       n UR                  U5       Vs1 s H  n[        R
                  " U5      iM     nnUb  UR                  SS9  [        5       n[        5       nU H  m[        U4S jUR                  5        5       5      n	U	(       d  UR                  T5        M@  [        U	5      S:  a  UR                  [        U	5      5        Mk  UR                  U	S   5        M     U(       a  [        U5      e[        [!        U5      R"                  5      n
[%        X
5      u  p['        XUSUS5      n[)        U5      $ s  snf ! [         a    [        SU-  5      ef = f)Nzno such revision: %dTrO   c              3  X   >#    U  H  nTR                  U5      (       d  M  Uv   M!     g 7frd   )match)rf   precr   s     rH   rh   !revert_actions.<locals>.<genexpr>  s     J~tD9Idd~s   *	*r3   r   r   )r)   get_requested_specs_mapvalues	get_stater/   from_dist_str
IndexErrorr   reloadsetrl   addr   r*   r#   r
   r0   graphr   r   r   )rP   r  r  huser_requested_specsdist_strtarget_statenot_found_in_index_specs
link_precsprecsfinal_precsunlink_precssetupr   s                @rH   r  r    s[   A 446==?A>?kk(>S
>S(I##H->S 	 
 D!"uJJu||~JJ$((.Z!^NN/67NN58$   #$<==[4::;K9&NLj">RTVWE ''5
  A4x?@@As   E(  E#E( #E( (Fc                   U R                   (       aY  U(       a  [        UR                  5      eU(       d6  [        R                  (       a  [
        R                  " SS9  g [        S5        g [        R                  (       d  U R                  5         [        5         OG[        R                  (       a2  U R                  5       S   n[
        R                  " XSS9  [        5       e U R                  5         [        R                  (       a  [        S5      eU R!                  5         U(       aO  [        R&                  [        R(                  " 5       :w  a(  [+        S	[        R&                  4[-        U[.        5      S
9  [        R                  (       a(  U R                  5       S   n[
        R                  " XS9  g g ! ["         a  n[%        SU5      eS nAff = f)Nz)All requested packages already installed.)messagez-
# All requested packages already installed.
r   T)rP   rw   dry_runzUPackage caches prepared. UnlinkLinkTransaction cancelled with --download-only option.Exitingsubdir)r[   )rP   rw   )nothing_to_dor#   package_namesr   rp   r4   r   r   print_transaction_summaryr1   r   _make_legacy_action_groupsr    download_and_extractdownload_onlyr   executer   r   r"  _native_subdirr6   r	   r   )r   rP   rE   r   	remove_oprw   r   s          rH   r   r   %  sX   ,,'(:(:;;||**G
  GH<<99;	)DDFqI""&4Pl
,446  *  	 '')
 >>W33557>>*&":;
 ||)DDFqI""&B   ,i++,s   #A F7 7
GGG)rF   	list[str]returnr   )rP   z
str | Pathr-  None)F)r]   r}   r^   boolr-  r}   )rP   r}   )FFN)r-  zdict[str, any])rD   )rP   r}   r   r}   )rP   r}   rF   r,  )r   N)r  zIndex | None)a__doc__
__future__r   rY   loggingr   os.pathr   r   r   r   pathlibr	   boltons.setutilsr
   base.constantsr   r   r   rW   r   common.configurationr   common.constantsr   
core.indexr   	core.linkr   r   core.prefix_datar   
core.solver   deprecationsr   
exceptionsr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   gateways.disk.deleter'   r(   historyr)   miscr*   r+   r,   models.channelr-   models.environmentr.   models.match_specr/   models.prefix_graphr0   	reportersr1   r2    r4   r5   main_configr6   r   logrn   rI   rQ   r`   rr   r   r   r   r   r   r   r   r   rD   r   r  r  r   r   rJ   rH   <module>rJ     su   # 	  4 4  ' 
 # ; #  : ) 3 %    " ?  
 . , ) - /  # !n%	2 FF%>?V @V 
FS& 

^



8
4 FF%LM( N(O + +\ 6,@>"j>Z"+D\$(N,CrJ   