
    siM=                    f   S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSK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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!  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/J0r0  SSK1J2r2  SSK3J4r4  SSK5J6r6  SSK7J8r8J9r9  \(       a  SSK*J:r:  \Rv                  " \<5      r= " S S\>5      r?S r@S rAS rBS rC " S  S!5      rD\<S":X  aE  SS#KEJErE  \D" \R                  5      rG\E" \GR                  5       5        \I" \GR                  5       5        gg)$z,Tools interfacing with conda's history file.    )annotationsN)literal_eval)EACCESEPERMEROFS)islice)
itemgetter)isdirisfilejoin)dedent)TYPE_CHECKING   )__version__)dals)DEFAULTS_CHANNEL_NAME)context)ensure_text_type	open_utf8)groupby_to_dict)paths_equal)
PrefixData)CondaHistoryErrorNotWritableError)touch)dist_str_to_quad	MatchSpec)VersionOrderversion_relation_re)PathTypec                      \ rS rSrSrg)CondaHistoryWarning)    N)__name__
__module____qualname____firstlineno____static_attributes__r%       -lib/python3.13/site-packages/conda/history.pyr#   r#   )   s    r+   r#   c                   U R                  SR                  [        R                  " S5      5      5        U R                  SR                  SR	                  S [
        R                   5       5      5      5        U R                  SR                  SR	                  [        [        R                  " S5      S5      5      5      5        g )	Nz==> {} <==
z%Y-%m-%d %H:%M:%Sz
# cmd: {}
 c              3  8   #    U  H  n[        U5      v   M     g 7fN)r   .0ss     r,   	<genexpr>write_head.<locals>.<genexpr>/   s     *Q1+;A+>+>   z# conda version: {}
.   )
writeformattimestrftimer   sysargvr   CONDA_VERSIONsplit)fos    r,   
write_headrB   -   s    HH^""4==1D#EFGHH]!!#((*Q*Q"QRSHH&&sxx}7J7J37OQR0S'TUr+   c                &    [        S U  5       5      $ )Nc              3  B   #    U  H  oR                  S 5      v   M     g7f))-+N)
startswithr1   s     r,   r4   is_diff.<locals>.<genexpr>6   s     9A||J''s   )anycontents    r,   is_diffrL   5   s    9999r+   c              #  8  #    0 n0 nU  H}  nUSS  n[        U5      u  pVpxU[        :w  a	  USU S3-  nUR                  S5      (       a  XbUR                  5       '   MS  UR                  S5      (       d  Mk  XaUR                  5       '   M     [	        U5      [	        U5      -  n	[        U	5       H  nSU SX%    SX    S	3v   M     [        [	        U5      U	-
  5       H  nSU SX%    3v   M     [        [	        U5      U	-
  5       H  nSU SX    3v   M     g 7f)
Nr   z ()rE   rF   r.   z  {z -> })r   r   rG   lowersetsorted)
diffaddedremovedr3   fnnameversion_channelchangeds
             r,   pretty_diffr\   9   s#    EGqrU$4R$8!q++G9A&G<<$+DJJL!\\#")$**,  %j3w<'Gw$tGM?$u{m2>>  s7|g-.$q(( /s5zG+,$q&& -s   A.D4B&Dc                `    [        U 5      (       a  [        U 5      $ [        [        U 5      5      $ r0   )rL   r\   iterrR   rJ   s    r,   pretty_contentr_   N   s'    w7##F7O$$r+   c                     \ rS rSr\R
                  " S5      r\R
                  " S5      r\R
                  " S5      rSS jr	S r
S rS rS	 rSS
 jrSS jr\S 5       r\S 5       rS rS rS rSS jrS rS rS rSS jrSrg)HistoryU   z#\s*cmd:\s*(.+)z#\s*(\w+)\s*specs:\s*(.+)?z#\s*conda version:\s*(.+)c                h    Xl         [        US5      U l        [        U R                  S5      U l        g )Nz
conda-metahistory)prefixr   meta_dirpath)selfre   s     r,   __init__History.__init__Z   s'    V\2	2	r+   c                &    U R                  5         U $ r0   )init_log_filerh   s    r,   	__enter__History.__enter___   s    r+   c                $    U R                  5         g r0   )update)rh   exc_type	exc_value	tracebacks       r,   __exit__History.__exit__c   s    r+   c                0    [        U R                  S5        g )NT)r   rg   rm   s    r,   rl   History.init_log_filef   s    diir+   c                \    [         R                  " U R                  5      R                  S:H  $ )Nr   )osstatrg   st_sizerm   s    r,   file_is_emptyHistory.file_is_emptyi   s     wwtyy!))Q..r+   c                     [        U R                  5       5      n[        U R                  5      nUR                  5        Vs1 s H  oDR                  5       iM     nnU R                  X5        g! [         a5  n[        R                  " SU R
                   SU 3[        5         SnAgSnAff = fs  snf ! [         aE  nUR                  [        [        [         4;   a   [#        U R
                  UR                  5      ee SnAff = f)z:Update the history file (creating a new one if necessary).z	Error in z: N)rQ   	get_stater   warningswarnrg   r#   r   re   iter_recordsdist_strwrite_changesOSErrorerrnor   r   r   r   )rh   lastepd
prefix_reccurrs         r,   rq   History.updatel   s    	4>>+, DKK(B<>OO<MN<Mj'')<MDNt* % 	$))Bqc:<OP O 	ww65%00&tyy!''::		sG   A0 'B7 B2B7 0
B/:+B*%B7 *B//B7 7
DA DDc                   / n[        U R                  5      (       d  U$ [        R                  " S5      n[	        U R                  5       nUR                  5       R                  5       nSSS5        W H  nUR                  5       nU(       d  M  UR                  U5      nU(       a-  UR                  UR                  S5      [        5       / 45        Ma  UR                  S5      (       a   U(       a  US   S   R                  U5        M  U(       d  M  US   S   R                  U5        M     U$ ! , (       d  f       N= f)zParse the history file.

Return a list of tuples(datetime strings, set of distributions/diffs, comments).

Comments appearing before the first section header (e.g. ``==> 2024-01-01 00:00:00 <==``)
in the history file will be ignored.
z==>\s*(.+?)\s*<==Nr   #   )r   rg   recompiler   read
splitlinesstripmatchappendgrouprQ   rG   add)rh   ressep_patflineslinems          r,   parseHistory.parse}   s     dii  J**12tyy!QFFH'')E "D::<Dd#A

AGGAJr23%%#B
!!$'B
t$  
 "!s   
D00
D>c                    / nU R                  S5       HQ  n[        R                  " U5      (       a"  U(       a  SR                  US   U/5      US'   M@  UR	                  U5        MS     U$ )z
Parse specifications string that use conda<4.5 syntax.

Examples
--------
  - "param >=1.5.1,<2.0'"
  - "python>=3.5.1,jupyter >=1.0.0,<2.0,matplotlib >=1.5.1,<2.0"
,r   )r@   r    r   r   r   )specs_stringspecsspecs      r,   _parse_old_format_specs_string&History._parse_old_format_specs_string   sa      &&s+D #((..5HHeBi%67b	T" , r+   c                <   0 nU R                   R                  U5      nU(       aA  UR                  S5      R                  5       nUS   R	                  S5      (       a  SUS'   XBS'   U R
                  R                  U5      nU(       a  UR                  S5      US'   U R                  R                  U5      nU(       a  UR                  5       u  pVU=(       d    SnXRS'   UR                  S5      (       a  [        U5      nOSU;  a  [        R                  U5      nW Vs/ s H%  o(       d  M  UR	                  S	5      (       a  M#  UPM'     nnU(       a  US
;   a  U=US'   US'   U$ U(       a  US;   a  U=US'   US'   U$ U(       a  US;   a
  U=US'   US'   U$ s  snf )a  
Parse comment lines in the history file.

These lines can be of command type or action type.

Examples
--------
  - "# cmd: /scratch/mc3/bin/conda install -c conda-forge param>=1.5.1,<2.0"
  - "# install specs: python>=3.5.1,jupyter >=1.0.0,<2.0,matplotlib >=1.5.1,<2.0"
r   r   condacmdconda_version action[@)rq   installcreateupdate_specsr   )remove	uninstallremove_specs)neuteredneutered_specs)com_patr   r   r@   endswithconda_v_patspec_patgroupsrG   r   ra   r   )	clsr   itemr   r>   r   r   r   r   s	            r,   _parse_comment_lineHistory._parse_comment_line   s    KKd#771:##%DAw((!QKOO!!$'$%GGAJD!LLt$#$88: F'-2L#N&&s++$\2L(>>|L&+OedtTDMM#<NTeEO#BB7<<^$tG}  6%<<7<<^$tG}  6]29>>%&g Ps    
F.FFc                   / nU R                  5        H  u  p#nSU0nU H%  nU R                  U5      nUR                  U5        M'     SU;   a  UR                  U5        [	        [        S5      U5      nUR                  SS5      US'   UR                  SS5      US'   M     [        S	 U 5       5      n	U	(       Ga  [        R                  (       d  [        U	[        S
9S   n
SR                  [        U
R                  S5      S5      5      nSR                  [        [        R                  " S5      S5      5      n[        U5      [        U5      :  ay  [!        S5      U R"                  [        US.-  n[%        U R"                  [        R&                  5      (       d"  U[)        S5      [        R&                  US.-  -  nU[)        S5      -  nU$ )zReturn a list of user requested items.

Each item is a dict with the following keys:
'date': the date and time running the command
'cmd': a list of argv of the actual command which was run
'action': install/remove/update
'specs': the specs being used
dater   r   rE   r%   unlink_distsrF   
link_distsc              3  <   #    U  H  nS U;   d  M  US    v   M     g7f)r   Nr%   )r2   xs     r,   r4   ,History.get_user_requests.<locals>.<genexpr>   s"      ,
(+1!/CAos   
)keyr   r7   r   a  
                This environment has previously been operated on by a conda version that's newer
                than the conda currently being used. A newer version of conda is required.
                  target environment location: %(target_prefix)s
                  current conda version: %(conda_version)s
                  minimum conda version: %(minimum_version)s
                )target_prefixr   minimum_versionz
                    Update conda and try again.
                        $ conda install -p "%(base_prefix)s" "conda>=%(minimum_version)s"
                    )base_prefixr   z
                To work around this restriction, one can also set the config parameter
                'allow_conda_downgrades' to False at their own risk.
                )r   r   rq   r   groupbyr	   gettupler   allow_conda_downgradesrR   r   r   r   r@   r?   r   re   r   root_prefixr   )rh   r   dtunused_contcommentsr   r   comment_itemsdistsconda_versions_from_historyminimum_conda_versionminimum_major_minorcurrent_major_minormessages                 r,   get_user_requestsHistory.get_user_requests   s    )-%BXB<D  $ 8 8 >M* ! }

4 JqM;7E#(99S"#5D !&3!3D *6 ', ,
(+,
 '
# 'w/M/M$*+%%! #&((62G2M2Mc2RTU+V"W"%((6-2E2Ec2JA+N"O/0<@S3TT &*[[%2': #4;;0C0CDDv  (/':':+>  G 6  
r+   c                Z   0 nU R                  5        H  nS UR                  SS5       5       nU H  nUR                  UR                  S 5        M!     S UR                  SS5       5       nUR	                  S U 5       5        S UR                  SS5       5       nUR	                  S	 U 5       5        M     [        U R                  5      R                  5        Vs1 s H  owR                  iM     nnUR                  5        V	Vs0 s H  u  pX;   d  M  X_M     snn	$ s  snf s  snn	f )
Nc              3  8   #    U  H  n[        U5      v   M     g 7fr0   r   r2   r   s     r,   r4   2History.get_requested_specs_map.<locals>.<genexpr>$       X8WIdOO8Wr6   r   r%   c              3  8   #    U  H  n[        U5      v   M     g 7fr0   r   r   s     r,   r4   r   '  r   r6   r   c              3  <   #    U  H  oR                   U4v   M     g 7fr0   rW   r1   s     r,   r4   r   (  s     >AVVQK   c              3  8   #    U  H  n[        U5      v   M     g 7fr0   r   r   s     r,   r4   r   *  s      ,MD	$,Mr6   r   c              3  <   #    U  H  oR                   U4v   M     g 7fr0   r   r1   s     r,   r4   r   -  s     @AVVQKr   )	r   r   poprW   rq   r   re   r   items)
rh   spec_maprequestr   r   r   r   rY   prefix_recsrW   s
             r,   get_requested_specs_mapHistory.get_requested_specs_map   s   --/GXNTV8WXL$TYY- %XNTV8WXLOO>>>,3KK8H",MN OO@@@ 0 (2$++'>'K'K'MN'M!vv'MN-5^^-=U-=ztAT

-=UU OUs   D"	D'D'c                   / n[        5       nU R                  5        H  u  p4n[        U5      (       d  UnOmU Hg  nUR                  S5      (       a  UR	                  USS 5        M/  UR                  S5      (       a  UR                  USS 5        M[  [        SU 35      e   UR                  X2R                  5       45        M     U$ )z@Return a list of tuples(datetime strings, set of distributions).rE   r   NrF   zDid not expect: )	rQ   r   rL   rG   discardr   r   r   copy)rh   r   curr   cont
unused_comr3   s          r,   construct_statesHistory.construct_states5  s    e$(JJL Bj4==A||C((AabE*c**!"/2B1#0FGG  JJHHJ'( %1 
r+   c                `    U R                  5       nU(       d
  [        5       $ [        U6 u  p4XA   $ )zReturn the state, i.e. the set of distributions, for a given revision.

Defaults to latest (which is the same as the current state when
the log file is up-to-date).

Returns a list of dist_strs.
)r   rQ   zip)rh   revstatestimespkgss        r,   r   History.get_stateG  s/     &&(5L6lyr+   c                    [        U R                  5       5       HB  u  nu  p#n[        SX!4-  5        [        U5       H  n[        SU 35        M     [        5         MD     g )Nz%s  (rev %d)z    )	enumerater   printr_   )rh   ir   rK   r   r   s         r,   	print_logHistory.print_logU  sS    .7

.E*A*z.D9,-&w/TFm$ 0G	 /Fr+   c           	        / n[        U R                  5       5       GH  u  nu  p4nUU/ / / / S.n0 n0 n[        U5      (       Ga  U Hl  n	[        U	SS  5      u  ppU	R	                  S5      (       a  XU4XzR                  5       '   M@  U	R	                  S5      (       d  MX  XU4XR                  5       '   Mn     [        U5      [        U5      -  n[        U5       Hf  n
X   nXz   nSR                  U
4U-   5      SR                  U
4U-   5      S.nUU:  a  US   R                  U5        MR  US   R                  U5        Mh     [        [        U5      U-
  5       H,  n
US   R                  SR                  U
4X   -   5      5        M.     [        [        U5      U-
  5       H,  n
US	   R                  SR                  U
4Xz   -   5      5        M.     O&[        U5       H  n	US	   R                  U	5        M     UR                  U5        GM     U$ )
N)r   r   r   r   upgrade	downgrader   rF   rE   )oldnewr  r  r   r   )
r  r   rL   r   rG   rP   rQ   rR   r   r   )rh   resultr  r   rK   r   eventrT   rU   pkgrW   rX   buildrZ   r[   r	  r
  detailss                     r,   
object_logHistory.object_log\  s   .7

.E*A*z E EGw"C4DSW4M1D5~~c**/6w.Gjjl+,,180I

- # e*s7|3"7OD!-C+C"xx#6"xx#6G
 Syi(//8k*11': , #3w<'#9:D(O**388TGgm4K+LM ; #3u:#78D)$++CHHdWu{5J,KL 9 "'?C)$++C0 +MM% W /FX r+   c                   [        U R                  5      (       d   [        R                  " U R                  5        [	        U R
                  SSS9 n[        U5        [        X-
  5       H  nUR                  SU S35        M     [        X!-
  5       H  nUR                  SU S35        M     S S S 5        g ! , (       d  f       g = f)Nautf-8modeencodingrE   
rF   )	r
   rf   rz   makedirsopenrg   rB   rR   r9   )rh   
last_statecurrent_staterA   rV   s        r,   r   History.write_changes  s    T]]##KK&$))#8BrNZ781RD$ 9]781RD$ 9	 988s   AB77
Cc                &   U Vs/ s H  n[        [        U5      5      PM     nnU Vs/ s H  n[        [        U5      5      PM     nnU Vs/ s H  n[        [        U5      5      PM     nn[        X!U45      (       as  [        U R                  SSS9 nU(       a  UR                  SU S35        U(       a  UR                  SU S35        U(       a  UR                  SU S35        S S S 5        g g s  snf s  snf s  snf ! , (       d  f       g = f)Nr  r  r  z# remove specs: r  z# update specs: z# neutered specs: )strr   rI   r  rg   r9   )rh   r   r   r   r3   fhs         r,   write_specsHistory.write_specs  s    3?@<aIaL)<@3?@<aIaL)<@5CD^#il+^DN;<<diicG<HH/~R@AHH/~R@A!HH1.1ADE =< = A@D<<s   C3C8C=AD
D)rf   rg   re   N)re   r!   )returnNone)r#  z%list[tuple[str, set[str], list[str]]])r   )r%   r%   r%   )r&   r'   r(   r)   r   r   r   r   r   ri   rn   ru   rl   r}   rq   r   staticmethodr   classmethodr   r   r   r   r   r  r  r   r!  r*   r%   r+   r,   ra   ra   U   s    jj+,Gzz78H**9:K3
/"6  & + +ZDLV*$.`%Fr+   ra   __main__)pprint)K__doc__
__future__r   loggingrz   r   r=   r;   r   astr   r   r   r   r   	itertoolsr   operatorr	   os.pathr
   r   r   textwrapr   typingr   r   r   r?   
auxlib.ishr   base.constantsr   base.contextr   common.compatr   r   common.iteratorsr   r   common.pathr   core.prefix_datar   
exceptionsr   r   gateways.disk.updater   models.distr   models.match_specr   models.versionr   r    r!   	getLoggerr&   logWarningr#   rB   rL   r\   r_   ra   r(  re   hr   r  r   r%   r+   r,   <module>rB     s    3 "  	 	 
    & &   ' '    *  1 ! 6 8 $ ( ; ' ) ( =%!	' 	:'*%LF LF^
 z 	

A
1 !	!
#
#
%& r+   