
    $TXg=                    F   d Z ddlmZ ddlZddl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mZmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZ d
dlmZ 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* d
dl+m,Z, d
dl-m.Z.m/Z/ d
dl0m1Z1 d
dl2m3Z3 d
dl4m5Z5 d
dl6m7Z7m8Z8  ejr                  e:      Z; G d de<      Z=d Z>d Z?d Z@d ZA G d d      ZBe:d k(  rEdd!lCmCZC  eBej                        ZE eCeEj                                 eGeEj                                yy)"z,Tools interfacing with conda's history file.    )annotationsN)literal_eval)EACCESEPERMEROFS)islice)
itemgetter)isdirisfilejoin)dedent   )__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_rec                      e Zd Zy)CondaHistoryWarningN)__name__
__module____qualname__     -lib/python3.12/site-packages/conda/history.pyr!   r!   &   s    r&   r!   c                   | j                  dj                  t        j                  d                   | j                  dj                  dj	                  d t
        j                  D                           | j                  dj                  dj	                  t        t        j                  d      d                         y )	Nz==> {} <==
z%Y-%m-%d %H:%M:%Sz
# cmd: {}
 c              3  2   K   | ]  }t        |        y wN)r   .0ss     r'   	<genexpr>zwrite_head.<locals>.<genexpr>,   s     *Q1+;A+>   z# conda version: {}
.   )
writeformattimestrftimer   sysargvr   CONDA_VERSIONsplit)fos    r'   
write_headr<   *   s    HH^""4==1D#EFGHH]!!#((*Q*Q"QRSHH&&sxx}7J7J37OQR0S'TUr&   c                &    t        d | D              S )Nc              3  >   K   | ]  }|j                  d         yw))-+N)
startswithr,   s     r'   r/   zis_diff.<locals>.<genexpr>3   s     9Aq||J's   )anycontents    r'   is_diffrE   2   s    9999r&   c              #    K   i }i }| D ]s  }|dd  }t        |      \  }}}}|t        k7  r	|d| dz  }|j                  d      r|||j                         <   O|j                  d      sa|||j                         <   u t	        |      t	        |      z  }	t        |	      D ]  }d| d||    d||    d	  t        t	        |      |	z
        D ]  }d| d||      t        t	        |      |	z
        D ]  }d| d||      y w)
Nr   z ()r?   r@   r)   z  {z -> })r   r   rA   lowersetsorted)
diffaddedremovedr.   fnnameversion_channelchangeds
             r'   pretty_diffrU   6   s.    EGqrU$4R$8!gq'++G9A&G<<$+GDJJL!\\#")E$**,  %j3w<'Gw$tGDM?$uT{m2>>  s7|g-.$q(( /s5zG+,$qt&& -s   A'D*B#Dc                V    t        |       rt        |       S t        t        |             S r+   )rE   rU   iterrK   rC   s    r'   pretty_contentrX   K   s$    w7##F7O$$r&   c                      e Zd Z ej                  d      Z ej                  d      Z ej                  d      Zd Zd Z	d Z
d Zd Zdd	Zdd
Zed        Zed        Zd Zd Zd ZddZd Zd Zd ZddZy)Historyz#\s*cmd:\s*(.+)z#\s*(\w+)\s*specs:\s*(.+)?z#\s*conda version:\s*(.+)c                j    || _         t        |d      | _        t        | j                  d      | _        y )Nz
conda-metahistory)prefixr   meta_dirpath)selfr]   s     r'   __init__zHistory.__init__W   s)    V\2	2	r&   c                &    | j                          | S r+   )init_log_filer`   s    r'   	__enter__zHistory.__enter__\   s    r&   c                $    | j                          y r+   )update)r`   exc_type	exc_value	tracebacks       r'   __exit__zHistory.__exit__`   s    r&   c                0    t        | j                  d       y )NT)r   r_   rd   s    r'   rc   zHistory.init_log_filec   s    diir&   c                Z    t        j                  | j                        j                  dk(  S )Nr   )osstatr_   st_sizerd   s    r'   file_is_emptyzHistory.file_is_emptyf   s     wwtyy!))Q..r&   c                   	 	 t        | j                               }t        | j                        }|j                         D ch c]  }|j                          }}| j                  ||       y# t        $ r4}t        j                  d| j
                   d| t               Y d}~yd}~ww xY wc c}w # t        $ rC}|j                  t        t        t         fv r t#        | j
                  |j                         d}~ww xY w)z:Update the history file (creating a new one if necessary).z	Error in z: N)rJ   	get_stater   warningswarnr_   r!   r   r]   iter_recordsdist_strwrite_changesOSErrorerrnor   r   r   r   )r`   lastepd
prefix_reccurrs         r'   rg   zHistory.updatei   s    	4>>+, DKK(B<>OO<MN<MjJ'')<MDNtT* % 	$))Bqc:<OP O 	ww65%00&tyy!''::		sF   A/ 'B4 B/B4 /	B,8*B'"B4 'B,,B4 4	D =>C;;D c                .   g }t        | j                        s|S t        j                  d      }t	        | j                        5 }|j                         j                         }ddd       D ]  }|j                         }|s|j                  |      }|r,|j                  |j                  d      t               g f       U|j                  d      r|r|d   d   j                  |       |s|d   d   j                  |        |S # 1 sw Y   xY w)a
  Parse 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   r_   recompiler   read
splitlinesstripmatchappendgrouprJ   rA   add)r`   ressep_patflineslinems          r'   parsezHistory.parsez   s     dii J**12tyy!QFFH'')E "D::<Dd#A

AGGAJr23%#B
!!$'B
t$  
 "!s   DDc                    g }| j                  d      D ]D  }t        j                  |      r|rdj                  |d   |g      |d<   4|j	                  |       F |S )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_stringz&History._parse_old_format_specs_string   s^      &&s+D #((.5HHeBi%67b	T" , r&   c                   i }| j                   j                  |      }|r=|j                  d      j                         }|d   j	                  d      rd|d<   ||d<   | j
                  j                  |      }|r|j                  d      |d<   | j                  j                  |      }|r|j                         \  }}|xs d}||d<   |j                  d      rt        |      }nd|vrt        j                  |      }D cg c]  }|s|j	                  d	      r| }}|r|d
v r|x|d<   |d<   |S |r|dv r|x|d<   |d<   |S |r|dv r
|x|d<   |d<   |S c c}w )aH  
        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[@)rg   installcreateupdate_specsr   )remove	uninstallremove_specs)neuteredneutered_specs)com_patr   r   r:   endswithconda_v_patspec_patgroupsrA   r   rZ   r   )	clsr   itemr   r8   r   r   r   r   s	            r'   _parse_comment_linezHistory._parse_comment_line   s    KKd#771:##%DAw(!QDKOO!!$'$%GGAJD!LLt$#$88: FL'-2L#DN&&s+$\2L(>>|L&+OedtDMM#<NTeEO#BB7<<^$tG}  6%<<7<<^$tG}  6]29>>%&g Ps   EEEc                v   g }| j                         D ]  \  }}}d|i}|D ]$  }| j                  |      }|j                  |       & d|v r|j                  |       t	        t        d      |      }|j                  dd      |d<   |j                  dd      |d<    t        d	 |D              }	|	rt        j                  st        |	t        
      d   }
dj                  t        |
j                  d      d            }dj                  t        t        j                  d      d            }t        |      t        |      k  rtt!        d      | j"                  t        |dz  }t%        | j"                  t        j&                        s"|t)        d      t        j&                  |dz  z  }|t)        d      z  }|S )a+  Return 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   r?   r%   unlink_distsr@   
link_distsc              3  0   K   | ]  }d |v s|d      yw)r   Nr%   )r-   xs     r'   r/   z,History.get_user_requests.<locals>.<genexpr>   s       ,
(+1!/CAos   	
)keyr   r1   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   rg   r   groupbyr	   gettupler   allow_conda_downgradesrK   r   r   r   r:   r9   r   r]   r   root_prefixr   )r`   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_requestszHistory.get_user_requests   s    )-%BX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v  (/':':+>  G 6  
r&   c                H   i }| j                         D ]  }d |j                  dd      D        }|D ]  }|j                  |j                  d          d |j                  dd      D        }|j	                  d |D               d |j                  dd      D        }|j	                  d	 |D                t        | j                        j                         D ch c]  }|j                   }}|j                         D 	ci c]  \  }	}|	|v s|	| c}}	S c c}w c c}}	w )
Nc              3  2   K   | ]  }t        |        y wr+   r   r-   r   s     r'   r/   z2History.get_requested_specs_map.<locals>.<genexpr>!       X8WIdO8Wr0   r   r%   c              3  2   K   | ]  }t        |        y wr+   r   r   s     r'   r/   z2History.get_requested_specs_map.<locals>.<genexpr>$  r   r0   r   c              3  8   K   | ]  }|j                   |f  y wr+   rP   r,   s     r'   r/   z2History.get_requested_specs_map.<locals>.<genexpr>%  s     >AQVVQK   c              3  2   K   | ]  }t        |        y wr+   r   r   s     r'   r/   z2History.get_requested_specs_map.<locals>.<genexpr>'  s      ,MD	$,Mr0   r   c              3  8   K   | ]  }|j                   |f  y wr+   r   r,   s     r'   r/   z2History.get_requested_specs_map.<locals>.<genexpr>*  s     @AQVVQKr   )	r   r   poprP   rg   r   r]   rv   items)
r`   spec_maprequestr   r   r   r   rR   prefix_recsrP   s
             r'   get_requested_specs_mapz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!qvv'MN-5^^-=U-=ztTATd
-=UU OUs   DDDc                n   g }t               }| j                         D ]  \  }}}t        |      s|}n`|D ][  }|j                  d      r|j	                  |dd        )|j                  d      r|j                  |dd        Ot        d|        |j                  ||j                         f        |S )z@Return a list of tuples(datetime strings, set of distributions).r?   r   Nr@   zDid not expect: )	rJ   r   rE   rA   discardr   r   r   copy)r`   r   curr   cont
unused_comr.   s          r'   construct_stateszHistory.construct_states2  s    e$(JJL Bj4=A||C(AabE*c*!"/2B1#0FGG  JJCHHJ'( %1 
r&   c                Z    | j                         }|s
t               S t        | \  }}||   S )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   rJ   zip)r`   revstatestimespkgss        r'   rs   zHistory.get_stateD  s3     &&(5L6ltCyr&   c                    t        | j                               D ]A  \  }\  }}}t        d||fz         t        |      D ]  }t        d|         t                C y )Nz%s  (rev %d)z    )	enumerater   printrX   )r`   ir   rD   r   r   s         r'   	print_logzHistory.print_logR  sW    .7

.E*A*gz.D!9,-&w/TFm$ 0G	 /Fr&   c           	        g }t        | j                               D ]  \  }\  }}}||g g g g d}i }i }t        |      r|D ]e  }	t        |	dd        \  }
}}}|	j	                  d      r|||f||
j                         <   >|	j	                  d      sP|||f||
j                         <   g t        |      t        |      z  }t        |      D ]e  }
||
   }||
   }dj                  |
f|z         dj                  |
f|z         d}||kD  r|d   j                  |       R|d   j                  |       g t        t        |      |z
        D ],  }
|d   j                  dj                  |
f||
   z                . t        t        |      |z
        D ],  }
|d	   j                  dj                  |
f||
   z                . n$t        |      D ]  }	|d	   j                  |	        |j                  |        |S )
N)r   r   r   r   upgrade	downgrader   r@   r?   )oldnewr   r   r   r   )
r   r   rE   r   rA   rI   rJ   rK   r   r   )r`   resultr   r   rD   r   eventrM   rN   pkgrP   rQ   buildrS   rT   r   r   detailss                     r'   
object_logzHistory.object_logY  s   .7

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

- # e*s7|3"7OD!$-C+C"xx#6"xx#6G
 Syi(//8k*11': , #3w<'#9:D(O**388TGgdm4K+LM ; #3u:#78D)$++CHHdWuT{5J,KL 9 "'?C)$++C0 +MM% W /FX r&   c                   t        | j                        st        j                  | j                         t	        j
                  | j                  dd      5 }t        |       t        ||z
        D ]  }|j                  d| d        t        ||z
        D ]  }|j                  d| d        	 d d d        y # 1 sw Y   y xY w)Nabutf-8modeencodingr?   
r@   )
r
   r^   rn   makedirscodecsopenr_   r<   rK   r3   )r`   
last_statecurrent_stater;   rO   s        r'   rx   zHistory.write_changes  s    T]]#KK&[[@BrNZ-781RD$ 9]Z781RD$ 9	 A@@s   AB==Cc                   |D cg c]  }t        t        |             }}|D cg c]  }t        t        |             }}|D cg c]  }t        t        |             }}t        |||f      rqt        j                  | j
                  dd      5 }|r|j                  d| d       |r|j                  d| d       |r|j                  d| d       d d d        y y c c}w c c}w c c}w # 1 sw Y   y xY w)Nr   r   r   z# remove specs: r   z# update specs: z# neutered specs: )strr   rB   r  r  r_   r3   )r`   r   r   r   r.   fhs         r'   write_specszHistory.write_specs  s    3?@<aIaL)<@3?@<aIaL)<@5CD^#il+^DlN;<TYYTGDHH/~R@AHH/~R@A!HH1.1ADE ED = A@DDDs   C$C)C.AC33C<N)returnNone)r	  z%list[tuple[str, set[str], list[str]]])r   )r%   r%   r%   )r"   r#   r$   r   r   r   r   r   ra   re   rk   rc   rq   rg   r   staticmethodr   classmethodr   r   r   r   rs   r   r   rx   r  r%   r&   r'   rZ   rZ   R   s    bjj+,Grzz78H"**9:K3
/"6  & + +ZDLV*$.`%Fr&   rZ   __main__)pprint)I__doc__
__future__r   r  loggingrn   r   r7   r5   rt   astr   rz   r   r   r   	itertoolsr   operatorr	   os.pathr
   r   r   textwrapr   r   r   r9   
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   	getLoggerr"   logWarningr!   r<   rE   rU   rX   rZ   r  r]   hr   r   r   r%   r&   r'   <module>r'     s    3 "   	 	 
    & &   ' '  *  1 ! 6 8 $ ( ; ' ) ( =g!	' 	:'*%LF LF^
 z 	

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