
    	^cN                     >   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 G d d          Z G d d          Zd Zej         G d d                      Z G d d          Z G d dej                  Z dS )   )_)binhex)attr)encodingerrormetadatapycompatrevlog)dateutil
stringutil)	constantsflagutil   branch   defaultc                     |                      dd                               dd                               dd          } |                      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   #   sN     	UG$$						 	
 <<v&&&    c                     d| v rB|                      dd          } |                      dd          } |                      dd          } t          j        |           S )Nr   r   s   \\
r   r   r   )r   r   unescapestrr   s    r   _string_unescaper!   7   sU    ~~||GY//||FE**||E3''!$'''r   c                     t                                           }|                     d          D ]/}|r+t          |                              dd          \  }}|||<   0|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+   @   sh       EZZ   	#A&&,,T155DAqE!HLr   c                 d      fdt                     D             }d                    |          S )Nc                 D    g | ]}t          d ||         fz            S )s   %s:%s)r   ).0r)   ds     r   
<listcomp>zencodeextra.<locals>.<listcomp>U   s.    EEEa^H1Q4y011EEEr   r   )sortedjoin)r/   itemss   ` r   encodeextrar4   S   s4    EEEE6!99EEEE::er   c                     d                     d |                                 D                                           d          S )z>strip trailing whitespace and leading and trailing empty linesr   c                 6    g | ]}|                                 S  )rstrip)r.   r(   s     r   r0   zstripdesc.<locals>.<listcomp>[   s     ===aqxxzz===r   )r2   
splitlinesstrip)descs    r   	stripdescr<   Y   s;    ::==4??+<+<===>>DDUKKKr   c                   h    e Zd ZdZd Zd Zd Zd Zed             Z	d Z
dd	ZddZd Zd Zd ZdS )appenderz`the changelog index must be updated last on disk, so we use this class
    to delay writes to itc                     || _          |||          }|| _        |                                | _        |                    |          j        | _        | j        | _        d S N)datafptelloffsetfstatst_sizesize_end)selfvfsnamemodebufrB   s         r   __init__zappender.__init__b   sO    	St__ggiiIIbMM)	I			r   c                     | j         S r@   )rH   rI   s    r   endzappender.endj   s
    yr   c                     | j         S r@   )rD   rP   s    r   rC   zappender.tellm   s
    {r   c                     d S r@   r7   rP   s    r   flushzappender.flushp   s    r   c                     | j         j        S r@   )rB   closedrP   s    r   rV   zappender.closeds   s    w~r   c                 8    | j                                          d S r@   )rB   closerP   s    r   rX   zappender.closew   s    r       c                     |dk    r|| _         n9|dk    r| xj         |z  c_         n"|dk    r|                                 |z   | _         | j         | j        k     r!| j                            | j                    dS dS )z,virtual file offset spans real file and datarY   r      N)rD   rQ   rG   rB   seek)rI   rD   whences      r   r\   zappender.seekz   s    Q;; DKKq[[KK6!KKKq[[((**v-DK;""GLL%%%%% #"r   c                    d}| j         | j        k     rQ| j                            |          }|}| xj         t	          |          z  c_         |dk    r|t	          |          z  }|dk    r| j         | j        z
  }| j                            dd                    | j                             | j        dd= | j        d         |||z            }| xj         t	          |          z  c_         ||z  }|S )z5only trick here is reads that span real file and datar   rY   r   N)rD   rG   rB   readlenrA   insertr2   )rI   countretsdoffs        r   r`   zappender.read   s    ;""U##ACKK3q66!KKqyyQA::;*DIQ 3 3444	!""	!TD5L01AKK3q66!KK1HC
r   c                     | j                             t          |                     | xj        t	          |          z  c_        | xj        t	          |          z  c_        d S r@   )rA   appendbytesrD   ra   rH   )rI   re   s     r   writezappender.write   sN    	q"""s1vv		SVV				r   c                 8    | j                                          | S r@   )rB   	__enter__rP   s    r   rl   zappender.__enter__   s    r   c                       | j         j        | S r@   )rB   __exit__)rI   argss     r   rn   zappender.__exit__   s    tw&&r   N)rY   )r^   )__name__
__module____qualname____doc__rN   rQ   rC   rT   propertyrV   rX   r\   r`   rj   rl   rn   r7   r   r   r>   r>   ^   s                    X  	& 	& 	& 	&   $  
  ' ' ' ' 'r   r>   c                   "    e Zd Zd ZddZd ZdS )_divertopenerc                 "    || _         || _        d S r@   )_opener_target)rI   openertargets      r   rN   z_divertopener.__init__   s    r      rFc                 Z    || j         k    r | j        ||fi |S  | j        |dz   |fi |S )N   .a)ry   rx   )rI   rK   rL   
checkambigkwargss        r   __call__z_divertopener.__call__   sK    4<4<d55f555t|D5L$99&999r   c                 ,    t          | j        |          S r@   )getattrrx   )rI   r   s     r   __getattr__z_divertopener.__getattr__   s    t|T***r   Nr|   F)rp   rq   rr   rN   r   r   r7   r   r   rv   rv      sF          : : : :
+ + + + +r   rv   c                      d fd	}|S )z?build an opener that stores chunks in 'buf' instead of 'target'r|   Fc                 P    | k    r
 | |fi |S |rJ t          | |          S r@   )r>   )rK   rL   r   r   rM   rz   r{   s       r   _delayz_delayopener.<locals>._delay   sF    6>>6$/////dC000r   r   r7   )rz   r{   rM   r   s   ``` r   _delayopenerr      s4    1 1 1 1 1 1 1 1 Mr   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dS )_changelogrevisionr   )default)rY   rY   Nr   F)rp   rq   rr   r   ibr'   manifestuserdateFactorylistfiles
filesaddedfilesremovedp1copiesp2copiesdescriptionr$   
branchinfor7   r   r   r   r      s         DGIIEtwyyH473D476"""DDGLDL..///E&&&J474(((Ltwt$$$Htwt$$$H$'#&&&K-	":E!BCCCJJJr   r   c                   Z    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                    |st          t          |j                  S t          t          |                               |           }|                    d          }|                    d|dz             }|                    d|dz             }||dz   |dz            dk    r|}	n|                    d|dz             }	||||	f|_        ||_        ||_	        ||_
        d |_        |S )N)r'   r   r   r   r[      

)r   r$   nullidsuperr   __new__indexr   r   r   r   r   )clsclr   sidedatacpsdrI   nl1nl2nl3doublenl	__class__s             r   r   zchangelogrevision.__new__   s     	O%MBINNNN&,,44S99 jjjja((jja(( a#'!"e++HHzz'3733Hc31
!
r   c                 P    t          | j        d| j        d                            S )NrY   )r   r   r   rP   s    r   r   zchangelogrevision.manifest  s#    4:a$-"223444r   c                 p    | j         }t          j        | j        |d         dz   |d                            S NrY   r   )r   r   tolocalr   rI   offs     r   r   zchangelogrevision.user	  s2    m
3q6A:A+> ?@@@r   c                     | j         }| j        |d         dz   |d                  }|                    dd          dd         S )Nr   r[       rY   )r   r   r&   )rI   r   	dateextras      r   _rawdatezchangelogrevision._rawdate  sC    mJs1vzCF23	tQ''!,,r   c                     | j         }| j        |d         dz   |d                  }|                    dd          }t          |          dk    rd S |d         S )Nr   r[   r      )r   r   r&   ra   )rI   r   r   fieldss       r   	_rawextrazchangelogrevision._rawextra  sY    mJs1vzCF23	q))v;;!4ayr   c                     | j         }t          |d                   }	 t          |d                   }n# t          $ r d}Y nw xY w||fS r   )r   floatint
ValueError)rI   rawtimetimezones       r   r   zchangelogrevision.date  s^    mSV}}	3q6{{HH 	 	 	HHH	 X~s   4 AAc                 @    | j         }|t          S t          |          S r@   )r   r$   r+   )rI   r   s     r   r'   zchangelogrevision.extra*  s"    n;  3r   c                     | j         | j         S | j        rt          j        | j                  }n<t          j        | j        pd| j        pd| j        pd| j	        pi | j
        pi           }|| _         |S )Nr7   )touchedaddedremoved	p1_copies	p2_copies)r   r   r	   decode_files_sidedatar   ChangingFilesr   r   r   r   r   )rI   changess     r   r   zchangelogrevision.changes2  s    =$= : 		4T^DDGG,
(bo+)/R--2--2  G  r   c                     | j         rt          | j        j                  S | j        }|d         |d         k    rg S | j        |d         dz   |d                                      d          S )Nr[   r   r   r   )r   r1   r   r   r   r   r&   r   s     r   r   zchangelogrevision.filesC  sj    : 	0$,.///mq6SVIz#a&1*s1v-.44U;;;r   c                     | j         r| j        j        S | j                            d          }|d S t          j        | j        |          S )Ns
   filesadded)r   r   r   r'   getr	   decodefileindicesr   rI   
rawindicess     r   r   zchangelogrevision.filesaddedM  sJ    : 	7<%%66J4)$*jAAAr   c                     | j         r| j        j        S | j                            d          }|d S t          j        | j        |          S )Ns   filesremoved)r   r   r   r'   r   r	   r   r   r   s     r   r   zchangelogrevision.filesremovedW  sJ    : 	9<''88J4)$*jAAAr   c                     | j         r| j        j        S | j                            d          }|d S t          j        | j        |          S )Ns   p1copies)r   r   copied_from_p1r'   r   r	   decodecopiesr   rI   	rawcopiess     r   r   zchangelogrevision.p1copiesa  J    : 	4<..
{33I4$TZ;;;r   c                     | j         r| j        j        S | j                            d          }|d S t          j        | j        |          S )Ns   p2copies)r   r   copied_from_p2r'   r   r	   r   r   r   s     r   r   zchangelogrevision.p2copiesk  r   r   c                 `    t          j        | j        | j        d         dz   d                    S )Nr   r[   )r   r   r   r   rP   s    r   r   zchangelogrevision.descriptionu  s,    
4=+;a+?+A+A BCCCr   c                 f    | j         }t          j        |                    d                    d|v fS )Nr   s   close)r'   r   r   r   )rI   r'   s     r   r   zchangelogrevision.branchinfoy  s0    
		) 4 455x57HHHr   )rp   rq   rr   rs   	__slots__r   rt   r   r   r   r   r   r'   r   r   r   r   r   r   r   r   __classcell__r   s   @r   r   r      s        I$ $ $ $ $L 5 5 X5 A A XA - - X-
   X 	 	 X	     X    X  < < X< B B XB B B XB < < X< < < X< D D XD I I XI I I I Ir   r   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 )	changelogFNc                    t           j                             | |t          j        dfddd|j                            dd          ||	  	         | j        r7| j        t           j        k    r"| xj	        t           j
         z  c_	        d| _        d| _        || _        d| _        d| _        d| _        t#                      | _        i | _        |j                            d          | _        dS )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)r{   radixr   mmaplargeindexpersistentnodemapconcurrencychecker
trypendings   copies-storage)r   rN   revlog_constantsKIND_CHANGELOGoptionsr   
_initempty_format_versionREVLOGV1_format_flagsFLAG_GENERALDELTA_generaldelta_storedeltachains_realopener_delayed	_delaybuf_divert	frozenset_filteredrevs_filteredrevs_hashcache_copiesstorage)rI   rz   r   r   s       r   rN   zchangelog.__init__  s     	$3T: $n001FNN1! 	 
	
 
	
 
	
 ? 	' 4 G G 6#;";;!&D
 "'!&[[')$$n001BCCr   c                     | j         S r@   )r   rP   s    r   filteredrevszchangelog.filteredrevs  s    !!r   c                 P    t          |t                    sJ || _        i | _        d S r@   )
isinstancer   r   r   )rI   vals     r   r   zchangelog.filteredrevs  s0     #y))))) ')$$$r   c                 j    | j         s*t          t          |                               |           d S d S r@   )r   r   r   _write_docket)rI   trr   s     r   r  zchangelog._write_docket  s;    } 	5)T""0044444	5 	5r   c                 t   | j         | j        st          |           dk    rkd| _        | j                            | j        dz             r"| j                            | j        dz              t          | j        | j                  | _	        n,g | _
        t          | j        | j        | j
                  | _	        | j	        | j        _	        | j	        | j        _	        d| _        |                    dt          |           z  | j                   |                    dt          |           z  | j                   dS )z2delay visibility of index updates to other readersNrY   Tr~   s   cl-%i)_docketr   ra   r   r   exists
_indexfileunlinkrv   rz   r   r   _segmentfile_segmentfile_sidedata
addpendingid_writependingaddfinalize	_finalizerI   r  s     r   delayupdatezchangelog.delayupdate  s   <4yyA~~##**4?U+BCC E$++DOe,CDDD+D,<doNN!#*$dot~  (,{D$04D&-
hD)4+=>>>
x"T((*DN;;;;;r   c                    d| _         | j        | _        | j        | j        _        | j        | j        _        | j        |                     |           n| j        rd| j        rJ | j	        dz   }| j        
                    |          }|                                 | j                            || j	        d           nl| j        re|                     | j	        dd          }|                    d                    | j                             |                                 d| _        d| _        |                     |           dS )zfinalize index updatesFNr~   T)r      ar   )r   r   rz   r
  r  r  r  r   r   r  openrX   renamerj   r2   _enforceinlinesize)rI   r  tmpnamenfilerB   s        r   r  zchangelog._finalize  s,   &#'; ,0K")<#r""""\ 
	"~%%%o-GK$$W--EKKMMMKwDIIII^ 	"T_dtDDBHHSXXdn--...HHJJJ!DN#####r   c                 z   | j         r| j                             |d          S | j        r|                     | j                  }| j        dz   }|                    |           |                     |d          }|                    |                                           |                    d                    | j                             |                                 d| _        d| _	        t          | j        | j                  | _        | j        | j        _        | j        | j        _        | j	        rdS dS )zLcreate a file containing the unfinalized state for
        pretxnchangegroupT)pendingr~      wr   NF)r  rj   r   r   r  registertmpr`   r2   rX   r   rv   rz   r
  r  )rI   r  fp1pendingfilenamefp2s        r   r  zchangelog._writepending  s    < 	8<%%b$%777> 	<""4?33C"o5ONN?+++""?D99CIIchhjj!!!IIchht~..///IIKKK!DNDL'(8$/JJDK'+{D$04D&-< 	4ur   c                 X    | j         s"t          j                            | |           d S d S r@   )r   r   r  r  s     r   r  zchangelog._enforceinlinesize  s4    } 	7M,,T266666	7 	7r   c                     |                      |          }|                     |          }| 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   r   r   r   r   r   r   r'   )rI   	nodeorrevr/   r   copy_sdcs         r   r`   zchangelog.read  sh      y))==++%)>>dAx99
AFAFAGQ]AGLLr   c                     |                      |          }|                     |          }t          | ||| j        dk              S )z6Obtain a ``changelogrevision`` for a node or revision.r#  )r$  r   r   r   )rI   r%  r   r   s       r   r   zchangelog.changelogrevision  sJ    !!),,==++ $$"59N"N
 
 	
r   c                     |                      |          }|sg S |                    d          }|d|                             d          }|dd         S )zX
        short version of read that only returns the files modified by the cset
        r   Nr   r   )revisionr   r&   )rI   r%  r   lastr(   s        r   	readfileszchangelog.readfiles%  s[     }}Y'' 	Izz'""$Ke$$ur   c
           	         t          j        |          t          j        |          }}|                                }|s!t          j        t          d                    d|v r6t          j        t          d          t          j        |          z            t          |          }|rdt          j
        |          z  }
ndt          j                    z  }
|	rE|	                    d          }|dv r|	d= n(|dv r$t          j        t          d          |z            t          |j                  }d	}d }| j        d
k    r*|j        r|t"          j        z  }t'          j        |          }|	rt+          |	          }	d|
|	fz  }
t-          |          ||
g|z   d|gz   }d                    |          }|                     ||t3          |           ||||          }|                     |          S )Ns   empty usernamer   s   username %r contains a newlines   %d %dr   )r   r   )   .s   nulls   tips   the name '%s' is reservedrY   r#  s   %s %sr   )r   flags)r   	fromlocalr:   r   StorageErrorr   r
   bytestrr<   r   	parsedatemakedater   r1   r   r   has_copies_infor   REVIDX_HASCOPIESINFOr	   encode_files_sidedatar4   r   r2   addrevisionra   node)rI   r   r   r;   transactionp1p2r   r   r'   
parseddatebranchsortedfilesr/  r   r(   r   revs                     r   addzchangelog.add0  s    '--x/A$/G/Gdzz||  	;$Q'8%9%9:::D==$344x7G7M7MM    	8!H$6t$<$<<JJ!H$5$7$77J 	YYy))F***)$$222(455>   U]++"777$ 7665e<<H 	8&&E!Z$77J]]D*-;sDkIzz!}}+s4yy"b85  
 
 yy~~r   c                 6    |                      |          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.)r   r   )rI   r@  s     r   r   zchangelog.branchinfol  s    
 %%c**55r   c                 f    |j                             dg           }|                    |           d S )Ns   revduplicates)r   
setdefaultrh   )rI   r:  r@  
duplicatess       r   _nodeduplicatecallbackz changelog._nodeduplicatecallbacks  s7     !(334DbII
#r   )FN)NN)rp   rq   rr   rN   rt   r   setterr  r  r  r  r  r`   r   r,  rA  r   rF  r   r   s   @r   r   r     s2       *D *D *D *DX " " X" * * *5 5 5 5 5< < <&$ $ $0  :7 7 7M M M,
 
 
	 	 	( : : : :x6 6 6      r   r   N)!i18nr   r9  r   r   
thirdpartyr    r   r   r	   r
   r   utilsr   r   revlogutilsr   r   r   r$   r   r!   r+   r4   r<   r>   rv   r   re   r   r   r   r7   r   r   <module>rM     sd                                                
 J'' ' '(( ( (  &  L L L
C' C' C' C' C' C' C' C'L+ + + + + + + +	 	 	 D D D D D D D D mI mI mI mI mI mI mI mI`y y y y y y y y y yr   