^ccddlZddlZddlZddlmZddlmZmZmZddl m Z ddl m Z m ZmZmZm Z mZmZmZddlmZddlmZdd lmZdd lmZejd Zejd Zejd Z ejdZ!dZ"ej#Z#dZ$dZ%dZ&dZ'd6dZ(GddZ)Gdde)Z*Gdde*Z+Gdde+Z,GddZ-dZ.d Z/d!Z0 d7d#Z1Gd$d%Z2 d8d&Z3 d8d'Z4 d8d(Z5 d8d)Z6e3e)fe4e*fe5e+fe6e,fd*Z7d+Z8d,Z9d-Z:d.Z;d/Z< d9d0Z=d6d1Z>d2Z? d:d3Z@ d;d4ZA d6d5ZBdS)<N)_)hexnullrevshort)open)errormatchmdiffphasespycompat requirementsscmutilutil) repository)sidedata) constants) storageutils 20s20s20s20ss20s20s20s20s20ss>20s20s20s20s20sHs>B20s20s20s20s20sHslfsct|d}tjd|d}|dkr(|r$tjt d|zdSt||dz S)z-return the next chunk from stream as a string>lrinvalid chunk length %d) readexactlystructunpackr Abortr)streamdls 7/usr/lib/python3/dist-packages/mercurial/changegroup.pygetchunkr"/spFAA eQ"AAvv  A+a :;;a?@@ @s vq1u % %%rc2tjd|dzS)z*return a changegroup chunk header (string)rrrpack)lengths r! chunkheaderr':s ;ufqj ) ))rc,tjddS)zBreturn a changegroup chunk header (string) for a zero-length chunkrrr$rr! closechunkr*?s ;ua  rc@tt||zS)z3Obtain a changegroup chunk header for a named path.)r'len)paths r! _fileheaderr.Ds s4yy ! !D ((rc(d}d} |r+|r||d}n@t|dd}n.tjdd\}}tj|d}|}|D]}||d}||||/|r|r||Stj|SS#|||/|r|r||wtj|wwxYw)zWrite chunks to a file and return its filename. The stream is assumed to be a bundle file. Existing files will not be overwritten. If no filename is specified, a temporary file is created. Nswbis hg-bundle-s.hg)prefixsuffixwb)rr mkstemposfdopenwritecloseunlink)uichunksfilenamevfsfhcleanupfdcs r! writechunksrAIsR BG#  % 3XXh..(E622#+=PPPLB2t$$B  A HHQKKKK > HHJJJ   #C # 7#### '""""  > HHJJJ   #C # 7#### '"""" s A:CA DceZdZdZeZejZdZdZ ddZ dZ dZ dZ d Zd Zd Zd Zd ZdZdZdZdZddZejddfdZdZdS) cg1unpackeraUnpacker for cg1 changegroup streams. A changegroup unpacker handles the framing of the revision data in the wire format. Most consumers will want to use the apply() method to add the changes from the changegroup to a repository. If you're forwarding a changegroup unmodified to another consumer, use getchunks(), which returns an iterator of changegroup chunks. This is mostly useful for cases where you need to know the data stream has ended by observing the end of the changegroup. deltachunk() is useful only if you're applying delta data. Most consumers should prefer apply() instead. A few other public methods exist. Those are used only for bundlerepo and some debug commands - their use is discouraged. 01rNc,|d}|tjjvr$tjt d|z|dkrd}tj|}|||_||_ |pi|_ d|_ dS)NUNs#unknown stream compression type: %ssBZs _truncatedBZ) r compenginessupportedbundletypesr rr forbundletypedecompressorreader_stream_typeextrascallback)selfr=algrM compengines r!__init__zcg1unpacker.__init__s ;C d&; ; ;+a FGG#MNN N %<<!C%33C88 !44R88  l  rc*|jduo |jdkS)NrF)rLrOs r! compressedzcg1unpacker.compressedsz%=$**==rc6|j|SN)rKread)rOr s r!rXzcg1unpacker.reads|  ###rc6|j|SrW)rKseek)rOposs r!rZzcg1unpacker.seeks|  %%%rc4|jSrW)rKtellrTs r!r]zcg1unpacker.tells|  """rc4|jSrW)rKr7rTs r!r7zcg1unpacker.closes|!!###rct|jd}tjd|d}|dkr(|r$t jt d|zdS|jr||dz S)Nrrrr)rrKrrr rrrN)rOrr s r! _chunklengthzcg1unpacker._chunklengths~  a ( ( M% # #A & 66 Ek!$>"?"?!"CDDD1 =  MMOOO1u rciS)z*v10 does not have a changelog header chunkr)rTs r!changelogheaderzcg1unpacker.changelogheader rciS)z)v10 does not have a manifest header chunkr)rTs r!manifestheaderzcg1unpacker.manifestheaderrcrcd|}|siSt|j|}d|iS)zBreturn the header of the filelogs chunk, v10 only has the filenamefilename)r`rrK)rOr fnames r! filelogheaderzcg1unpacker.filelogheaders<      IDL!,,U##rc8|\}}}}||}n|}d}d} ||||||| fSNrr)) rO headertupleprevnodenodep1p2cs deltabaseflagsprotocol_flagss r! _deltaheaderzcg1unpacker._deltaheadersA&b"b  II IRYE>AArc *|}|siSt|j|j}|j|}t|j||jz }|||}|\}}}} } } } |||| | || i| f SrW)r`rrKdeltaheadersize deltaheaderrru) rOrmr headerdataheaderdeltarnrorprrrqrsrts r! deltachunkzcg1unpacker.deltachunks      I t/CDD !((44DL!d.B*BCC""6844=C:b"iUNRRE5"nLLrc#rKd}|d|jzkrd} t|}|s|dkr|dz }n|r|dz }n\d}tt|Vd}|t|kr&|dz}|||V|}|t|k&t V|d|jzkdSdS)a"returns all the chunks contains in the bundle Used when you need to forward the binary stream to a file or another network API. To do so, it parse the changegroup data, otherwise it will block in case of sshrepo because it don't know the end of the stream. rTrFiN)_grouplistcountr"r'r,r*)rOparts noentrieschunkr[nexts r! getchunkszcg1unpacker.getchunkss &a$....I   qyy "# ! !#e**-----CJJ&&=DD/)))CCJJ&&# *,,   /a$........rc |j|_||}|jd}||||||d|_dS)Nr addrevisioncb) incrementrNre deltaiter manifestlog getstorageaddgroupcomplete)rOreporevmaptrpprogrdeltasstorages r!_unpackmanifestszcg1unpacker._unpackmanifestssy !!"--c22MJJJ  rc :()*+,-./01tjjvptjjvo|jdko|dk}|r&t j|p td} nd} )fd} )fd} |j d|}|j d |j d,d ditj |jj ))|t).t!j|} jt)d t+)*jt)d t)d|} | j|_t,g+*+fd},fd}||})|| | d||sjddt+,}t+)}|*z }| ~d,d|_i1i0jt)djt)dt)d|} d}| rt<j| dvr1fd}| | | | |i}j!ddrj )j"}tG*|D]})$|j%}||&}|'D]:\}}| |t(|;d}| rt<j)| dvr0fd}jt)dtU|| | |||\}}| rt<j+| dvr),| | *|dz 1'D] \}\} }!|,| | | |!!0'D] \}"\} }!|",| | | |!!|j- dd |j- d!d |j- d"d |j- d#d jj.s?|j-dxx|z cc<|j-d!xx|z cc<|j-d"xx|z cc<d }#.r^)}$|#t+|$t+.z z }#|$D]%}%|%.vr|%/r|#dz}#&jj.s|j-d#xx|#z cc<0|d krd$|jvrltc)2*|jd$<tc)2|dz |jd%<tg|j-natg|j-tc)2*-d$<tc)2|dz -d%<j d-d ditj -tG*|(d}&|d'vr14rtjj6x}}&ntjj7x}}&(rtkj8||(|&5+r+9(n(+tkj:||&g+(g+|d kr'()*-.fd)/|;d**z/fd+j<n#j<wxYw|#d kr|#dz }'n|#dz}'|'S).a?Add the changegroup returned by source.read() to this repo. srctype is a string like 'push', 'pull', or 'unbundle'. url is the URL of the repo where this changegroup is coming from. Return an integer summarizing the change to this repo: - nothing changed or no source: 0 - more heads than before: 1+added heads (2..n) - fewer heads than before: -1-removed heads (-2..-n) - number of heads stays the same: 1 `sidedata_categories` is an optional set of the remote's sidedata wanted categories. 04spullT)pullNcvjdt|ztS)Nsadd changeset %s )r9debugrr,)xclrs r!csmapz cg1unpacker.apply..csmap:s. GMM/%((: ; ; ;r77Nrc.|SrWrev)rrs r!rz!cg1unpacker.apply..revmap>s66!99 rssourcesurlprechangegroupthrowsadding changesets changesetschunksunittotalcB|kr|dSdSrW)append)rrclstartduprevss r!ondupchangelogz)cg1unpacker.apply..ondupchangelog^s+==NN3'''''!=rc||}J|j||dSrW)changelogrevisionupdatefilesregister_changeset)rrctx efilessetrs r! onchangelogz&cg1unpacker.apply..onchangelogbsT**3// ,,,  +++''S11111r) alwayscacherduplicaterevisioncbs(applied empty changelog from changegroupswarn-empty-changegroup)configsadding manifests manifestsrc|}|s ||f|<dS||ddzksJ|d|f|<dSNrrget)manifestrrangetouched_manifestss r!on_manifest_revz*cg1unpacker.apply..on_manifest_revsf 1 5 5h ? ?$J;>*-h777#&%(Q,#6#6#6#6;@8S/-h777rrsserversvalidatec|}|s ||f|<dS||ddzksJ|d|f|<dSrr)filelogrrtouched_filelogss r!on_filelog_revz)cg1unpacker.apply..on_filelog_revsf 0 4 4W = =$H9q3,W555rsadding file changes schangegroup-count-changesetsrschangegroup-count-revisionsschangegroup-count-filesschangegroup-count-headsnode node_lastpretxnchangegroup)spushsserve)revsc t krdS jd itjD]]}}t ||d<|d= jd itj|^fd D} j ddtd d|DdS) N changegrouprrincomingcg|]}|v| Sr)r)).0holdheadss r! z7cg1unpacker.apply..runhooks...s#MMMa1H;L;L;L;L;Lrs$%d incoming changes - new heads: %s s, c<g|]}t|ddS)N)r)rr@s r!rz7cg1unpacker.apply..runhooks..3s&#A#A#A1C"1"JJ#A#A#Ar)r)r) r,hookr strkwargscopyrrnheadsr9logjoin) unused_successrargsnewheadsaddedrrhookargsrrs r!runhooksz#cg1unpacker.apply..runhookss#d))++DIMM0B80L0LMMM$KK'}}(+BGGCLL(9(9W  .! JJ1CD1I1IJJJJMMMM4::<<MMMHGKK#@E  #A#A#A#A#ABB rschangegroup-runhooks-%020ic.SrW) _afterlock)trrrs r!z#cg1unpacker.apply..8stx88r)r)r)= unfilteredrREVLOGV2_REQUIREMENTCHANGELOGV2_REQUIREMENTversion sidedatamodget_sidedata_helperssetr setdefaultrr r changelog delayupdaterweakrefproxyr9statusrr, makeprogressrrNrbrr develwarnrrevlog_constantsKIND_MANIFESTLOGr configboolrrrr readdeltaitemsadd KIND_FILELOG_addchangegroupfilesKIND_CHANGELOGrewrite_sidedatachangesquiet closesbranchinvalidatevolatilesetsrrndict publishingr publicdraft registernewextendadvanceboundary addpostcloseflush)2rOrrsrctypeurl targetphase expectedtotalsidedata_categoriesadding_sidedatasidedata_helpersrrrprogressrrrefilesclend changesetsr needfilesmlcsetmfnodemfestfnrnewrevsnewfilesmfstartrevendrevfl deltaheadsrrphaseallretrrrrrrrrrrs2 ` @@@@@@@@@@r!applyzcg1unpacker.applys .   1T5FFM74;LL # %  # 7"   $*?#,suu      $            z  k,,Y@@G K " "63 / / / DI!  )- 191CBK1P1P    B NN2   288::H-##C GNN1344 5 5 5"ggGw++-  q||=,H%.DMIG ( ( ( ( ( ( 2 2 2 2 2 2  " " "^^%%F;; )$2  !!?4"^^FGGEJ      I DM !# !  GNN1233 4 4 4w++,a ll*,H#O J#48H8KKKJJJJJ  ! !- "   Iw!!)[99 >^%!'511>>D11$77@FvJ0022E % >>1!,,Q66::1====>"N H#04DQ4GGGHHHHH GNN1566 7 7 7 4,!!! GX  Q#26Fq6III''-w /@.E.E.G.GQQ*B*6''-=xPPPP.>.D.D.F.FQQ*B*6''-=xPPPP J ! !"A1 E E E J ! !"@! D D D J ! !">q.CCq.C s ]_,,`c#hKdtfdiD]}|ddV|ddS)z returns an iterator of the deltas in this changegroup Useful for passing to the underlying storage system to be stored. Nc.SrW)r|)chainrOsr!rz'cg1unpacker.deltaiter..Jsdooe&<&<rr)iter)rO chunkdatar&s` @r!rzcg1unpacker.deltaiterCs^ <<<<>>$$$&&&###$$$   $$$BBB M M M+++Z    &L ssssj ! ! ! ! !rrCc.eZdZdZeZejZdZdZ dS) cg2unpackerzUnpacker for cg2 streams. cg2 streams add support for generaldelta, so the delta header format is slightly different. All other features about the data remain the same. 02c,|\}}}}}d}d} ||||||| fSrkr) rOrlrmrnrorprrrqrsrts r!ruzcg2unpacker._deltaheader\s1&1#b"iRYE>AArN) r*r+r,r-_CHANGEGROUPV2_DELTA_HEADERrxr/rwrrur)rr!r1r1PsF.K!&OGBBBBBrr1cDeZdZdZeZejZdZdZ dZ dfd Z xZ S) cg3unpackerzUnpacker for cg3 streams. cg3 streams add support for exchanging treemanifests and revlog flags. It adds the revlog flags to the delta header and an empty chunk separating manifests and files. 03r~c*|\}}}}}}d} ||||||| fSrkr)r4s r!ruzcg3unpacker._deltaheaderps.-8*b"iURYE>AArNctt||||||t|jiD]}|d}|jd|z|}|j | ||||s!tj tddS)Nrrgadding %s revisions s"received dir revlog group is empty)superr7rr(rir9rrrrrr rr) rOrrrrrr)rr __class__s r!rzcg3unpacker._unpackmanifestsus k4  11 &#t= 2   d0"55 L LI+&A GMM2Q6 7 7 7^^%%F#..q11::=; Lk!$I"J"JKKK L  L LrrW) r*r+r,r-_CHANGEGROUPV3_DELTA_HEADERrxr/rwrrrur __classcell__r=s@r!r7r7cs|.K!&OGOBBB L L L L L L L L L Lrr7c>eZdZdZeZejZdZdZ fdZ xZ S) cg4unpackerzTUnpacker for cg4 streams. cg4 streams add support for exchanging sidedata. rc(|\}}}}}}} |||||| |fSrWr)) rOrlrmrtrnrorprrrqrss r!ruzcg4unpacker._deltaheaders+=H:b"iURYE>AArc tt||}|s|S|\ }}}}}}} } } | rJi} | tjzr(t |j} tj| } ||||||| | | f SrW) r<rBr|rCG_FLAG_SIDEDATAr"rKrdeserialize_sidedata)rOrmresrnrorprqrrr{rsrrt sidedata_rawr=s r!r|zcg4unpacker.deltachunksK&&11(;; J           K8 8 F#DL11L"7 EEH           r) r*r+r,r-_CHANGEGROUPV4_DELTA_HEADERrxr/rwrrur|r?r@s@r!rBrBsh .K!&OGBBB! ! ! ! ! ! ! ! ! rrBceZdZdZdZdS)headerlessfixupc"||_||_dSrW)_h_fh)rOr=rs r!rRzheaderlessfixup.__init__src|jra|jd||j|dc}|_t||kr(|t|j|t|z z }|St|j|SrW)rMr,rrN)rOrrs r!rXzheaderlessfixup.readss 7 !dgabbkJAtw1vvzz[1s1vv:666H48Q'''rN)r*r+r,rRrXr)rr!rKrKs2(((((rrKc#&K|j d|j}}ng|j|jkr)|j}t jt |}n.|j}t j|jt |}||}tt |t |zt |zV|V|r|V|V|j tj zr+|j }tt |V|VdSdS)z0Serialize a revisiondelta to changegroup chunks.Nr)r{basenodenullidrevisionr trivialdiffheaderr,replacediffheaderbaserevisionsizer'rtrrEr)rr{headerfnr0datametars r!_revisiondeltatochunksrZs {EK 4; & &~(T33~()?TKK 8E??D c$ii#f++-D 9 : :::: JJJ  JJJ k::>#h--((((( rc4fd}t||S)z&Sort nodes for changegroup generation.c@|SrWr)rrlookups r!rz$_sortnodesellipsis..sBFF66!99%%rkey)sorted)storenodesrr]r_s `` r!_sortnodesellipsisrcs*$ & % % % %C %S ! ! !!rc |} fd| r%ttfkrtt} } nVt| dkr%tfd| D\} t} ntfd| D\} } | | } } | | |fS)Nc2|tkrtSr|S|g}|r|d}|dd}|vr|S|vr3|d|Dn| vr&|d |Dntt ddD]} ||kr|cS t j dr j}n jj}tj d| |fz|tS) aTurn a changelog revnum into a local revnum. The ellipsis dag is stored as revnums on the changelog, but when we're producing ellipsis entries for non-changelog revlogs, we need to turn those numbers into something local. This does that for us, and during the changelog sending phase will also expand the stored mappings as needed. rrNc(g|]}|tk |Sr)rrpps r!rz=_resolvenarrowrevisioninfo..local..*sLLLBbGmmRmmmrc(g|]}|tk |Sr)rgrhs r!rz=_resolvenarrowrevisioninfo..local..-sJJJBB'MMRMMMrtargets?unable to resolve parent while packing '%s' %r for changeset %r) rr parentrevsrlinkrevr safehasattr display_id_revlogr r) clrevwalkpirlrclrevtolocalrev fullclnodes ischangelogprecomputedellipsisrras r!localz)_resolvenarrowrevisioninfo..local s G  N  Lw& QA8DO##&q))k!! LL"--*:*:LLLMMMM))) JJ"5a"8JJJ sAr**!!A}}Q''500 1#E8446"-FF#]5Fk),2C+?@G& Prrc3.K|]}|VdSrWr)rrtrzs r! z-_resolvenarrowrevisioninfo..Qs+55AuuQxx555555rc3.K|]}|VdSrWr)r|s r!r}z-_resolvenarrowrevisioninfo..Ts+66Qa666666r)rmrr,r`rn)rrarxrrnlinknodervrwry linkparentsrorpp1nodep2noderzs```` ``` @r!_resolvenarrowrevisioninfors&g.KCCCCCCCCCCCJ 75++C00Wg4FFF'B [  Q  555555555 6666+66666BZZ^^UZZ^^FF 68 ##rFc #K|sdS|j} |rd} n|rt||| |}d} nd} |rg}i}i}|D]}||}||}| |}|||<|| vr|||<n,|| vrKt| ||||||| | \}}}||f||<|||<|||}d}|7|j|tdt|}|j dd}|dvr,td }|j ||ztj }|r tj }n%|d kr tj}n|d kr tj}||| d | || }t#|D]\}}|r||dz|rO||j}|j|vr8||j\}}||_||_|xjtjzc_n||j}||_|V|r|dSdS)a6Calculate deltas for a set of revisions. Is a generator of ``revisiondelta`` instances. If topic is not None, progress detail will be generated using this topic name (e.g. changesets, manifests, etc). See `revlogutil.sidedata.get_sidedata_helpers` for the doc on `sidedata_helpers`. Nsstoragesnodesrrsdevels bundle.delta)rp1fulls0config "devel.bundle.delta" as unknown value: %srrT) nodesorder revisiondataassumehaveparentrevisions deltamoderr)rrcrrrr9rrr,rwarnrCG_DELTAMODE_STDCG_DELTAMODE_PREVCG_DELTAMODE_P1CG_DELTAMODE_FULL emitrevisions enumeraterrnrrrsREVISION_FLAG_ELLIPSISrr)rrarbrxr]forcedeltaparentprevtopicellipsesrvrwryrrrfilteredadjustedparents linknodesrnrrrnrrr configtargetmsgr revisionsrurSs r! deltagroupr[s0  B "5%V<<  ) " "" "D))D//Cvd||HffX&&G'*OG $;&&"* $ 333 ,F#' , ,(*0(8%"* $ OOD ! ! ! !H 7'' ) CJJ(  7>>(O<.>s$r) _oldmatcher_matcherr_forcedeltaparentprev_builddeltaheader _manifestsend _ellipsesr _bundlecaps_remote_sidedata _isshallow _fullclnodes_precomputedellipsis_repor9verbose debugflagnote _verbosenote)rOr oldmatchermatcherrbuilddeltaheader manifestsendr bundlecapsrshallow ellipsisroots fullnodesremote_sidedatas r!rRzcgpacker.__init__sd%  %9"!1)!  J%  "!eeO /!%%2! :=  /)@ / $ 2D    .D   rTc #(K|jj|tdd}d}|jdkr)|j}|dkrj}tj|}| |||\} } | D]6} t|j| |j D]} |t| z }| V7t} |t| z }tV|td|z| d}| d }| d }|otj }i}d}|||||||| d | }|D]\}} |r0|jd vsJt#|} |t| z }| V| D]8} t|j| |j }|D]} |t| z }| V9t} |t| z }| V|td|z|jVd}|jr'|jr fdt+j|D}|fd|D}||||||||| }|D]\}} t#|}t|}|V| D]8} t|j| |j }|D]} |t| z }| V9t} |t| z }| V|td||fztV|r-dt5|d|dSdS)zYield a sequence of changegroup byte chunks. If changelog is False, changelog data won't be added to changegroup s%uncompressed size of bundle content: rNrsstrip)generaters%8.i (changelog) clrevorderr changedfilesclrevtomanifestrev)r)r8rs%8.i (manifests) cXg|]&\}}j||f'Sr))rrX)rrlrrs r!rz%cgpacker.generate..sFQ!!$))++R0rc:h|]}|Sr)r)rrrs r! z$cgpacker.generate..s#---"&&))---rs %8.i %s soutgoing)rnsource)rrrrrr_wanted_sidedatarr_generatechangelogrZrr,r*ristreemanifestgeneratemanifestsr.rrrr iteritemsclear generatefilesrr)rO commonrevsclnodesfastpathlinkrevrrr/rrclstaterr{rr7 clrevorder manifests changedfilesfnodesittreer:mfdictsclrevsr-rrrs @@r!rzcgpacker.generate@sz ^ !EFFGGG <5 "3O!!#'"7*?o   11  - 2     E/ E4#9  E "     E ll !122T9:::]+ L) / (*N'2H2N2N.N  # #       ) *-$     LD& |~5555#D))E "   /Jt'=$  ECJJ&DKKKK LLE CJJ DKKKK !122T9:::     > do '1)<<G ----W---          -    ? ?LD&D!!Aq66DGGG  /Jt'=$  ECJJ&DKKKK LLE CJJ DKKK   a ..$= > > > >ll  H IIkGAJI G G G G G H Hrc i i jjt i d}|sjs{t |j}|D]^}|}t  |< |j | |j _|dfS  fd}tj|d|j jtdijj| } || fS)aGenerate data for changelog chunks. Returns a 2-tuple of a dict containing state and an iterable of byte chunks. The state will not be fully populated until the chunk stream has been fully consumed. if generate is False, the state will be fully populated and no chunk stream will be yielded See `revlogutil.sidedata.get_sidedata_helpers` for the doc on `sidedata_helpers`. )rrrrr^r)c|}t|< jr| jvs| jvrY|j}|||| jrE |j nP |j n5|j| |j |SrW) rr,rrrrrrrrrXkeysr) rr@ manifestnoderrrclrevtomanifestrevrmflrOs r!lookupclz-cgpacker._generatechangelog..lookupcls>$$Q''A OOJqM~ - ***vvayyD$===$%:L((q999 '11q 377<#8#8 ?1 ''AJ(<(<(>(>(C(C(E(EFFFF ''0000$$QZ333##AG,,,HrTrrrrvrwryr)rrrrr`rrr,rrrrrrrrr)rOrrbrrstaternr@rgenrrrrrs`` @@@@@r!rzcgpacker._generatechangelogsq  j$uu &#)#5    DN 5bf---E - -((..#&z?? 4 $$QZ666##AG,,,,"9  & & & & & & & & & & & P J      &^M"") $ 9-    czrc #TK|j} | jdifd} r\} } |j| dd} | r| sA| }| sg}n||| |}| r|sw| | | }t|j||d||j|j td||j |j | }|j |jdds| |fVn |D]}| s| gfVdSdS)a8Returns an iterator of changegroup chunks containing manifests. `source` is unused here, but is used by extensions like remotefilelog to change what is sent based in pulls vs pushes, etc. See `revlogutil.sidedata.get_sidedata_helpers` for the doc on `sidedata_helpers`. rc:r rJjSfd}|S)Nc|}|d}|D]\}}}|dkrL|zdz}|i}|||} | |kr|||<X|z} | i} | ||} | | kr|| |<|S)aPCallback for looking up the linknode for manifests. Returns the linkrev node for the specified manifest. SIDE EFFECT: 1) fclnodes gets populated with the list of relevant file nodes if we're not using fastpathlinkrev 2) When treemanifests are in use, collects treemanifest nodes to send Note that this means manifests must be completely sent to the client before you can trust the list of files and treemanifests to send. T)rt/)rreadfast iterentriesr)rclnodemdatartrrsubtree tmfclnodes tmfclnoderfclnodesfclnoderrrrbtmfnodesrs r!lookupmflinknodezRcgpacker.generatemanifests..makelookupmflinknode..lookupmflinknode]s  qa((11$1?? % 1 1 3 3 1 1HAq"Tzz"&(T/%-%8%8"%E%E $.$9$9!V$D$D %f- 90EEE,2JqM 1H#)#4#4Q#;#;"*"5"5a"@"@%f- 70CCC*0HQK r) __getitem__) rrbrrrrrrrs `` r!makelookupmflinknodez8cgpacker.generatemanifests..makelookupmflinknodeUs\ -!,,          B$ #rNrkFrr)rrpopitemrvisitdirr_prunemanifestsrrrrrrrr)rOrrrrrrrvrrrrrb should_visitra prunednodeslookupfnrrrrs ```` @@r!rzcgpacker.generatemanifests;s&z# ) $) $) $) $) $) $) $) $) $) $V2 #"**,,KD%=11$ss)<.s3CCCaCCQLL $B$B$B$B$Br)rrrrn)rOrarbrrrs `@@r!rzcgpacker._prunemanifestssP~ ::<< Iu} cCCCCCC5CCCCrc #Kfd|D}|sfdnjjjfdijr)fdDjjjfd} n} j} | jtdtdt|} tt|D]\} } | | }|s$tj td| z| || fd }|j|jcfd D}|s| | d z| t#j||d |jjjj| }| |fV| dS)Nchg|].}||,|/Sr))rr)rrrOs r!rz*cgpacker.generatefiles..sS   }}Q )-(8(8(;(;    rc0|iSrWr)unusedrhrs r!normallinknodesz/cgpacker.generatefiles..normallinknodesszz%,,,rc`|j|jfd|D}fd|DS)Nc32K|]}||fVdSrWr))rrflinkrevs r!r}zBcgpacker.generatefiles..normallinknodes..s088QHHQKK(888888rcHi|]\}}|v ||Sr)r))rrrclnrfnodes r! zCcgpacker.generatefiles..normallinknodes..s4LLLearV||a##b''|||r)rnrn)rarhrrr r rs @@r!rz/cgpacker.generatefiles..normallinknodessL = 8888%888LLLLLLtLLLLrc*g|]}j|Sr))r)rr@rOs r!rz*cgpacker.generatefiles..s<<.linknodess#A ! 5 1 13788E??00 4'e44u::W--")..B "ud 3 3 E>>+.uU|RU+K+K+KE%LL".+-E%L s?AAAfilesrs!empty or missing file data for %sc|SrWr))r linkrevnodess r! lookupfilelogz-cgpacker.generatefiles..lookupfilelogs #A&rc@g|]}|v|Sr)r)rs r!rz*cgpacker.generatefiles..s:33ttAww<dddd^w#w#w#w#r D D D2mmmmmmrrc >d} t|||d| dd||||| S)Ncdt|j|j|j|jSrW)r.r%rnrrrrs r!rz _makecg1packer..?s(!.^s,!r%rnrrrQrrsrs r!rz _makecg3packer..|s0!.builddeltaheaders>*//  F H H J J G   rr)rrrrrrrrr)r!s r!_makecg4packerr-sR       )\\#'    r)rDr2r8rctt}d}|jdds/|jddst j|rd}|s|d|jddp%tj |jvptj |jv}|s|d|S) NFs experimentals changegroup3s treemanifestTr8s changegroup4r) r _packermaprr9rrrdiscardrrr)rversionsneedv03want_v4s r!allsupportedversionsr4s:??$$%%HG ?O<<  7  o ? ?   !$ ' '    ?O<< E  ,0A A E  /43D D   Orc t|SrW)r4rs r!supportedincomingversionsr7s  % %%rct|}tj|r*|d|dtj|jvr*|d|dt |jvr*|d|d|S)NrDr2)r4rrr0rNARROW_REQUIREMENTLFS_REQUIREMENTrr1s r!supportedoutgoingversionsr<s#D))Hd## &$*;;; $+++  Orc:tt|SrW)maxr<r6s r! localversionr?s (.. / //rct|}tj|jvr|d|sJt |S)NrD)r<rGENERALDELTA_REQUIREMENTr0rr;s r! safeversionrBsK)..H,0AAA OOO x==rc |t|vsJ|tj}|tj}|dkr(|st jd|r(|dvr$t jtd|z||}t|d} | |||||||||  S)NrDs;version 01 changegroups do not support sparse file matchers)rDr2sSellipsis nodes require at least cg3 on client and server, but negotiated version %sr)rrrrr) r<matchmodalwaysneverr ProgrammingErrorrr narrowmatchr/) rrrrrrrrrrfns r! getbundlerrJ s /55 5 5 5 5/##^%% % 0 0$ J    G~--k -       w''G G Q B 2 #'    rc>t|d|||S)Nr)rM)r/)rr=rPrMs r! getunbundlerrL@s! g q !"c& 9 9 99rcF|jjs|dkr7|jtdt |z|jjrI|jd|D].}|jdt|z-dSdS)Nsbundles%d changesets found slist of changesets: s%s )r9rrrr,rrr)rrbrrns r!_changegroupinforNDs wA&I-- q122SZZ?@@@ w/  ./// / /D GMM'CII- . . . .// / /rc t||||||}t|tj|ddt |jiS)N)fastpathrsclcount) makestreamrLr chunkbufferr,missing)routgoingrrrPrcgstreams r!makechangegrouprVMse  H  "" S)**+   rct|||||}|}|j} |j} |j} | |p-|jduo$| t|k} | dd|t|| || | | | |S)N)rrrs preoutgoingT)rr) rJrcommonrS ancestorsofsort filternamer`rrrNr) rrTrrrPrrrbundlerrcsetsrrs r!rQrQ`s ' G ??  DJ  E  E JJLLL 4AEVDJJLL-A-A$A IInDI888T5&)))   J G GGrc d}d}|jtdtd|} t|jiD]} |dz }| d} |jd| z| || } t| } | }| ||||}|s!tj tdn;#tj $r)}tj td |zd}~wwxYw|t| | z z }| |vr||| }t| t| D]Q}| |}||vr||1tj td |s|| =| |D]{\} }|| } |D]^} | |#tj$r4tj td | t+|fzwxYw|||fS) Nrrrrrgr;rs#received file revlog group is emptys#received delta base is censored: %ss#received spurious file revlog entrys+missing file data for %s:%s - run hg verify)r9rrr(rirrrr,rrr rCensoredBaseErrorrrnremoverrr LookupErrorr)rrrr expectedfilesrrrrrr)rrorreneedsnewrs r!rrsI Ew## ( !H++]$H&.33!!    k "  .2333 YYq\\ GG M%%''FKK+  E  Mk!$J"K"KLLL M& M M M+a FGG!KLL L MSWWq[ >>aLEQB(( Q QGGCLL::LLOOOO+a(N&O&OPPP !aL OO%%  5 YYq\\  A q $   kDEE#a&&k"   e s&7ADE$D;;E!H77AI:rW)NFNNNN)FFNNN)NNNFFNNN)FN)FNNN)Cr4rri18nrrnrrrr rr r rDr r rrr interfacesr revlogutilsrrrrutilsrStructr.r5r>rIr:rr"r'r*r.rArCr1r7rBrKrZrcrrrr"r&r*r-r/r4r7r<r?rBrJrLrNrVrQrr)rr!rms                      #"""""000000666666+fmO<<+fm,>??+fm,@AA+fm,ABB &&&*** !!! ))) # # # #Fa!a!a!a!a!a!a!a!HBBBBB+BBB&LLLLL+LLLB/ / / / / +/ / / d ( ( ( ( ( ( ( (D""",\$\$\$L  PPPPfC C C C C C C C V H F F %%%%R K ( K ( K ( K ( :&&& 0000    0000f::::///AE0  H H H HT999999r