
    <Bh=                    H   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	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$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K0J1r1  S
SK2J3r3  S
SK4J5r5  S
SK6J7r7J8r8  \Rr                  " \:5      r; " S S\<5      r=S r>S r?S r@S rA " S S5      rB\:S :X  aE  SS!KCJCrC  \B" \R                  5      rE\C" \ER                  5       5        \G" \ER                  5       5        gg)"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                      \ 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_headr@   *   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)
startswithr/   s     r*   r2   is_diff.<locals>.<genexpr>3   s     9A||J''s   )anycontents    r*   is_diffrJ   2   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 ()rC   rD   r,   z  {z -> })r   r   rE   lowersetsorted)
diffaddedremovedr1   fnnameversion_channelchangeds
             r*   pretty_diffrZ   6   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      $ r.   )rJ   rZ   iterrP   rH   s    r*   pretty_contentr]   K   s'    w7##F7O$$r)   c                  
   \ rS rSr\R
                  " S5      r\R
                  " S5      r\R
                  " S5      rS 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)HistoryR   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)selfrc   s     r*   __init__History.__init__W   s'    V\2	2	r)   c                &    U R                  5         U $ r.   )init_log_filerf   s    r*   	__enter__History.__enter__\   s    r)   c                $    U R                  5         g r.   )update)rf   exc_type	exc_value	tracebacks       r*   __exit__History.__exit__`   s    r)   c                0    [        U R                  S5        g )NT)r   re   rk   s    r*   rj   History.init_log_filec   s    diir)   c                \    [         R                  " U R                  5      R                  S:H  $ )Nr   )osstatre   st_sizerk   s    r*   file_is_emptyHistory.file_is_emptyf   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)rO   	get_stater   warningswarnre   r!   r   rc   iter_recordsdist_strwrite_changesOSErrorerrnor   r   r   r   )rf   lastepd
prefix_reccurrs         r*   ro   History.updatei   s    	4>>+, DKK(B<>OO<MN<Mj'')<MDNt* % 	$))Bqc:<OP O 	ww65%00&tyy!''::		sG   A/ &B6 B1B6 /
B.9+B)$B6 )B..B6 6
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   re   recompiler   read
splitlinesstripmatchappendgrouprO   rE   add)rf   ressep_patflineslinems          r*   parseHistory.parsez   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[@)ro   installcreateupdate_specsr   )remove	uninstallremove_specs)neuteredneutered_specs)com_patr   r   r>   endswithconda_v_patspec_patgroupsrE   r   r_   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   rC   r#   unlink_distsrD   
link_distsc              3  <   #    U  H  nS U;   d  M  US    v   M     g7f)r   Nr#   )r0   xs     r*   r2   ,History.get_user_requests.<locals>.<genexpr>   s"      ,
(+1!/CAos   
)keyr   r5   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   ro   r   groupbyr	   gettupler   allow_conda_downgradesrP   r   r   r   r>   r=   r   rc   r   root_prefixr   )rf   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                L   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r.   r   r0   r   s     r*   r2   2History.get_requested_specs_map.<locals>.<genexpr>!       X8WIdOO8Wr4   r   r#   c              3  8   #    U  H  n[        U5      v   M     g 7fr.   r   r   s     r*   r2   r   $  r   r4   r   c              3  <   #    U  H  oR                   U4v   M     g 7fr.   rU   r/   s     r*   r2   r   %  s     >AVVQK   c              3  8   #    U  H  n[        U5      v   M     g 7fr.   r   r   s     r*   r2   r   '  s      ,MD	$,Mr4   r   c              3  <   #    U  H  oR                   U4v   M     g 7fr.   r   r/   s     r*   r2   r   *  s     @AVVQKr   )	r   r   poprU   ro   r   rc   r   items)
rf   spec_maprequestr   r   r   r   rW   prefix_recsrU   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).rC   r   NrD   zDid not expect: )	rO   r   rJ   rE   discardr   r   r   copy)rf   r   curr   cont
unused_comr1   s          r*   construct_statesHistory.construct_states2  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   rO   zip)rf   revstatestimespkgss        r*   r~   History.get_stateD  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]   )rf   ir   rI   r   r   s         r*   	print_logHistory.print_logR  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   rD   rC   )oldnewr  r  r   r   )
r   r   rJ   r   rE   rN   rO   rP   r   r   )rf   resultr  r   rI   r   eventrR   rS   pkgrU   rV   buildrX   rY   r  r  detailss                     r*   
object_logHistory.object_logY  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        [        R
                  " 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abutf-8modeencodingrC   
rD   )
r
   rd   rx   makedirscodecsopenre   r@   rP   r7   )rf   
last_statecurrent_stater?   rT   s        r*   r   History.write_changes  s    T]]##KK&[[@BrNZ781RD$ 9]781RD$ 9	 A@@s   AC
Cc                6   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      (       a~  [        R                  " 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   rG   r  r  re   r7   )rf   r   r   r   r1   fhs         r*   write_specsHistory.write_specs  s    3?@<aIaL)<@3?@<aIaL)<@5CD^#il+^DN;<<TYYTGDHH/~R@AHH/~R@A!HH1.1ADE ED = A@DDDs   C;D 
DAD


D)rd   re   rc   N)returnNone)r"  z%list[tuple[str, set[str], list[str]]])r   )r#   r#   r#   )r$   r%   r&   r'   r   r   r   r   r   rg   rl   rs   rj   r{   ro   r   staticmethodr   classmethodr   r   r   r   r~   r  r  r   r   r(   r#   r)   r*   r_   r_   R   s    jj+,Gzz78H**9:K3
/"6  & + +ZDLV*$.`%Fr)   r_   __main__)pprint)I__doc__
__future__r   r  loggingrx   r   r;   r9   r   astr   r   r   r   r   	itertoolsr   operatorr	   os.pathr
   r   r   textwrapr   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   	getLoggerr$   logWarningr!   r@   rJ   rZ   r]   r_   r'  rc   hr   r   r   r#   r)   r*   <module>r@     s    3 "   	 	 
    & &   ' '  *  1 ! 6 8 $ ( ; ' ) ( =!	' 	:'*%LF LF^
 z 	

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