^cN>ddlmZddlmZmZddlmZddlmZm Z m Z m Z m Z ddl mZmZddlmZmZddiZd Zd Zd Zd Zd ZGddZGddZdZejGddZGddZGdde j Z dS))_)binhex)attr)encodingerrormetadatapycompatrevlog)dateutil stringutil) constantsflagutilbranchdefaultc|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)replacetexts 5/usr/lib/python3/dist-packages/mercurial/changelog.py_string_escaper#sN UG$$       <<v & &&cd|vrB|dd}|dd}|dd}tj|S)Nrrs\\ rrr)rr unescapestrrs r_string_unescaper!7sU ~~||GY//||FE**||E3''  !$ ' ''rct}|dD]/}|r+t|dd\}}|||<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) _defaultextracopysplitr!)rextralkvs r decodeextrar+@sh    E ZZ    #A&&,,T155DAqE!H LrcdfdtD}d|S)NcDg|]}td||fzS)s%s:%s)r).0r)ds r zencodeextra..Us. E E Ea^H1Q4y0 1 1 E E Err)sortedjoin)r/itemss` r encodeextrar4Ss4 E E E E6!99 E E EE ::e  rcdd|DdS)z>strip trailing whitespace and leading and trailing empty linesrc6g|]}|S)rstrip)r.r(s rr0zstripdesc..[s ===aqxxzz===r)r2 splitlinesstrip)descs r stripdescr<Ys; ::==4??+<+<=== > > D DU K KKrcheZdZdZdZdZdZdZedZ dZ dd Z dd Z d Z d ZdZdS)appenderz`the changelog index must be updated last on disk, so we use this class to delay writes to itc||_|||}||_||_||j|_|j|_dSN)datafptelloffsetfstatst_sizesize_end)selfvfsnamemodebufrBs r__init__zappender.__init__bsO St__ggii IIbMM) I rc|jSr@)rHrIs rendz appender.endjs yrc|jSr@)rDrPs rrCz appender.tellms {rcdSr@r7rPs rflushzappender.flushps rc|jjSr@)rBclosedrPs rrVzappender.closedss w~rc8|jdSr@)rBcloserPs rrXzappender.closews  rc|dkr||_n9|dkr|xj|z c_n"|dkr||z|_|j|jkr!|j|jdSdS)z,virtual file offset spans real file and datarYrN)rDrQrGrBseek)rIrDwhences rr\z appender.seekzs Q;; DKK q[[ KK6 !KKK q[[((**v-DK ; " " GLL % % % % % # "rcd}|j|jkrQ|j|}|}|xjt |z c_|dkr|t |z}|dkr|j|jz }|jdd|j|jdd=|jd|||z}|xjt |z c_||z }|S)z5only trick here is reads that span real file and datarrYrN)rDrGrBreadlenrAinsertr2)rIcountretsdoffs rr`z appender.reads ; " " U##AC KK3q66 !KKqyyQ A::;*D I  Q 3 3 4 4 4 !""  ! TD5L01A KK3q66 !KK 1HC rc|jt||xjt |z c_|xjt |z c_dSr@)rAappendbytesrDrarH)rIres rwritezappender.writesN q""" s1vv  SVV rc8|j|Sr@)rB __enter__rPs rrlzappender.__enter__s  rc |jj|Sr@)rB__exit__)rIargss rrnzappender.__exit__stw&&rN)rY)r^)__name__ __module__ __qualname____doc__rNrQrCrTpropertyrVrXr\r`rjrlrnr7rrr>r>^s   X & & & &$ '''''rr>c"eZdZdZddZdZdS) _divertopenerc"||_||_dSr@)_opener_target)rIopenertargets rrNz_divertopener.__init__s  rrFc Z||jkr|j||fi|S|j|dz|fi|S)N.a)ryrx)rIrKrL checkambigkwargss r__call__z_divertopener.__call__sK 4<  4<d55f55 5t|D5L$99&999rc,t|j|Sr@)getattrrx)rIrs r __getattr__z_divertopener.__getattr__st|T***rNr|F)rprqrrrNrrr7rrrvrvsF:::: +++++rrvcdfd }|S)z?build an opener that stores chunks in 'buf' instead of 'target'r|FcP|kr ||fi|S|rJt||Sr@)r>)rKrLrrrMrzr{s r_delayz_delayopener.._delaysF 6>>6$//// /dC000rrr7)rzr{rMrs``` r _delayopenerrs411111111 MrceZdZejZejZejdZejdZejej e Z ejdZ ejdZ ejdZejdZejdZejeddfZdS)_changelogrevisionr)default)rYrYNrF)rprqrrribr'manifestuserdateFactorylistfiles filesadded filesremovedp1copiesp2copies descriptionr$ branchinfor7rrrrs DGIIEtwyyH 473   D 476 " " "D DGLDL.. / / /E&&&J474(((Ltwt$$$Htwt$$$H$'#&&&K- ":E!BCCCJJJrrcZeZdZdZdZfdZedZedZedZ edZ edZ ed Z ed Z ed Zed Zed ZedZedZedZedZxZS)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|stt|jStt||}|d}|d|dz}|d|dz}||dz|dzdkr|} n|d|dz} |||| f|_||_||_ ||_ d|_ |S)N)r'rrrr[ ) rr$nullidsuperr__new__indexrrrrr) clsclrsidedatacpsdrInl1nl2nl3doublenl __class__s rrzchangelogrevision.__new__s O%MBINNN N&,,44S99jjjja((jja(( a#'! "e + +HHzz'3733Hc31  !   rcPt|jd|jdS)NrY)rrrrPs rrzchangelogrevision.manifests#4:a$-"223444rcp|j}tj|j|ddz|dSNrYr)rrtolocalrrIoffs rrzchangelogrevision.user s2m 3q6A:A+> ?@@@rc|j}|j|ddz|d}|ddddS)Nrr[ rY)rrr&)rIr dateextras r_rawdatezchangelogrevision._rawdatesCmJs1vzCF23 tQ''!,,rc|j}|j|ddz|d}|dd}t|dkrdS|dS)Nrr[r)rrr&ra)rIrrfieldss r _rawextrazchangelogrevision._rawextrasYmJs1vzCF23 q)) v;;!  4ayrc|j}t|d} t|d}n#t$rd}YnwxYw||fSr)rfloatint ValueError)rIrawtimetimezones rrzchangelogrevision.dates^mSV}} 3q6{{HH   HHH X~s4 AAc@|j}|tSt|Sr@)rr$r+)rIrs rr'zchangelogrevision.extra*s"n ; 3rc|j|jS|jrtj|j}n>> x"T((*DN;;;;;rcd|_|j|_|j|j_|j|j_|j||n|jrd|jrJ|j dz}|j |}| |j ||j dnl|jre||j dd}| d|j| d|_d|_||dS)zfinalize index updatesFNr~T)rar)rrrzr r rrrrropenrXrenamerjr2_enforceinlinesize)rIrtmpnamenfilerBs rrzchangelog._finalizes, & #'; ,0K") < #   r " " " " \ "~ % % %o-GK$$W--E KKMMM K  wD  I I I I ^ "T_dtDDB HHSXXdn-- . . . HHJJJ!DN  #####rcz|jr|j|dS|jr||j}|jdz}||||d}|||d|j|d|_d|_ t|j|j|_ |j |j _ |j |j _ |j rdSdS)zLcreate a file containing the unfinalized state for pretxnchangegroupT)pendingr~wrNF)rrjrrr registertmpr`r2rXrrvrzr r )rIrfp1pendingfilenamefp2s rrzchangelog._writependings < 8<%%b$%77 7 > <""4?33C"o5O NN? + + +""?D99C IIchhjj ! ! ! IIchht~.. / / / IIKKK!DNDL'(8$/JJDK'+{D  $04 D & - < 4urcX|js"tj||dSdSr@)rr rrs rrzchangelog._enforceinlinesizes4} 7 M , ,T2 6 6 6 6 6 7 7rc||}||}|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) _revisiondatarrrrrrrrr')rI nodeorrevr/rcopy_sdcs rr`zchangelog.readsh   y ) )==++%)>> dAx 9 9 AFAFAGQ]AGLLrc||}||}t||||jdkS)z6Obtain a ``changelogrevision`` for a node or revision.r#)r$rrr)rIr%rrs rrzchangelog.changelogrevisionsJ!!),,==++ $$"59N"N   rc||}|sgS|d}|d|d}|ddS)zX short version of read that only returns the files modified by the cset rNrr)revisionrr&)rIr%rlastr(s r readfileszchangelog.readfiles%s[}}Y'' Izz'"" $K  e $ $u rc tj|tj|}}|}|s!tjt dd|vr6tjt dt j|zt|}|rdtj |z} ndtj z} | rE| d} | dvr| d=n(| dvr$tjt d| zt|j} d } d}|jd kr*|jr| t"jz} t'j|}| rt+| } d | | fz} t-||| g| zd |gz}d|}|||t3||||| }||S)Nsempty usernamersusername %r contains a newlines%d %dr)rr).snullstipsthe name '%s' is reservedrYr#s%s %sr)rflags)r fromlocalr:r StorageErrorrr bytestrr<r parsedatemakedaterr1rrhas_copies_inforREVIDX_HASCOPIESINFOr encode_files_sidedatar4rr2 addrevisionranode)rIrrr; transactionp1p2rrr' parseddatebranch sortedfilesr/rr(rrevs raddz changelog.add0s'--x/A$/G/Gdzz|| ;$Q'8%9%9:: : D==$344x7G7M7MM   8!H$6t$<$<U]++   "7 7 7$ 7665e<rvrrerrrr7rrrMsd J' '''((((& LLL C'C'C'C'C'C'C'C'L + + + + + + + +    D D D D D D D D mImImImImImImImI`yyyyy yyyyyr