
    ifI@                         d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZmZ ddiZd	 Zd
 Zd Zd Zd Zej4                   G d d             Z G d d      Z G d dej                        Zy)   )_)binhex)attr)encodingerrormetadatapycompatrevlog)dateutil
stringutil)	constantsflagutil   branch   defaultc                     | j                  dd      j                  dd      j                  dd      } | j                  dd      S )	aA  
    >>> from .pycompat import bytechr as chr
    >>> d = {b'nl': chr(10), b'bs': chr(92), b'cr': chr(13), b'nul': chr(0)}
    >>> s = b"ab%(nl)scd%(bs)s%(bs)sn%(nul)s12ab%(cr)scd%(bs)s%(nl)s" % d
    >>> s
    'ab\ncd\\\\n\x0012ab\rcd\\\n'
    >>> res = _string_escape(s)
    >>> s == _string_unescape(res)
    True
       \   \\   
s   \n   s   \r       \0)replacetexts    5/usr/lib/python3/dist-packages/mercurial/changelog.py_string_escaper   #   sB     	UG$				 	
 <<v&&    c                     d| v r6| j                  dd      } | j                  dd      } | j                  dd      } t        j                  |       S )Nr   r   s   \\
r   r   r   )r   r   unescapestrr   s    r   _string_unescaper!   7   sJ    ~||GY/||FE*||E3'!!$''r   c                     t         j                         }| j                  d      D ](  }|st        |      j                  dd      \  }}|||<   * |S )a  
    >>> from .pycompat import bytechr as chr
    >>> sorted(decodeextra(encodeextra({b'foo': b'bar', b'baz': chr(0) + b'2'})
    ...                    ).items())
    [('baz', '\x002'), ('branch', 'default'), ('foo', 'bar')]
    >>> sorted(decodeextra(encodeextra({b'foo': b'bar',
    ...                                 b'baz': chr(92) + chr(0) + b'2'})
    ...                    ).items())
    [('baz', '\\\x002'), ('branch', 'default'), ('foo', 'bar')]
    r      :r   )_defaultextracopysplitr!   )r   extralkvs        r   decodeextrar+   @   sX      EZZ #A&,,T15DAqE!H Lr   c           	          t        |       D cg c]  }t        d|| |   fz         }}dj                  |      S c c}w )Ns   %s:%sr   )sortedr   join)dr)   itemss      r   encodeextrar1   S   s@    ;A!9Ea^H1Q4y01EEE::e Fs   ;c                     dj                  | j                         D cg c]  }|j                          c}      j                  d      S c c}w )z>strip trailing whitespace and leading and trailing empty linesr   )r.   
splitlinesrstripstrip)descr(   s     r   	stripdescr7   Y   s7    ::4??+<=aqxxz=>DDUKK=s   Ac                      e Zd Z ej                         Z ej                         Z ej                  d      Z ej                  d      Z ej                   ej                  e
            Z ej                  d      Z ej                  d      Z ej                  d      Z ej                  d      Z ej                  d      Z ej                  ed   df      Zy)_changelogrevisionr   )default)    r;   Nr   F)__name__
__module____qualname__r   ibr'   manifestuserdateFactorylistfiles
filesaddedfilesremovedp1copiesp2copiesdescriptionr$   
branchinfo r   r   r9   r9   ^   s     DGGIEtwwyH4773D4776"DDGGLDLL./E&J4774(Ltwwt$Htwwt$H$''#&K-	":E!BCJr   r9   c                       e Zd ZdZdZ fdZed        Zed        Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Z xZS )changelogrevisionzHolds results of a parsed changelog revision.

    Changelog revisions consist of multiple pieces of data, including
    the manifest node, user, and date. This object exposes a view into
    the parsed object.
    )_offsets_text	_sidedata_cpsd_changesc                 x   |st        t        |j                        S t        t        |   |       }|j                  d      }|j                  d|dz         }|j                  d|dz         }||dz   |dz    dk(  r|}	n|j                  d|dz         }	||||	f|_        ||_        ||_	        ||_
        d |_        |S )N)r'   r@   r   r         

)r9   r$   nullidsuperrN   __new__indexrO   rP   rQ   rR   rS   )clsclr   sidedatacpsdselfnl1nl2nl3doublenl	__class__s             r   rY   zchangelogrevision.__new__   s    %MBIINN&4S9 jjjja(jja( a#'"e+Hzz'373Hc31
!
r   c                 L    t        | j                  d| j                  d          S )Nr;   )r   rP   rO   r_   s    r   r@   zchangelogrevision.manifest   s!    4::a$--"2344r   c                 p    | j                   }t        j                  | j                  |d   dz   |d          S Nr;   r   )rO   r   tolocalrP   r_   offs     r   rA   zchangelogrevision.user   s3    mm

3q6A:A ?@@r   c                 t    | j                   }| j                  |d   dz   |d    }|j                  dd      dd S )Nr   rU       r;   )rO   rP   r&   )r_   rk   	dateextras      r   _rawdatezchangelogrevision._rawdate   s?    mmJJs1vzCF3	tQ'!,,r   c                     | j                   }| j                  |d   dz   |d    }|j                  dd      }t        |      dk7  ry |d   S )Nr   rU   rm      )rO   rP   r&   len)r_   rk   rn   fieldss       r   	_rawextrazchangelogrevision._rawextra   sP    mmJJs1vzCF3	q)v;!ayr   c                     | j                   }t        |d         }	 t        |d         }||fS # t        $ r d}Y ||fS w xY wrh   )ro   floatint
ValueError)r_   rawtimetimezones       r   rB   zchangelogrevision.date   sV    mmSV}	3q6{H X~  	HX~	s   . ??c                 @    | j                   }|t        S t        |      S N)rt   r$   r+   )r_   ry   s     r   r'   zchangelogrevision.extra   s!    nn;  3r   c                 \   | j                   | j                   S | j                  r t        j                  | j                        }n`t        j
                  | j                  xs d| j                  xs d| j                  xs d| j                  xs i | j                  xs i       }|| _         |S )NrL   )touchedaddedremoved	p1_copies	p2_copies)rS   rR   r	   decode_files_sidedatarQ   ChangingFilesrE   rF   rG   rH   rI   )r_   changess     r   r   zchangelogrevision.changes   s    ==$== ::44T^^DG,,

(boo+))/R---2---2G  r   c                     | j                   rt        | j                  j                        S | j                  }|d   |d   k(  rg S | j
                  |d   dz   |d    j                  d      S )NrU   rq   r   r   )rR   r-   r   r   rO   rP   r&   rj   s     r   rE   zchangelogrevision.files   sd    ::$,,..//mmq6SVIzz#a&1*s1v.44U;;r   c                     | j                   r| j                  j                  S | j                  j	                  d      }|y t        j                  | j                  |      S )Ns
   filesadded)rR   r   r   r'   getr	   decodefileindicesrE   r_   
rawindicess     r   rF   zchangelogrevision.filesadded   sK    ::<<%%%6J))$**jAAr   c                     | j                   r| j                  j                  S | j                  j	                  d      }|y t        j                  | j                  |      S )Ns   filesremoved)rR   r   r   r'   r   r	   r   rE   r   s     r   rG   zchangelogrevision.filesremoved   sK    ::<<'''8J))$**jAAr   c                     | j                   r| j                  j                  S | j                  j	                  d      }|y t        j                  | j                  |      S )Ns   p1copies)rR   r   copied_from_p1r'   r   r	   decodecopiesrE   r_   	rawcopiess     r   rH   zchangelogrevision.p1copies  K    ::<<...

{3I$$TZZ;;r   c                     | j                   r| j                  j                  S | j                  j	                  d      }|y t        j                  | j                  |      S )Ns   p2copies)rR   r   copied_from_p2r'   r   r	   r   rE   r   s     r   rI   zchangelogrevision.p2copies  r   r   c                 f    t        j                  | j                  | j                  d   dz   d        S )Nrq   rU   )r   ri   rP   rO   rf   s    r   rJ   zchangelogrevision.description  s-    

4==+;a+?+A BCCr   c                 j    | j                   }t        j                  |j                  d            d|v fS )Nr   s   close)r'   r   ri   r   )r_   r'   s     r   rK   zchangelogrevision.branchinfo  s/    

		) 45x57HHHr   )r<   r=   r>   __doc__	__slots__rY   propertyr@   rA   ro   rt   rB   r'   r   rE   rF   rG   rH   rI   rJ   rK   __classcell__rd   s   @r   rN   rN   o   s7   I$L 5 5 A A - -
   	 	        < < B B B B < < < < D D I Ir   rN   c                        e Zd ZddZed        Zej                  d        Z fdZd Zd Z	d Z
d Zd	 Zd
 Zd Z	 	 ddZd Zd Z xZS )	changelogc                    t         j                   j                  | |t        j                  dfddd|j                  j                  dd      ||d
       | j                  rR| j                  t         j                  k(  r5| xj                  t         j                   z  c_	        d| j                  _        d| _        d| _        t               | _        i | _        |j                  j                  d      | _        y)aV  Load a changelog revlog using an opener.

        If ``trypending`` is true, we attempt to load the index from a
        ``00changelog.i.a`` file instead of the default ``00changelog.i``.
        The ``00changelog.i.a`` file contains index (and possibly inline
        revision) data for a transaction that hasn't been finalized yet.
        It exists in a separate file to facilitate readers (such as
        hooks processes) accessing data before a transaction is finalized.

        ``concurrencychecker`` will be passed to the revlog init function, see
        the documentation there.
        Ns   00changelogTs   persistent-nodemapF)targetradix
checkambigmmaplargeindexpersistentnodemapconcurrencychecker
trypending
may_inlines   copies-storage)r   __init__revlog_constantsKIND_CHANGELOGoptionsr   
_initempty_format_versionREVLOGV1_format_flagsFLAG_GENERALDELTAdelta_configgeneral_delta_storedeltachains_v2_delayed	frozenset_filteredrevs_filteredrevs_hashcache_copiesstorage)r_   openerr   r   s       r   r   zchangelog.__init__   s     	$33T: $nn001FN1! 	 	
 ?? 4 4 G 6#;#;";;.3D+
 "' &[')$$nn001BCr   c                     | j                   S r}   )r   rf   s    r   filteredrevszchangelog.filteredrevsJ  s    !!!r   c                 D    t        |t              sJ || _        i | _        y r}   )
isinstancer   r   r   )r_   vals     r   r   zchangelog.filteredrevsN  s$     #y))) ')$r   c                 F    | j                   st        t        |   |       y y r}   )r   rX   r   _write_docket)r_   trrd   s     r   r   zchangelog._write_docketU  s     )T04  r   c                    | j                   j                  rJ | j                  rJ | j                  r| j	                  |       | j
                  d| _        n4| j                   j                         }||| _        |j                  |       |j                  dt        |       z  | j                         |j                  dt        |       z  | j                         y)z2delay visibility of index updates to other readersNTs	   000-cl-%i)_inneris_open_may_inline_inline_enforceinlinesize_docketr   delay
_indexfileregistertmp
addpendingid_writependingaddfinalize	_finalize)r_   r   	new_indexs      r   delayupdatezchangelog.delayupdateY  s    ;;&&&&#### <<##B'<<##D))+I$"+y) 	lRX-t/A/AB
|bh.?r   c                    | j                   j                  rJ | j                  #| j                  j                  |       d| _        y| j                   j                         }|| _        | j                  rd}t        j                  |      y)zfinalize index updatesNFz,changelog should not be inline at that point)
r   r   r   writer   finalize_pendingr   r   r   ProgrammingError)r_   r   new_index_filemsgs       r   r   zchangelog._finalizem  st    ;;&&&&<<#LLr"$D![[99;N,DO||D,,S11 r   c                    | j                   j                  rJ | j                  r&| j                  j                  |d      }d| _        |S | j                   j                         \  }}||| _        |j                  |       |S )zLcreate a file containing the unfinalized state for
        pretxnchangegroupT)pendingF)r   r   r   r   r   write_pendingr   r   )r_   r   any_pendingr   s       r   r   zchangelog._writependingz  s     ;;&&&&<<,,,,R,>K$D 	 &*[[%>%>%@"I{$"+y)r   c                 ^    | j                   s!t        j                  j                  | |       y y r}   )is_delayingr   r   )r_   r   s     r   r   zchangelog._enforceinlinesize  s$    MM,,T26  r   c                    | j                  |      }| j                  |      }| j                  dk(  }t        | |||      }|j                  |j
                  |j                  |j                  |j                  |j                  fS )a  Obtain data from a parsed changelog revision.

        Returns a 6-tuple of:

           - manifest node in binary
           - author/user as a localstr
           - date as a 2-tuple of (time, timezone)
           - list of files
           - commit message as a localstr
           - dict of extra metadata

        Unless you need to access all fields, consider calling
        ``changelogrevision`` instead, as it is faster for partial object
        access.
           changeset-sidedata)
_revisiondatar]   r   rN   r@   rA   rB   rE   rJ   r'   )r_   	nodeorrevr/   r]   copy_sdcs         r   readzchangelog.read  sn      y)==+%%)>>dAx9

AFFAFFAGGQ]]AGGLLr   c                 |    | j                  |      }| j                  |      }t        | ||| j                  dk(        S )z6Obtain a ``changelogrevision`` for a node or revision.r   )r   r]   rN   r   )r_   r   r   r]   s       r   rN   zchangelog.changelogrevision  sB    !!),==+ $$"5"59N"N
 	
r   c                     | j                  |      }|sg S |j                  d      }|d| j                  d      }|dd S )zX
        short version of read that only returns the files modified by the cset
        rV   Nr   rq   )revisionrZ   r&   )r_   r   r   lastr(   s        r   	readfileszchangelog.readfiles  sI     }}Y'Izz'"$Ke$ur   c
           	         t        j                  |      t        j                  |      }}|j                         }|st        j                  t        d            d|v r4t        j                  t        d      t        j                  |      z        t        |      }|rdt        j                  |      z  }
ndt        j                         z  }
|	r>|	j                  d      }|dv r|	d= n%|dv r!t        j                  t        d      |z        t        |j                        }d	}d }| j                  d
k(  r4|j                   r|t"        j$                  z  }t'        j(                  |      }|	rt+        |	      }	d|
|	fz  }
t-        |      ||
g|z   d|gz   }dj/                  |      }| j1                  ||t3        |       ||||      }| j5                  |      S )Ns   empty usernamer   s   username %r contains a newlines   %d %dr   )r   r   )   .s   nulls   tips   the name '%s' is reservedr;   r   s   %s %sr   )r]   flags)r   	fromlocalr5   r   StorageErrorr   r
   bytestrr7   r   	parsedatemakedater   r-   r   r   has_copies_infor   REVIDX_HASCOPIESINFOr	   encode_files_sidedatar1   r   r.   addrevisionrr   node)r_   r@   rE   r6   transactionp1p2rA   rB   r'   
parseddatebranchsortedfilesr   r]   r(   r   revs                     r   addzchangelog.add  s    ''-x/A/A$/Gdzz| $$Q'8%9::D=$$34x7G7G7MM  !H$6$6t$<<J!H$5$5$77JYYy)F**)$22((45>  U]]+"77$$66655e<H&E!Z$77J]D*-;sDkIzz!}+s4y"b85  
 yy~r   c                 8    | j                  |      j                  S )zreturn the branch name and open/close state of a revision

        This function exists because creating a changectx object
        just to access this is costly.)rN   rK   )r_   r   s     r   rK   zchangelog.branchinfo  s    
 %%c*555r   c                 ^    |j                   j                  dg       }|j                  |       y )Ns   revduplicates)r   
setdefaultappend)r_   r   r   
duplicatess       r   _nodeduplicatecallbackz changelog._nodeduplicatecallback  s+     !((334DbI
#r   )FN)NN)r<   r=   r>   r   r   r   setterr   r   r   r   r   r   rN   r   r   rK   r  r   r   s   @r   r   r     sz    (DT " " * *5@(27M,
	( :x6r   r   N)i18nr   r   r   r   
thirdpartyr    r   r   r	   r
   r   utilsr   r   revlogutilsr   r   r   r$   r   r!   r+   r1   r7   sr9   rN   r   rL   r   r   <module>r     s      
 J''((&L
 D D D mI mI`^ ^r   