
    >Ve޼                        d Z ddl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 ddlmZ ddlmZ ddlmZmZmZmZmZ ddlZdd	lmZ dd
lmZ ddlmZmZ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.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@ ddlAmBZB dd
lCmZ ddlDmEZE ddlFmGZGmHZH ddlImJZJmKZK ddlLmMZMmNZN ddlOmPZP  ejQ        deR           ZS G d  d!e3          ZTdS )"z
This module defines the conda.core.solve.Solver interface and its immediate helpers

We can import from conda and libmambapy. `mamba` itself should NOT be imported here.
    N)defaultdict)suppress)	lru_cache)stack)dedent)IterableMappingOptionalSequenceUnion)
IndexedSet)__version__)DEFAULT_CHANNELSREPODATA_FNUNKNOWN_CHANNELChannelPriority)context)on_win)NULL)Spinnertimeout)paths_equal)join_urlpercent_decode)
PrefixData)Solver)InvalidMatchSpecInvalidSpecPackagesNotFoundErrorSpecsConfigurationConflictErrorUnsatisfiableError)Channel)	MatchSpec)PackageRecordPrefixRecord)VersionOrder   )LibMambaUnsatisfiableError)LibMambaIndexHelper_CachedLibMambaIndexHelper)init_api_contextmamba_version)SolverInputStateSolverOutputState)is_channel_availablezconda.c                       e Zd ZdZdZdddeef fd	Ze e	d          d                         Z
eeeeedfdZd4d	ee         fd
Zd ZdededefdZd ZdefdZ	 d5dedededefdZdedefdZed             ZdedefdZdedefdZdedefdZedefd            Zedee e!e          f         fd            Z"e#de de$e ef         fd            Z%	 	 	 	 d6de&ee e$f                  d e$e ef         d!e$e ef         d	ee         fd"Z'd7d#Z(d$ Z)	 d7d%e$e ef         d&e fd'Z*dededefd(Z+	 d8ded)e d*e d+e d,e,de-fd-Z.d.eedf         deedf         fd/Z/d0 Z0d1 Z1	 	 d9ded2ee-         fd3Z2 xZ3S ):LibMambaSolverzD
    Cleaner implementation using the ``state`` module helpers.
    F c           	      &   |r|rt          d          |r|t          u rd}t                                          |||||||           | j        t          u s| j        st
          j        | _        d | _        d | _        | j        dk    r.t          
                    dt                      t          | _        g }|D ]}	t          |	t                    rt          t          |	                    }	n\t          |	t                    rGt          |	          }
d|
v r4t           j        D ]'}|
|v r!t          |          }|j        |	j        k    r|}	(|                    |	           t)          t          j        d |D                                 | _        d S )NzEOnly one of `specs_to_add` and `specs_to_remove` can be set at a timeremove)subdirsspecs_to_addspecs_to_removerepodata_fncommandzcurrent_repodata.jsonz<Ignoring repodata_fn='current_repodata.json', defaulting to z::c              3      K   | ]}|V  d S Nr2   .0ss     <lib/python3.11/site-packages/conda_libmamba_solver/solver.py	<genexpr>z*LibMambaSolver.__init__.<locals>.<genexpr>y   s"      6N6NQq6N6N6N6N6N6N    )
ValueErrorr   super__init__r5   r   solver_solver_options_repodata_fnlogdebugr   
isinstancer$   r#   strsysargvnameappendr   merger6   )selfprefixchannelsr5   r6   r7   r8   r9   fixed_specsspecspec_strargms_from_arg	__class__s                r?   rD   zLibMambaSolver.__init__C   s     	O 	W    	w$G%+# 	 	
 	
 	
 <4t|"?DL #  777IIbU`bbccc +D   	% 	%D$.. 	3 T++D),, 3t998##"x 3 3#s??*3C..K*/49<<'2t$$$$&y6N6N+6N6N6N'N'NOOrA   N)maxsizec                  4    dt            dt                       S )z\
        Expose this identifier to allow conda to extend its user agent if required
        zconda-libmamba-solver/z libmambapy/)r   r,   r2   rA   r?   
user_agentzLibMambaSolver.user_agent{   s     SRRRRRrA   c           
         |                                   t          | j        | j        p| j        |||||| j                  }t          |          }|                                }	|	|	S t                       | j	        }
| 
                                r>t                              d           d|
vrg |
dR }
d | j        D             }t          }n	t          }d}g || j        |                                }t%          t&          dd           pi                     d          }t+          j        d	          s[|sYd
 |D             }|                    |          }|D ]4}t1          dt2          |j        d          r|                    |           5|                    |                                           t=          |          }t?          |                      ||          t&          j!         ot&          j"         t&          j#                  5   |g |j$        %                                |j&        %                                R ||
| j'                  }|(                                 d d d            n# 1 swxY w Y   t?          | )                                t&          j!         ot&          j"         t&          j#                  5  | *                    |           | +                    |||          }t=          |j,        %                                          | _-        |j.        }d d d            n# 1 swxY w Y   | /                    d ||           |S )N)rR   	requestedupdate_modifierdeps_modifierpruneignore_pinnedforce_remover9   )solver_input_statezDUsing solver via 'conda.plan.install_actions' (probably conda build)noarchc                 >    i | ]}|j         j        d k    |j         dS )fileN)channelscheme)r=   recs     r?   
<dictcomp>z4LibMambaSolver.solve_final_state.<locals>.<dictcomp>   s3     " " "&)CK<NRX<X<XT<X<X<XrA   r2   _argparse_argsoverride_channels0CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLEDc                 \    g | ])}t          |                              d           D ]}|*S F)r"   urlsr=   curls      r?   
<listcomp>z4LibMambaSolver.solve_final_state.<locals>.<listcomp>   s7    TTTWQZZ__U=S=STTcTTTTrA   )seenr'   F)default_return)conda_bld_channels)enabledjson)installed_recordsrS   r5   r8   )0	_log_infor-   rR   r6   r7   _commandr.   
early_exitr+   r5   _called_from_conda_buildrH   info_indexr*   r)   rS   channels_from_specsgetattrr   getosgetenvchannels_from_installedr   r/   base_urlrO   extendmaybe_free_channeltupler   _spinner_msg_metadata	verbosityquietrz   	installedvaluesvirtualrG   reload_local_channels_spinner_msg_solving_setup_solver_solving_loopneuteredneutered_specscurrent_solution_notify_conda_outdated)rQ   r_   r`   ra   rb   rc   should_retry_solvein_state	out_statenone_or_final_stater5   rx   IndexHelperall_channelsoverrideall_urlsinstalled_channelsrh   indexsolutions                       r?   solve_final_statez LibMambaSolver.solve_final_state   s#    	#;'?4+?+''%M	
 	
 	
 &BBB	 (2244*&& 	,((** 	$HH[\\\ w&&,7,H,," "-1[" " " 5KK-K!#

]
 ))++

 G%5t<<BGGH[\\yKLL 	1U] 	1TT\TTTH!)!A!Ax!A!P!P- 1 112G4DUZ[[[ 1 ''000H7799:::\**&&|HZ&[[))?'-.?
 
 
 	* 	*
  K"\H$6$=$=$?$?"\(BRBYBYB[B["\"\% -	  E '')))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* %%''))?'-.?
 
 
 
	2 
	2
 u%%% **8YFFI"'	(:(A(A(C(C"D"DD 1H
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 
	2 	##D%:::s&   AI::I>I>AL66L:=L:rS   c                 H   |                                  r.d}|r(d |D             }|dd                    |           dz  }|S t          t                              d |D                                 }d                    |          }d| d	t
          j         d
| j         dS )NzReloading output folderc                 6    g | ]}t          |          j        S r2   )r"   canonical_namer=   rs   s     r?   ru   z8LibMambaSolver._spinner_msg_metadata.<locals>.<listcomp>   s!    OOOq2OOOrA   z (z, )c                     g | ]	}|j         
S r2   r   r   s     r?   ru   z8LibMambaSolver._spinner_msg_metadata.<locals>.<listcomp>   s    -Q-Q-Q1a.>-Q-Q-QrA   z
 - zChannels:
 - z
Platform: z
Collecting package metadata ()r   joinlistdictfromkeysr   subdirrG   )rQ   rS   rx   msgnamescanonical_namescanonical_names_dasheds          r?   r   z$LibMambaSolver._spinner_msg_metadata   s    ((** 	+C! 0OO<NOOO/DIIe,,////Jt}}-Q-Q-Q-Q-QRRSS!(o!>!>A(A A A A -1,=A A A	
rA   c                     t           j                            | j                  }|                                 r<d|v r6d                    |                    d          dd                   }d| dS dS dS )	z<This shouldn't be our responsibility, but the CLI / app's..._env_N   zSolving environment (r   zGetting pinned dependencieszSolving environment)r   pathbasenamerR   r   r   split)rQ   prefix_nameenv_names      r?   r   z#LibMambaSolver._spinner_msg_solving   s    g&&t{33((** 	5$$88K$5$5c$:$:2A2$>??:x:::: 54$$rA   r   r   r   c                 J   d}t          dt          t          j                            dt          |j                                      dz             }t          d|          D ]}t          	                    d|           	 | 
                    ||||          }|r n	 t          |t          |j                  t          |j                  t          |j                  t          |j                  t          |j                            }# t$          t&          f$ r d}Y  nw xY w|st          	                    d           |j                            d	 |j                                        D             d
           | j        d t.          fv rd| _        n| xj        dz  c_        | 
                    |||          }|s3|                     |j                  }t5          |          }d|_        ||                     |||           |                    |            |S )NF   "CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTSr'   zStarting solver attempt %s)attempt)rd   specsrecordsfor_historyr   	conflictsz2Last attempt: reporting all installed as conflictsc                 L    i | ]!\  }}|j         ||                                "S r2   )is_unmanageableto_match_spec)r=   rN   records      r?   rk   z0LibMambaSolver._solving_loop.<locals>.<dictcomp>#  sC       $f!1	&..00  rA   zQLast attempt: all installed packages exposed as conflicts for maximum flexibilityreasonlast_solve_attemptz+last_solve_attemptpins)rE   )maxintr   environr   lenr   rangerH   rI   _solve_attemptr.   r   r   r   r   r   r   r!   r   updateitemsr}   r   _prepare_problems_messager   r(   allow_retry_export_solved_records
post_solve)	rQ   r   r   r   solvedmax_attemptsr   messageexcs	            r?   r   zLibMambaSolver._solving_loop  s^    
CSI[E\E\]]^^abb
 
 Q-- 	 	GII2G<<<,,Xy%QX,YY E .'/y// !233 $Y%: ; ;!)"455"9#677  			 '(=>     	IIJKKK&& (0(:(@(@(B(B  7 '    }t,, 4!66((9eDDF 88in8MM099"'	 	##Hi??? 	D)))s   DD&%D&c                    t                               d           t                               dt                     t                               dt                                 t                               d| j                   t                               dt
          j                   t                               d| j                   t                               d| j                   d S )NzUsing libmamba solverzConda version: %szMamba version: %szTarget prefix: %rzCommand: %szSpecs to add: %szSpecs to remove: %s)	rH   r   _conda_versionr,   rR   rL   rM   r6   r7   rQ   s    r?   r|   zLibMambaSolver._log_infoC  s    ()))$n555$moo666$dk222)))#T%6777&(<=====rA   c                 ^   t           j        dfgx| _        }t          j        t
          j        u r!|                    t           j        df           | j	        r2| j
        dd t          fv r!|                    t           j        df           t          j        |j        | j                  | _        d S )Nr'   r4   )apiSOLVER_FLAG_ALLOW_DOWNGRADErF   r   channel_priorityr   STRICTrO    SOLVER_FLAG_STRICT_REPO_PRIORITYr7   r}   r   SOLVER_FLAG_ALLOW_UNINSTALLr   _poolrE   )rQ   r   solver_optionss      r?   r   zLibMambaSolver._setup_solverL  s    ,a01
 	
~ #'===!!3#G"KLLL 	HDMhd5K$K$K!!3#BA"FGGGjd.BCCrA   r'   r   c                    |                      |           t                              d|           t                              d|j                   	 |                    |           n$# t
          $ r}| j        dk    r|Y d }~nd }~ww xY wt                              d|j                   d}|                     ||          }|	                                D ]\  \  }}	}
t                              d||
           |dk    r8|dk    r2|
D ].}|dz  }| j
                            |           ||j        d	| <   /b	 | j
                            |
|	           # t          $ r!}t          t!          |                    d }~ww xY w| j
                                        }|r|j                            d
           |S | j
                                        }|j                                        }|                     |||j        |j                  }t                              d|t/          |                     |j                            |	                                d           dS )NzNew solver attempt: #%dz-Current conflicts (including learnt ones): %sr   zComputed specs: %sr   zAdding task %s with specs %sADD_PINr'   zpin-zSolution foundr   z#Attempt %d failed with %s conflictszNew conflict foundF)r   rH   rI   r   prepare_specsr    r}   r   _specs_to_tasksr   rE   add_pinr   add_jobsRuntimeErrorr   rK   solveclearproblems_to_strcopy_maybe_raise_for_problems	_channelsr   r   )rQ   r   r   r   r   r   n_pinstasks	task_name	task_typer   rU   r   problemsold_conflictsnew_conflictss                   r?   r   zLibMambaSolver._solve_attemptW  s    	5!!!		+W555		A9CVWWW	##E****. 	 	 	
 } 444	 54444	 			&	888 $$Xy99-2[[]] 	0 	0)"Y	EII4iGGGI%%'Q,, " ; ;DaKFK''---6:IN?&??33;
0K((	::::# 0 0 0%c#hh///0 ""$$ 	%%-=%>>>M;..00!+002266mY^U_
 
 			7#mBTBTUUU""=#6#6#8#8AU"VVVus0   A( (
B	2BB	;E
F!E==Fc                    t                               dt          |j                             |j        r|                     ||          }nA|                                 r|                     ||          }n|                     ||          }t                               dt          j
        d |                                D             d                     |S )NzCreating tasks for %s specszCreated following tasks:
%sc                 &    i | ]\  }}|d          |S )r   r2   )r=   kvs      r?   rk   z2LibMambaSolver._specs_to_tasks.<locals>.<dictcomp>  s"    :::DAq!a:::rA   r   )indent)rH   rI   r   r   is_removing_specs_to_tasks_remover   _specs_to_tasks_conda_build_specs_to_tasks_addrz   dumpsr   )rQ   r   r   r   s       r?   r   zLibMambaSolver._specs_to_tasks  s    		/Y_1E1EFFF 	B//)DDEE**,, 	B44XyIIEE,,XyAAE		*J::EKKMM:::1EEE	
 	
 	
 rA   c                     | j         r!| j                             d          r| j         S |                     d          r&|                     d          st          | d          } t	          |           S )z
        Workarounds for Matchspec str-roundtrip limitations.

        Note: this might still fail for specs with local channels and version=*:
            file://path/to/channel::package_name=*=*buildstr*
        zfile://buildversion*)r  )original_spec_str
startswithr   r#   rK   )rU   s    r?   _spec_to_strzLibMambaSolver._spec_to_str  su     ! 	*d&<&G&G	&R&R 	*))88G 	0TXXi%8%8 	0T3///D4yyrA   c                 
   t          t                    }fdg j        j        j        j        R D             }d}j                            d          }|j                            d          }|r|r|	                    |           }t          |j                                                  D ]D\  }}	|                    d          rj                            |          }
|
r(|                     |
                                          }nd }|                     j                            |                    }|                     j                            |                    }|                     j                            |                    }|                     |j                            |                    }||v r0j        s)|s'|dt&          j        f                             |           |rA|j        s:|dt&          j        f                             |                     |                     |r|j        r|r|j        s|                     |          }n|                     |          }|
rP|dt&          j        f                             |           |dt&          j        f                             |           |d	t&          j        f                             |           E|j        v rP|dt&          j        f                             |           |dt&          j        f                             |           j        r|dk    rf|
rd|sbd
                    |
j                            d
          d d                   }|dt&          j        f                             d| d           |r|rJ|j        dk    r?|j        r| d|j         dn|}|d	t&          j        f                             |           a|d	t&          j        f                             |                     |                     |
r|r)|dt&          j        f                             |           ʉj         j!        }|r	|j        rd}|r+|
j"        $|
j#        D ]}tI          |          j%        dv rd} n|r4|dt&          j&        t&          j'        z  f                             |           FtQ          |          S )Nc                 &    h | ]}|j         v |S r2   )r   )r=   pkgr   s     r?   	<setcomp>z5LibMambaSolver._specs_to_tasks_add.<locals>.<setcomp>  s5     	
 	
 	
 h(((  )((rA   Fpython__USERINSTALLEDr   UPDATEALLOW_UNINSTALLINSTALL.r   zpython .*r    T)r  
python_abiLOCK))r   r   historyaggressive_updatespinneddo_not_remover   r   r   matchsortedr   r  r  r   _check_spec_compatr^   r   ra   r   SOLVER_USERINSTALLEDrO   is_name_only_specSOLVER_NOOPSOLVER_UPDATESOLVER_ALLOWUNINSTALLSOLVER_INSTALLalways_updater   r  r   
strictnessr_   FREEZE_INSTALLEDre   dependsr#   rN   SOLVER_LOCKSOLVER_WEAKr   )rQ   r   r   r   user_installedpython_version_might_changeinstalled_pythonto_be_installed_pythonrN   _classic_logic_specr   installed_spec_strr^   r   r"  conflictingrV   pyverrU   lockdeps    `                   r?   r  z"LibMambaSolver._specs_to_tasks_add  s   D!!	
 	
 	
 	
!,  '	 	
 	
 	
" ',##-11(;;!*!4!4X!>!> 	] 6 	].D.J.JK[.\.\*\' *0	0E0E0G0G)H)H I	 I	%D%t$$ '/'9'='=d'C'CI *%)%6%6y7N7N7P7P%Q%Q""%)"#'#:#:8;M;Q;QRV;W;W#X#XI!%!8!89I9M9Md9S9S!T!TG $ 7 78K8KD8Q8Q R RF%)%<%<Y=P=T=TUY=Z=Z%[%[K~%%hn%[%(@ABIIJ\]]]  Vf6 V y#/23::4;L;LV;T;TUUU  0. <6 <&BZ <  $0088HH#00;;H L8S%678??III,c.GHIPPQUVVVV9c&89:AA(KKKK///x!234;;DAAA(#*CDELLTRRRR  !!i!!!2!8!8!=!=bqb!ABBy#/23::;NU;N;N;NOOOO  ^7#5#:#: =DOUd88W_8888QUD9c&89:AA$GGGG9c&89:AA$BSBST[B\B\]]]]  ,c.GHIPPQUVVVV $3DD $&": $#2 &y7G7O#,#4 & &C(~~26NNN', %  O  vs'HIJQQ.   E{{rA   c                 2   t          t                    }|j                                        D ]d\  }}||j        v s	||j        v rM|                                                                }|dt          j	        f         
                    |           edt          j        t          j        z  f}|j                                        D ]B\  }}|                     |          }||         
                    t          |                     Ct!          |          S )Nr  zERASE | CLEANDEPS)r   r   r   r   r   r!  r   conda_build_formr   r'  rO   SOLVER_ERASESOLVER_CLEANDEPSr^   r&  rK   r   )rQ   r   r   r   rN   r   rU   keys           r?   r  z%LibMambaSolver._specs_to_tasks_remove  s    D!! &-3355 	P 	PLD&x'''483N+N+N ++-->>@@(@ABII$OOO #C$4s7K$KL",2244 	) 	)JD$**400D#Jc$ii((((E{{rA   c                 |   t          t                    }dt          j        f}|j                                        D ]r\  }}|                    d          r|                     |          }|                     |          }||         	                    |
                                           st          |          S )Nr  r  )r   r   r   r,  r   r   r  r&  "_fix_version_field_for_conda_buildrO   r>  r   )rQ   r   r   r   rA  rN   rU   s          r?   r  z*LibMambaSolver._specs_to_tasks_conda_build8  s     D!!++#///11 	7 	7JD$t$$ **400D::4@@D#Jd33556666E{{rA   rU   c                 r   | j         rt          j        d          }t          | j                   }t          j        ||          rr|                                                                 }|                    d          dk    r	|dz   |d<   n|dz   |d<   t          d	                    |                    S | S )zFix taken from mambabuildz	^[\d\.]+$r  r'   r  r  r  )
r  recompilerK   r$  r>  r   countr#   r   )rU   only_dot_or_digit_reversion_strspec_fieldss       r?   rC  z1LibMambaSolver._fix_version_field_for_conda_buildF  s     < 		8#%:l#;#; dl++Kx,k:: 8"3355;;==$$S))Q..%04%7KNN%03%6KN +!6!6777rA   c                    	 t          | t                    r,|                     dd          \  }}}t          |||          S d| d                             d          i}t          |           dk    r| d                             d          |d<   t          |           d	k    r| d                             d          |d
<   t          di |S # t          $ r}t          d|            |d }~ww xY w)N-r   )rN   r  r  rN   r   ,r'   r  r   r  zCould not parse spec: r2   )rJ   rK   rsplitr#   rstripr   	ExceptionrB   )rU   rN   r  r  kwargsr   s         r?   _str_to_matchspecz LibMambaSolver._str_to_matchspecU  s   	G$$$ 	+'+{{3':':$gu dG5IIII $q'.."5"56t99>>(,Qs(;(;F9%t99>>&*1gnnS&9&9F7O **6*** 	G 	G 	G<d<<==3F	Gs   A C B
C 
C0C++C0r   returnc                    g }g }|                                 dd         }|D ]}|                                }|                                }|                    d          sAd|v r|d         dk    s|d         dk    rt	          d|           |                    |                     |d	                              |                    d
          }|                    |                     |d|                              d|v rt          d t          |          D             d          }|r.|                    |                     |d                              |dk    rdnd}	|                    |                     ||	|                              zd|v r4d|v r0|                    |                     |d                              d|v rd|v r|d         
                    dd          d         }
|d         
                    dd          d         }|                    t          |
                     |                    t          |                     Dd|v r0|                    |                     |d	                              xt                              d|           d |D             d |D             dS )ux  
        Problems can signal either unsatisfiability or unavailability.
        First will raise LibmambaUnsatisfiableError.
        Second will raise PackagesNotFoundError.

        Libmamba can return spec strings in two formats:
        - With dashes, e.g. package-1.2.3-h5487548_0
        - à la conda-build, e.g. package 1.2.*
        - just names, e.g. package
        r'   Nz- z&none of the providers can be installedpackager   requireszUnknown message: r   but   z- nothing providesc              3   ,   K   | ]\  }}|d k    |V  dS )neededNr2   )r=   iws      r?   r@   z1LibMambaSolver._parse_problems.<locals>.<genexpr>  s*      QQVa1==q====QQrA   zhas constraintzconflicting withzcannot install both pin-zand pin-rL  r      #is excluded by strict repo priorityz!! Problem line not recognized: %sc                     i | ]
}|j         |S r2   rN   r<   s     r?   rk   z2LibMambaSolver._parse_problems.<locals>.<dictcomp>      777!&!777rA   c                     i | ]
}|j         |S r2   ra  r<   s     r?   rk   z2LibMambaSolver._parse_problems.<locals>.<dictcomp>  rb  rA   )r   	not_found)
splitlinesstripr   r  rB   rO   rR  r   next	enumeraterN  r#   rH   rI   )clsr   r   rd  problem_lineslinewordsendmarkerstartpin_apin_bs               r?   _parse_problemszLibMambaSolver._parse_problemse  s    		 ++--abb1! 	E 	ED::<<DJJLLE??4(( 74??8y((E!H
,B,B$%?%?%?@@@  !6!6uQx!@!@AAAkk%((  !6!6uQsU|!D!DEEEE%--QQy/?/?QQQSWXX G$$S%:%:59%E%EFFF#q[[a  !6!6uU6\7J!K!KLLLL!T)).@D.H.H   !6!6uRy!A!ABBBB+t33
d8J8JaQ//2aQ//2  5!1!1222  5!1!122226$>>  !6!6uQx!@!@AAAA		=tDDDD 87Y77777Y777
 
 	
rA   previous_conflictsr   c                    | j         t          d          || j                                         }t          |t                    r|                     |          }|                     i |d         |d         |                                            |d         }|d         }|s|rt          	                    dt          |                                          |           t          t          |                                          t          |p| j                            }d|_        ||pi }	t!          |	                                          }
t!          |                                          }|                    |
          }t%          |          dk    rd|v r|                    d           |	r|
|k    st%          |          d	k    r.|                     |
          }t)          |          }d|_        ||S )N9Solver is not initialized. Call `._setup_solver()` first.r   rd  )r   z4Inferred PackagesNotFoundError %s from conflicts:
%sFr'   r  
   r   )rE   r   r   rJ   rK   rr  _maybe_raise_for_conda_buildr   rH   rI   r   keysr   r   rS   r   set
differencer   popr(   )rQ   r   rs  r   rS   parsed_problemsunsatisfiablerd  r   previousprevious_setcurrent_setdiffr   s                 r?   r   z(LibMambaSolver._maybe_raise_for_problems  s    ;Z[[[{2244Hh$$ 	="228<<O 	))L{+L{/KL2244 	* 	
 	
 	

 (4#K0	 	 	IIGinn&&''   (i&&(())51JT]+K+K C $COI%+8??,,---..0011%%l33t99q==X66 h''' 	,+553t99??44$4??G,W55C#COIrA   c                    | j                                         }d|vrdS d|v rt                              d           |S d|v rt                              d           |S 	 | j                                         }| d| }|                     ||          S # t          $ r<}t                              d|	           |                     ||          cY d }~S d }~ww xY w)
N - z Failed with empty error message.zunsupported requestz0Failed to explain problems. Unsupported request.r_  z=Skipping error explanation. Excluded by strict repo priority.
zFailed to explain problems)exc_info)rE   r   rH   r   explain_problems_explain_with_pinsrP  warning)rQ   r   legacy_errorsexplained_errorsr   r   s         r?   r   z(LibMambaSolver._prepare_problems_message  s   3355%%55 M11HHGHHH  0MAAHHTUUU  	6#{;;==
 #88&688C**3555  	@ 	@ 	@KK4sKCCC**=$????????	@s   !B 
C!1CCCc                 p    |r3d|v r/d}|                                 D ]\  }}|d| d| dz  }| d| S |S )u  
        Add info about pins to the error message.
        This might be temporary as libmamba improves their error messages.
        As of 1.5.0, if a pin introduces a conflict, it results in a cryptic error message like:

        ```
        Encountered problems while solving:
          - cannot install both pin-1-1 and pin-1-1

        Could not solve for environment specs
        The following packages are incompatible
        └─ pin-1 is installable with the potential options
            ├─ pin-1 1, which can be installed;
            └─ pin-1 1 conflicts with any installable versions previously reported.
        ```

        Since the pin-N name is masked, we add the following snippet underneath:

        ```
        Pins seem to be involved in the conflict. Currently pinned specs:
         - python 2.7.* (labeled as 'pin-1')

        If Python is involved, try adding it explicitly to the command-line.
        ```
        zpin-1zBPins seem to be involved in the conflict. Currently pinned specs:
r  z (labeled as 'z')
z

)r   )rQ   r   r   pin_messagepin_namerU   s         r?   r  z!LibMambaSolver._explain_with_pins  sq    4  	1Gw&&_K"&**,, H H$GTGGGGGG00;000rA   conflicting_specsr   c                 *   |                                  sd S ddlm} t          d | j        D             t
          j                  } |t          |                                          t          |	                                          ||          }|)Nr'   )%ExplainedDependencyNeedsBuildingErrorc              3   &   K   | ]}|d k    |V  dS )re   Nr2   )r=   r   s     r?   r@   z>LibMambaSolver._maybe_raise_for_conda_build.<locals>.<genexpr>  s,      OO&Fh<N<Nv<N<N<N<NOOrA   )packages
matchspecsr   explanation)
r   conda_build_exceptionsr  rg  r5   r   r   r   rx  r   )rQ   r  r   r  r   r   s         r?   rw  z+LibMambaSolver._maybe_raise_for_conda_build  s     ,,.. 	FQQQQQQ OODLOOOQXQ_``33+002233-446677	
 
 
 	rA   c                 F   | j         t          d          t          j        |j        | j         t          j        t          j                            }|                                \  \  }}}}|D ]q\  }	}
|j	        
                                D ]7\  }}|j        r|j        |
k    r|j                            |d d            n8t                              d|
           r|                                 }|D ]\  }}
}|                     |||
||          }|j	                            |j                  }|r8|j        dk    r-|j        dk    r"|j        |j        k    r|j        |j        k    r|}|j                            |j        |d           t2          r|r|j                                        D ]j}dt7          |          vr|j        j        r#t=          |j        j                  |j        _        t=          |j        j                  |j        _        gd S d S d S )	Nru  zUnlinked by solverr   z9Tried to unlink %s but it is not installed or manageable?)for_conda_buildre   z'Part of solution calculated by libmamba%)rE   r   r   Transactionr   MultiPackageCacher   	pkgs_dirsto_condar   r   r   fnr   r{  rH   warnr   !_package_record_from_json_payloadr   rN   r   r  r  ry  r   r   rK   rh   locationr   )rQ   r   r   r   transactionnames_to_addnames_to_removeto_link	to_unlinkr   filenamerN   r   r  rh   json_payloadalready_installed_records                    r?   r   z%LibMambaSolver._export_solved_records"  s    ;Z[[[oKK!'"344
 

 ?J>R>R>T>T;')$ 		` 		`KAx ( 2 8 8 : : ` `f) 9((%))$=Q)RRRE ) TV^___7799/6 	 	+GX|;;w, <  F (0'9'='=fk'J'J$(2MX--,3x??N&>&FFFL$<$BBB 2!!V,U "    
  	Jo 	J#+2244 J Jc&kk))>* V.<V^=T.U.UFN+&4V^5H&I&I##	J 	J 	J 	JJ JrA   rh   pkg_filenamer  r  c                     |                     d          r"d|v rt          di t          j        |          S t          j        |          }	 |                    |          }nP# t
          $ rC t          | j                  }|                    |d                   }	|	r|	j	        |k    r|	cY S Y nw xY w||d<   |j
        |d<   |r@t          j                                        D ]!\  }
}d |D             }|j        |v r|
|d<    n"t          |j        |          |d<   |                    d          s|j
        j        |d<   |d         d	k    r8t%          d
 |                    dd          D                       rd|d	<   nd|d	<   t          di |S )a2  
        The libmamba transactions cannot return full-blown objects from the C/C++ side.
        Instead, it returns the instructions to build one on the Python side:

        channel_info: dict
            Channel datas, as built in .index.LibmambaIndexHelper._fetch_channel()
            This is retrieved from the .index._index mapping, keyed by channel URLs
        pkg_filename: str
            The filename (.tar.bz2 or .conda) of the selected record.
        json_payload: str
            A str-encoded JSON payload with the PackageRecord kwargs.
        r  z/@/rN   r  rh   c                 D    g | ]}|                     d           D ]}|S )F)with_credentials)rq   rr   s      r?   ru   zDLibMambaSolver._package_record_from_json_payload.<locals>.<listcomp>  s4    [[[AFFTYF<Z<Z[[S[[[[rA   rt   r   re   c              3   N   K   | ] }|                                 d          dv V  !dS )r   )r  pypyN)r   )r=   r<  s     r?   r@   zCLibMambaSolver._package_record_from_json_payload.<locals>.<genexpr>  s4      ]]C399;;q>%77]]]]]]rA   r0  r2   r  generic)r  r$   rz   loadsget_infoKeyErrorr   rR   r   r  rh   r   custom_multichannelsr   
noauth_urlr   full_urlr   any)rQ   r   rh   r  r  r  rQ  channel_infopdr   multichannel_namemc_channelsrq   s                r?   r  z0LibMambaSolver._package_record_from_json_payload^  s   * ""4(( 	=Ug-=-= <<4:l#;#;<<<L))		 >>'22LL 	 	 	 DK((BVVF6N++F &)|33	 $t(0y 	 3:2N2T2T2V2V  .!;[[[[[[*d22(9F9%E 3 !!6EEuzz(## 	;+3:F8(x'']]6::iY[C\C\]]]]] -#+x  #,x &&v&&&s   A# #AB0/B0
match_specc           	         |dS d}g }|j         D ]2}|                    |          }|r||vr|                    |           3|r$t          |d| dt	          |           d          |                    d          dk    rut
          j        t          k    r`|j        	                                }|dv s|
                    d	          rd
}n|
                    d          rd}nd}t          ||          }|S )z
        Make sure we are not silently ingesting MatchSpec fields we are not
        doing anything with!

        TODO: We currently allow `subdir` but we are not handling it right now.
        N)rN   r  r  rh   r   zULibmamba only supports a subset of the MatchSpec interface for now. You can only use z, but you tried to use r  rh   defaults)rrpy2rstudio)zr-z_r-zmro-zpkgs/r)zm2-zm2w64-zmsys2-z
pkgs/msys2z	pkgs/main)rh   )FIELD_NAMESget_raw_valuerO   r   r   r   default_channelsr   rN   lowerr  r#   )rQ   r  	supportedunsupported_but_setfieldvaluerN   rh   s           r?   r&  z!LibMambaSolver._check_spec_compat  sM    4C	 + 	2 	2E,,U33E 2i//#**5111 	"1$-1 1,--1 1 1   $$Y//:==(,<<< ?((**D///4??CX3Y3Y/"!<== &&%":w???JrA   c                 "    d | _         d | _        d S r;   )rE   rF   r   s    r?   _resetzLibMambaSolver._reset  s    #rA   c                 |    t          | dd          o+dt          j        v oddhd t                      D             k    S )a+  
        conda build calls the solver via `conda.plan.install_actions`, which
        overrides Solver._index (populated in the classic solver, but empty for us)
        with a custom index. We can use this to detect whether conda build is in use
        and apply some compatibility fixes.
        r   Nconda_buildinstall_actionsget_install_actionsc                     h | ]
}|d          S )r   r2   )r=   frames     r?   r  z:LibMambaSolver._called_from_conda_build.<locals>.<setcomp>  s    >]>]>]EuQx>]>]>]rA   )r   rL   modulesr   r   s    r?   r   z'LibMambaSolver._called_from_conda_build  sT     D(D)) ^,^ #$9:>]>]UZU\U\>]>]>]]	
rA   final_statec                    ||dS t           j        rt           j        rdS d}t          j                            t           j        d          }t          t          t                    5  t          j        
                    |          rt          j        |          D ]}|                                r|j                            d          r|j                            dd          d         dk    r^t!          |j                  5 }t#          di t%          j        |                                          }ddd           n# 1 swxY w Y    nddd           n# 1 swxY w Y   |sdS |j        j        }|t.          dd	d
fv rd}d |j        D             }	||	vrdS | dt2           }
t5          |
          t7          | j        t           j                  rt;          fd|D                       rdS |                    |
          }|rPt?          |d           }tA          tC          dt2           d|j"         d| d          tF          j$                   dS dS )a  
        We are overriding the base class implementation, which gets called in
        Solver.solve_for_diff() once 'link_precs' is available. However, we
        are going to call it before (in .solve_final_state(), right after the solve).
        That way we can reuse the IndexHelper and SolverOutputState instances we have
        around, which contains the channel and env information we need, before losing them.
        Nz
conda-metaz.jsonrL  r   r   conda@z	<develop>pypir  c                 0    h | ]}t          |d |          S r   )r   )r=   chns     r?   r  z8LibMambaSolver._notify_conda_outdated.<locals>.<setcomp>  s%    YYY#'#'7==YYYrA   z::conda>c              3   B   K   | ]}                     |          V  d S r;   )r$  )r=   r   conda_newer_specs     r?   r@   z8LibMambaSolver._notify_conda_outdated.<locals>.<genexpr>  s2      LLf#))&11LLLLLLrA   c                 *    t          | j                  S r;   )r&   r  )xs    r?   <lambda>z7LibMambaSolver._notify_conda_outdated.<locals>.<lambda>&  s    L<S<S rA   )rA  zq

                    ==> WARNING: A newer version of conda exists. <==
                        current version: z)
                        latest version: zh

                    Please update conda by running

                        $ conda update -n base -c z conda

                    )rg   r2   )%r   notify_outdated_condar   r   r   r   conda_prefixr   OSErrorrB   lexistsscandiris_filerN   endswithrN  openr%   rz   r  readrh   r   r   r   r   r#   r   rR   r  searchr   printr   r  rL   stderr)rQ   
link_precsr   r  current_conda_prefix_recconda_meta_prefix_directoryentryfchannel_nameindex_channelsconda_newer_strconda_newer_recordsnewestr  s                @r?   r   z%LibMambaSolver._notify_conda_outdated  sF    =[0 F, 	 	F $( &(gll73G&V&V#gz** 
	 
	w:;; 	Z(CDD  E!J//88 "J--c155a8GCC!%*-- \7C7[7[djQRQWQWQYQYFZFZ7[7[4\ \ \ \ \ \ \ \ \ \ \ \ \ \ \
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 ( 	 F/7FOS+vFFF%L ZYYYY~--F *CC>CC$_55
 t{G$899 	LLLLLLLLL  $ll?;;  	,2S2STTTF
 +9
 
 *0	
 
 4@
 
 
  Z     	 	s7   (BE1E6EEE	E
EE #E )r2   )r'   )NNNr2   r;   rp   )NN)4__name__
__module____qualname____doc__	_uses_sscr   r   rD   staticmethodr   r\   r   r   r"   r   r   r-   r.   r)   r   r|   r   r   r   r   r  r  r  r  r#   rC  r   rK   r   rR  classmethodr	   rr  r
   r   r   r  rw  r   boolr$   r  r&  r  r   r   __classcell__)rY   s   @r?   r1   r1   <   s         I 6P 6P 6P 6P 6P 6Pp YtS S  \S  b b b bH
 
hw.? 
 
 
 
 
% 
% 
%>"> %> #	> > > >@> > >	D#6 	D 	D 	D 	D  9 9"9 %9 #	9
 9 9 9 9v(8 EV       \n,< nIZ n n n n`/? L]    4(5F        \ Gc8C=&8 9 G G G \G 2
s 2
wsI~/F 2
 2
 2
 [2
l 376:(,&(5 55g./5 $CN35 c9n%	5
 7#5 5 5 5n6 6 6 6,  H  "3	>2    4:J":J %:J #	:J :J :J :JD !&8' 8'"8' 8' 	8'
 8' 8' 
8' 8' 8' 8't*U9d?-C *iY]oH^ * * * *X$ $ $
 
 
. &*/3	Z Z #Z m,	Z Z Z Z Z Z Z ZrA   r1   )Ur  rz   loggingr   rE  rL   collectionsr   
contextlibr   	functoolsr   inspectr   textwrapr   typingr   r	   r
   r   r   
libmambapyr   boltons.setutilsr   r  r   r   conda.base.constantsr   r   r   r   conda.base.contextr   conda.common.compatr   conda.common.constantsr   conda.common.ior   r   conda.common.pathr   conda.common.urlr   r   conda.core.prefix_datar   conda.core.solver   conda.exceptionsr   r   r   r    r!   conda.models.channelr"   conda.models.match_specr#   conda.models.recordsr$   r%   conda.models.versionr&    
exceptionsr(   r   r)   r*   mamba_utilsr+   r,   stater-   r.   utilsr/   	getLoggerr  rH   r1   r2   rA   r?   <module>r     s9   
   				 				 



 # # # # # #                         ? ? ? ? ? ? ? ? ? ? ? ? ? ?     ' ' ' ' ' ' / / / / / /            ' & & & & & & & & & & & ' ' ' ' ' ' , , , , , , , , ) ) ) ) ) ) 5 5 5 5 5 5 5 5 - - - - - - # # # # # #              ) ( ( ( ( ( - - - - - - < < < < < < < < - - - - - -       2 2 2 2 2 2 B B B B B B B B 8 8 8 8 8 8 8 8 6 6 6 6 6 6 6 6 ' ' ' ' ' 'g+++,,z z z z zV z z z z zrA   