o ]LbN@sddlmZddlmZddlmZmZddlmZddl m Z m Z m Z m Z mZddlmZmZddlmZmZd d iZd d Zd dZddZddZddZGdddeZGdddeZddZej GdddeZ!GdddeZ"Gdd d ejZ#d!S)")absolute_import)_)binhex)attr)encodingerrormetadatapycompatrevlog)dateutil stringutil) constantsflagutilbranchdefaultcCs(|dddddd}|ddS) 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)replacetextr5/usr/lib/python3/dist-packages/mercurial/changelog.py_string_escape$s  rcCs6d|vr|dd}|dd}|dd}t|S)Nrrs\\ rr)rr unescapestrrrrr_string_unescape8s     r!cCs<t}|dD]}|rt|dd\}}|||<q |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) _defaultextracopysplitr!)rextralkvrrr decodeextraAs r*cs fddtD}d|S)Ncs g|] }td||fqS)s%s:%s)r).0r(drr Vs zencodeextra..r)sortedjoin)r-itemsrr,r encodeextraTs r2cCsddd|DdS)z>strip trailing whitespace and leading and trailing empty linesrcSsg|]}|qSr)rstrip)r+r'rrrr.\szstripdesc..)r0 splitlinesstrip)descrrr stripdescZr7c@speZdZdZddZddZddZdd Zed d Z d d Z dddZ dddZ ddZ ddZddZdS)appenderz`the changelog index must be updated last on disk, so we use this class to delay writes to itcCs:||_|||}||_||_||j|_|j|_dSN)datafptelloffsetfstatst_sizesize_end)selfvfsnamemodebufr<rrr__init__cs    zappender.__init__cC|jSr:)rBrCrrrendkz appender.endcCrIr:)r>rJrrrr=nrLz appender.tellcCsdSr:rrJrrrflushqszappender.flushcCs|jjSr:)r<closedrJrrrrNtszappender.closedcCs|jdSr:)r<closerJrrrrOxszappender.closercCs`|dkr||_n|dkr|j|7_n |dkr|||_|j|jkr.|j|jdSdS)z,virtual file offset spans real file and datarrN)r>rKrAr<seek)rCr>whencerrrrQ{s z appender.seekcCsd}|j|jkr#|j|}|}|jt|7_|dkr#|t|8}|dkrV|j|j}|jdd|j|jdd=|jd|||}|jt|7_||7}|S)z5only trick here is reads that span real file and datarrrN)r>rAr<readlenr;insertr0)rCcountretsdoffrrrrTs     z appender.readcCs8|jt||jt|7_|jt|7_dSr:)r;appendbytesr>rUrB)rCrYrrrwriteszappender.writecCs|j|Sr:)r< __enter__rJrrrr^s zappender.__enter__cGs |jj|Sr:)r<__exit__)rCargsrrrr_ zappender.__exit__N)r)rS)__name__ __module__ __qualname____doc__rHrKr=rMpropertyrNrOrQrTr]r^r_rrrrr9_s    r9c@s&eZdZddZd ddZddZd S) _divertopenercCs||_||_dSr:)_opener_target)rCopenertargetrrrrHs z_divertopener.__init__rFcKs6||jkr|j||fi|S|j|d|fi|S)N.a)rirh)rCrErF checkambigkwargsrrr__call__s z_divertopener.__call__cCs t|j|Sr:)getattrrh)rCrrrr __getattr__raz_divertopener.__getattr__NrlF)rbrcrdrHrprrrrrrrgs  rgcsdfdd }|S)z?build an opener that stores chunks in 'buf' instead of 'target'rlFcs0|kr ||fi|S|rJt||Sr:)r9)rErFrnrorGrjrkrr_delaysz_delayopener.._delayNrsr)rjrkrGrurrtr _delayopenersrvc@seZdZeZeZejddZejddZeje e dZ ejddZ ejddZ ejddZejddZejddZejeddfdZdS)_changelogrevisionr)default)rrNrF)rbrcrdribr&manifestuserdateFactorylistfiles filesadded filesremovedp1copiesp2copies descriptionr# branchinforrrrrws       rwcseZdZdZdZfddZeddZeddZed d Z ed d Z ed dZ eddZ eddZ eddZeddZeddZeddZeddZeddZedd ZZS)!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|s tt|jdStt||}|d}|d|d}|d|d}||d|ddkr5|} n|d|d} |||| f|_||_||_ ||_ d|_ |S)N)r&rzrrrP ) rwr#nullidsuperr__new__indexrrrrr) clsclrsidedatacpsdrCnl1nl2nl3doublenl __class__rrrs zchangelogrevision.__new__cCst|jd|jdS)Nr)rrrrJrrrrzszchangelogrevision.manifestcCs&|j}t|j|dd|dSNrr)rrtolocalrrCoffrrrr{ s zchangelogrevision.usercCs4|j}|j|dd|d}|ddddS)NrrP r)rrr%)rCr dateextrarrr_rawdateszchangelogrevision._rawdatecCsD|j}|j|dd|d}|dd}t|dkrdS|dS)NrrPr)rrr%rU)rCrrfieldsrrr _rawextras   zchangelogrevision._rawextracCsF|j}t|d}z t|d}W||fSty"d}Y||fSwr)rfloatint ValueError)rCrawtimetimezonerrrr|s  zchangelogrevision.datecCs|j}|dur tSt|Sr:)rr#r*)rCrrrrr&+szchangelogrevision.extracCs`|jdur|jS|jrt|j}ntj|jpd|jpd|jp d|j p$i|j p(id}||_|S)Nr)touchedaddedremoved p1_copies p2_copies) rrr decode_files_sidedatar ChangingFilesrrrrr)rCchangesrrrr3s zchangelogrevision.changescCsL|jr t|jjS|j}|d|dkrgS|j|dd|ddS)NrPrrr)rr/rrrrr%rrrrrDs   zchangelogrevision.filescC4|jr|jjS|jd}|durdSt|j|S)Ns filesadded)rrrr&getr decodefileindicesrrC rawindicesrrrrN  zchangelogrevision.filesaddedcCr)Ns filesremoved)rrrr&rr rrrrrrrXrzchangelogrevision.filesremovedcCr)Nsp1copies)rrcopied_from_p1r&rr decodecopiesrrC rawcopiesrrrrbrzchangelogrevision.p1copiescCr)Nsp2copies)rrcopied_from_p2r&rr rrrrrrrlrzchangelogrevision.p2copiescCst|j|jdddS)NrrP)rrrrrJrrrrvr8zchangelogrevision.descriptioncCs|j}t|dd|vfS)Nrsclose)r&rrr)rCr&rrrrzszchangelogrevision.branchinfo)rbrcrdre __slots__rrfrzr{rrr|r&rrrrrrrr __classcell__rrrrrs@ &             rcseZdZdddZeddZejddZfdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZ  dddZddZddZZS) changelogFNc Cstjj||tjdfddd|jdd||d |jr,|jtjkr,|j tj M_ d|_ d|_ ||_ d|_d|_d|_t|_i|_|jd|_dS)aVLoad 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 00changelogTspersistent-nodemapF)rkradixrnmmaplargeindexpersistentnodemapconcurrencychecker trypendingscopies-storage)r rHrevlog_constantsKIND_CHANGELOGoptionsr _initempty_format_versionREVLOGV1 _format_flagsFLAG_GENERALDELTA _generaldelta_storedeltachains _realopener_delayed _delaybuf_divert frozenset _filteredrevs_filteredrevs_hashcache_copiesstorage)rCrjrrrrrrHs,   zchangelog.__init__cCrIr:)rrJrrr filteredrevsszchangelog.filteredrevscCst|tsJ||_i|_dSr:) isinstancerrr)rCvalrrrrs cs|js tt||dSdSr:)rrr _write_docketrCtrrrrrszchangelog._write_docketcCs|jdurC|jsCt|dkr,d|_|j|jdr#|j|jdt|j|j|_ n g|_ t |j|j|j |_ |j |j _ |j |j _ d|_|dt||j|dt||jdS)z2delay visibility of index updates to other readersNrTrmscl-%i)_docketrrUrrexists _indexfileunlinkrgrjrrv _segmentfile_segmentfile_sidedata addpendingid _writepending addfinalize _finalizerrrr delayupdates    zchangelog.delayupdatecCsd|_|j|_|j|j_|j|j_|jdur||n>|jr>|jr$J|j d}|j |}| |jj ||j ddn|jrZ|j|j ddd}| d|j| d|_d|_||dS)zfinalize index updatesFNrmT)rnar)rrrjrrrrrrropenrOrenamer]r0_enforceinlinesize)rCrtmpnamenfiler<rrrrs&       zchangelog._finalizecCs|jr |jj|ddS|jrP||j}|jd}||||d}|||d|j|d|_d|_ t |j|j|_ |j |j _ |j |j _ |j rUdSdS)zLcreate a file containing the unfinalized state for pretxnchangegroupT)pendingrmwrNF)rr]rrr registertmprTr0rOrrgrjrr)rCrfp1pendingfilenamefp2rrrrs$      zchangelog._writependingcCs|js tj||dSdSr:)rr rrrrrrszchangelog._enforceinlinesizecCsH||}||}|jdk}t||||}|j|j|j|j|j|j fS)aObtain 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) _revisiondatarrrrzr{r|rrr&)rC nodeorrevr-rcopy_sdcrrrrTs   zchangelog.readcCs(||}||}t||||jdkS)z6Obtain a ``changelogrevision`` for a node or revision.r)rrrr)rCrrrrrrrs  zchangelog.changelogrevisioncCs:||}|s gS|d}|d|d}|ddS)zX short version of read that only returns the files modified by the cset rNrr)revisionrr%)rCrrlastr'rrr readfiles&s   zchangelog.readfilesc  CsHt|t|}}|}|sttdd|vr(ttdt|t|}|r6dt |} ndt } | rX| d} | dvrK| d=n | dvrXttd| t |j} d } d}|jd krs|jrn| tjO} t|}| rt| } d | | f} t||| g| d |g}d|}|j||t||||| d }||S)Nsempty usernamersusername %r contains a newlines%d %dr)rr).snullstipsthe name '%s' is reservedrrs%s %sr)rflags)r fromlocalr5r StorageErrorrr bytestrr7r parsedatemakedaterr/rrhas_copies_inforREVIDX_HASCOPIESINFOr encode_files_sidedatar2rr0 addrevisionrUnode)rCrzrr6 transactionp1p2r{r|r& parseddatebranch sortedfilesrrr'rrevrrradd1sH          z changelog.addcCs ||jS)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.)rr)rCrrrrrms zchangelog.branchinfocCs|jdg}||dS)Ns revduplicates)r setdefaultr[)rCr r duplicatesrrr_nodeduplicatecallbacktsz changelog._nodeduplicatecallback)FN)NN)rbrcrdrHrfrsetterrrrrrrTrrrrrrrrrrrs& ,    <rN)$ __future__ri18nrr rr thirdpartyrrr r r r utilsr r revlogutilsrrrr#rr!r*r2r7objectr9rgrvrYrwrrrrrrs*    F 1