
    wBf`<                    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)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           
     B   | j                  dt        j                  d      z         | j                  ddj                  d t        j
                  D              z         | j                  ddj                  t        t        j                  d      d            z         y )	Nz==> %s <==
z%Y-%m-%d %H:%M:%Sz
# cmd: %s
 c              3  2   K   | ]  }t        |        y wN)r   .0ss     r'   	<genexpr>zwrite_head.<locals>.<genexpr>,   s     &Mq'7':&M   z# conda version: %s
.   )	writetimestrftimer   sysargvr   CONDA_VERSIONsplit)fos    r'   
write_headr;   *   so    HH^dmm,?@@AHH]chh&MCHH&MMNOHH$sxx}7J7J37OQR0S'TTUr&   c                &    t        d | D              S )Nc              3  >   K   | ]  }|j                  d         yw))-+N)
startswithr,   s     r'   r/   zis_diff.<locals>.<genexpr>1   s     9Aq||J'9s   )anycontents    r'   is_diffrD   0   s    9999r&   c              #    K   i }i }| D ]r  }|dd  }t        |      \  }}}}|t        k7  r|d|z  z  }|j                  d      r|||j                         <   N|j                  d      s`|||j                         <   t 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 (%s)r>   r?   r)   z  {z -> })r   r   r@   lowersetsorted)
diffaddedremovedr.   fnnameversion_channelchangeds
             r'   pretty_diffrS   4   s?    EG *qrU$4R$8!gq'++w((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+   )rD   rS   iterrI   rB   s    r'   pretty_contentrV   I   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__U   s)    V\2	2	r&   c                &    | j                          | S r+   )init_log_filer^   s    r'   	__enter__zHistory.__enter__Z   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]   rb   s    r'   ra   zHistory.init_log_filea   s    diir&   c                Z    t        j                  | j                        j                  dk(  S )Nr   )osstatr]   st_sizerb   s    r'   file_is_emptyzHistory.file_is_emptyd   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)rH   	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'   re   zHistory.updateg   s    	4>>+, DKK(B<>OO<MNjJ'')ND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                B   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|d   d   j                  |       ~t        |      dkD  s|d   d   j                  |        |S # 1 sw Y   xY w)zzParse the history file.

        Return a list of tuples(datetime strings, set of distributions/diffs, comments).
        z==>\s*(.+?)\s*<==Nr   #   r   )r   r]   recompiler   read
splitlinesstripmatchappendgrouprH   r@   lenadd)r^   ressep_patflineslinems          r'   parsezHistory.parsex   s    
 dii J**12$))_ 	*FFH'')E	* 
	%D::<Dd#A

AGGAJr23%B
!!$'SA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   )r9   r   r   r   r   )specs_stringspecsspecs      r'   _parse_old_format_specs_stringz&History._parse_old_format_specs_string   sc      &&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[@)re   installcreateupdate_specsr   )remove	uninstallremove_specs)neuteredneutered_specs)com_patr   r   r9   endswithconda_v_patspec_patgroupsr@   r   rX   r   )	clsr   itemr   r7   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&+OdtDMM#<NTOE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!      ,
#$!/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   re   r   groupbyr	   gettupler   allow_conda_downgradesrI   r   r   r   r9   r8   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    )- 	4%BXB<D  + $ 8 8 >M*+ }

4 JqM;7E#(99S"#5D !&3!3D	4 ', ,
(+,
 '
# '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>       XIdOXr0   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+   rN   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      $(	$r0   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   poprN   re   r   r[   rt   items)
r^   spec_maprequestr   r   r   r   rP   prefix_recsrN   s
             r'   get_requested_specs_mapzHistory.get_requested_specs_map  s
   --/ 
	AGXNTV8WXL$ .TYY-.XNTV8WXLOO>>>,3KK8H",MN OO@@@
	A (2$++'>'K'K'MN!qvvNN-5^^-=UztT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|z         |j                  ||j                         f        |S )z@Return a list of tuples(datetime strings, set of distributions).r>   r   Nr?   zDid not expect: %s)	rH   r   rD   r@   discardr   r   r   copy)r^   r   curr   cont
unused_comr.   s          r'   construct_stateszHistory.construct_states-  s    e$(JJL 	) Bj4= JA||C(AabE*c*!"/0Dq0HIIJ JJCHHJ'(	) 
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   rH   zip)r^   revstatestimespkgss        r'   rq   zHistory.get_state?  s3     &&(5L6ltCyr&   c                    t        | j                               D ]A  \  }\  }}}t        d||fz         t        |      D ]  }t        d|z          t                C y )Nz%s  (rev %d)z    %s)	enumerater   printrV   )r^   ir   rC   r   r   s         r'   	print_logzHistory.print_logM  s^    .7

.E 	*A*gz.D!9,-&w/ 'ho&'G		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   rD   r   r@   rG   rH   rI   r   r   )r^   resultr   r   rC   r   eventrK   rL   pkgrN   rO   buildrQ   rR   r   r   detailss                     r'   
object_logzHistory.object_logT  s+   .7

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

-J e*s7|3"7O ;D!$-C+C"xx#6"xx#6G
 Syi(//8k*11':; #3w<'#9: ND(O**388TGgdm4K+LMN #3u:#78 MD)$++CHHdWuT{5J,KLM "'? 1C)$++C01MM% W+	!X r&   c                   t        | j                        st        j                  | j                         t	        j
                  | j                  dd      5 }t        |       t        ||z
        D ]  }|j                  d|z          t        ||z
        D ]  }|j                  d|z          	 d d d        y # 1 sw Y   y xY w)Nabutf-8modeencodingz-%s
z+%s
)
r
   r\   rl   makedirscodecsr   r]   r;   rI   r3   )r^   
last_statecurrent_stater:   rM   s        r'   rv   zHistory.write_changes  s    T]]#KK&[[@ 	'BrNZ-78 '2&']Z78 '2&'		' 	' 	'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      rnt        j                  | j
                  dd      5 }|r|j                  d|z         |r|j                  d|z         |r|j                  d|z         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: %s
z# update specs: %s
z# neutered specs: %s
)strr   rA   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DlN;<TYYTGD HHH3lBCHH3lBC!HH5FGH H = A@DH Hs   C!C&C+AC00C9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_   rc   ri   ra   ro   re   r   staticmethodr   classmethodr   r   r   r   rq   r   r   rv   r  r%   r&   r'   rX   rX   P   s    bjj+,Grzz78H"**9:K3
/"0  & + +ZDLV*$.`'Hr&   rX   __main__)pprint)I__doc__
__future__r   r   loggingrl   r   r6   r4   rr   astr   rx   r   r   r   	itertoolsr   operatorr	   os.pathr
   r   r   textwrapr   r   r   r8   
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;   rD   rS   rV   rX   r  r[   hr   r   r   r%   r&   r'   <module>r$     s    3 "   	 	 
    & &   ' '  *  1 ! 1 8 $ ( ; ' ) ( =g!	' 	V:'*%IH IHX
 z 	

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