
    \ZigR                    >   S 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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JrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-  SSK.J/r/J0r0  SSK1J2r2  SSK3J4r4J5r5J6r6  SSK7J8r8  SSK9J:r:  SSK;J<r<  SSK=J>r>  SSK?J@r@JArA  SSKBJCrC  SSKCJDrD  SSKEJFrF  \" \G5      rH\" S5      rIS-S jrJS.S jrKS/S  jrLS0S! jrM " S" S#5      rN " S$ S%5      rOS1S2S& jjrPS3S' jrQS1S( jrRS) rSS* rTS4S5S+ jjrUS/S, jrVg)6zConda 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)Path   )REPODATA_FNUpdateModifier)context)DEFAULT_CONDARC_FILENAME)NULL)Index)PrefixSetupUnlinkLinkTransaction)
PrefixData)diff_for_unlink_link_precs)CondaExitZeroCondaImportErrorCondaIndexErrorCondaSystemExitCondaUpdatePackageErrorCondaValueError"DirectoryNotACondaEnvironmentError
DryRunExitInvalidInstallerNoBaseEnvironmentErrorPackageNotInstalledErrorPackagesNotFoundErrorPackagesNotFoundInChannelsErrorPackagesNotFoundInPrefixError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getr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   install)argsspecskwargss      1lib/python3.13/site-packages/conda/cli/install.pyreinstall_packagesrE   D   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    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)ossepr   r   	from_nameassert_environmentstrprefix_pathprintr'   r0   stdout_json_successlist)	src_argrN   jsonrI   rJ   source_prefix_datarM   rK   rL   s	            rD   cloner[   ]   s    	vv'(89'11':))+'334Jj\*+j\*+(D G "" 1!!		
 rF   c                V     [        U 5      $ ! [         a    [        SU  S3U5      ef = f)Nz expected revision number, not: '')int
ValueErrorr   )argrY   s     rD   get_revisionra   w   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
   channelsr5   re   rA   s    rD   get_index_argsrh   ~   s,      (( ---^^ rF   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 N)notify_successrepodatalast_repodatarJ   allowed_errors)selfrn   ro   rp   rJ   rq   s         rD   __init__TryRepodata.__init__   s      - *$,rF   c                    U R                   $ rm   )ro   rr   s    rD   	__enter__TryRepodata.__enter__   s    }}rF   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)rn   
isinstancerq   ro   rp   getattrr    r   _formatted_chainsr)   r
   rf   )rr   exc_type	exc_value	tracebacks       rD   __exit__TryRepodata.__exit__   s    !$ y"5"566$"4"44	=$77	#9::1++ !1!12  ;rF   )rq   rJ   rp   rn   ro   N)__name__
__module____qualname____firstlineno__rs   rw   r   __static_attributes__ rF   rD   rj   rj      s    -rF   rj   c                  *    \ rS rSrSS jrS rS rSrg)	Repodatas   c                R    Xl         X l        SU l        [        [        /UQ7U l        g )NF)repodata_fnsrJ   successr    r   rq   )rr   r   rJ   allows_errorss       rD   rs   Repodatas.__init__   s.    ($"!
 
rF   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   rj   succeedrJ   rq   r   )rr   ro   s     rD   __iter__Repodatas.__iter__   sX     ))H!!"%##  ||| *s   AA&!A&c                    SU l         g )NT)r   rv   s    rD   r   Repodatas.succeed   s	    rF   )rq   rJ   r   r   N)r   )r   r   r   r   rs   r   r   r   r   rF   rD   r   r      s    

rF   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)r@   updateremoveN)r
   validate_configurationr1   r   force_32bitis_baser   assert_writabler   conda_prefixr   r#   r$   protect_frozen_envsassert_not_frozen)prefixcommandprefix_dataexcs       rD   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   r?   namer   )r   rB   r   specs       rD   ensure_update_specs_existr      sY     V$K%%)$//tyy$//*699== rF   c                   US:H  nUS:H  nUS:H  n[         R                  n[        U S9n[        XbS9  [         R                  (       a  SU l        [        R                  " U US:H  =(       a    U R                  (       + S9u  pU(       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  [)        UR                  R
                  5      n
[*        U
;  a  U
R-                  [*        5        [/        U S
[0        5      [        R2                  [        R4                  4;  =(       a    U(       + nU(       a%  U R                  [0        :X  a  [        R2                  nOUR                  R                  nUR                  R6                  n[9        U
U[:        [<        [>        45       H  nU n[         R@                  RC                  5       nU" UUR                  RD                  [         RF                  UR"                  UU RH                  S9n URK                  UU[         RL                  =(       d    [         RN                  U=(       d    XS   :g  S9nSSS5        M     [a        WX`U5        URb                  (       a  [         Rd                  (       d  [         Rf                  (       d  SSK4J5n  SSK6J7n  SSK8J9n  U	Ru                  5        VVs/ s H  u  nnURb                  (       d  M  UU4PM     nnnU H|  u  nnURb                  Ru                  5        HX  u  nn U" U5      nUS:X  a&  U" U5      nURw                  U[)        U5      U UUS9  M;  URw                  U[)        U5      U U5        MZ     M~     URz                  (       a%  [}        U5      R                  URz                  5        gg! [:        [<        4 ar  n[/        USS5      (       d  UeU(       aP  URK                  U[        R4                  [         RL                  =(       d    [         RN                  XS   :g  S9n SnAGNUeSnAf[P        [R        4 a    e [T         aL  nURV                  (       a!  [Q        URX                  URV                  5      Ue[S        URX                  US9UeSnAf[>         aS  n[/        USS5      (       d  UeURZ                  (       a'  SURZ                  S	   ;   a  []        [_        U5      5      eUeSnAff = f! , (       d  f       GMX  = fs  snnf ! [x         a    U" SU SU S35      ef = f)z>Logic for `conda install`, `conda update`, and `conda create`.creater   r@   rg   r   r   zrepodata.json)rA   add_default_packages)r   rB   r   update_modifier)specs_to_addrepodata_fnr   r   )deps_modifierr   r6   should_retry_solverz   TNr   zcould not importr   )
CondaError)get_installer)get_pip_workdirpip)workdirzUnable to install package for z from environment file z@. Please ensure your dependencies file has the correct spelling.)@r
   target_prefixrh   r   use_only_tar_bz2r   r*   from_cli_with_file_envsno_default_packagesexplicit_packagesr   configr   r	   
UPDATE_ALLr   r   requested_packageslenr(   rW   r   appendr|   r   FREEZE_INSTALLEDUPDATE_SPECSr   r   r"   r!   
SystemExitplugin_managerget_cached_solver_backendrf   subdirscmdsolve_for_transactionr6   forcer   r   r   rc   r>   rA   r   rS   
handle_txnexternal_packagesdry_rundownload_only r   env.installers.baser   env.pip_utilr   itemsr@   r   	variablesr   set_environment_env_vars)rA   parserr   newenvisupdate	isinstallr   rJ   envfpath_envs_mapr   _should_retry_unfrozenr   r   r   ro   solver_backendsolverunlink_link_transactioner   r   r   fpathfile_envexternal_envsinstaller_type	pkg_specs	installerr   s                                 rD   r@   r@     s    F("H9$I""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 +' [p &f=
W__W=R=R!72 $2#7#7#9
#9x)) UH#9 	 

  -OE8-5-G-G-M-M-O)	 -n =I%."1%"8!))"DOT8W *  "))&$y/4R .P  -" }}633CMMB { '(GH q-66G).4.J.J&3(6(C(C(/(?(?(P7==,4R8H,H	 /K /+ G35RS ( 	>>9

ANN 8

6  q-66G660AFF1I=*3q622Y [t
  ( $88HH_`e_f gY Y sq   A V0AQ.V%
V%>2V+2V+VA%SV	SV(AT//V<AV

VV
V"	+W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   )rY   rI   rJ   N)r
   r   rh   r   r[   rY   rI   )rA   r   r   rJ   s       rD   install_cloner     sF    ""F%J FH=	

\\mmrF   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 environmentr@   r   r   zCollecting package metadata ()rc   rd   Nre   )rf   rd   platformre   r   r   zReverting to revision F)r   )r
   r   rh   r   r   r   r#   rW   r   r   r   r.   r   ra   revisionrevert_actionsr   )
rA   r   r   rJ   r   r   ro   indexrevision_idxr   s
             rD   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                V  ^ [        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(       a2  [        U[        [         R"                  [         R$                  5      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: %dTr   c              3  X   >#    U  H  nTR                  U5      (       d  M  Uv   M!     g 7frm   )match).0precr   s     rD   	<genexpr>!revert_actions.<locals>.<genexpr>  s     J~tD9Idd~s   *	*r/   r   r   )r%   get_requested_specs_mapvalues	get_stater+   from_dist_str
IndexErrorr   reloadsettupleaddr   r&   r   r)   r
   rf   r   r,   graphr   r   r   )r   r   r   huser_requested_specsdist_strtarget_statenot_found_in_index_specs
link_precsprecsfinal_precsunlink_precssetupr   s                @rD   r   r     su   A 446==?A>?kk(>S
>S(I##H->S 	 
 D!"uJJu||~JJ$((.Z!^NN/67NN58$   -$W--w?
 	

 J/556K9&NLj">RTVWE '';
  A4x?@@As   F  F
F 
F F(c                   U R                   (       aX  U(       a  [        UR                  US9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)Nr   z)All requested packages already installed.)messagez-
# All requested packages already installed.
r   T)r   rK   r   zUPackage caches prepared. UnlinkLinkTransaction cancelled with --download-only option.Exitingsubdir)path)r   rK   )nothing_to_dor   package_namesr
   rY   r0   rV   rU   print_transaction_summaryr-   r   _make_legacy_action_groupsr   download_and_extractr   r   executer   r   r  _native_subdirr2   r   r   )r   r   rA   r   	remove_oprK   r   s          rD   r   r     sZ   ,,/0B0B6RR||**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 F6 6
G GG)rB   	list[str]returnr^   )FFN)F)r  zdict[str, any])r@   )r   rS   r   rS   )r   rS   rB   r  )r   N)r   zIndex | None)W__doc__
__future__r   rO   loggingr   os.pathr   pathlibr   base.constantsr   r	   base.contextr
   common.configurationr   common.constantsr   
core.indexr   	core.linkr   r   core.prefix_datar   
core.solver   
exceptionsr   r   r   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_graphr,   	reportersr-   r.   r   r0   r1   main_configr2   r   log	stderrlogrE   r[   ra   rh   rj   r   r   r   r@   r   r   r   r   r   rF   rD   <module>r7     s    # 	    # ; #  : ) 3    & ?  
 . , ) - /  # !n%	2
4O + +\ 6,@>"KC\"+D\'(T,CrF   