o ]Lb@sddlmZddlZddlZddlZddlmZddlmZm Z m Z ddl m Z ddl mZmZmZmZm Z mZmZmZddlmZdd lmZdd lmZdd lmZed Z ed Z!edZ"edZ#dZ$ej%Z%ddZ&ddZ'ddZ(ddZ)dOddZ*Gddde+Z,Gddde,Z-Gdd d e-Z.Gd!d"d"e.Z/Gd#d$d$e+Z0d%d&Z1d'd(Z2d)d*Z3  +    dPd,d-Z4Gd.d/d/e+Z5 + +   dQd0d1Z6 + +   dQd2d3Z7 + +   dQd4d5Z8 + +   dQd6d7Z9e6e,fe7e-fe8e.fe9e/fd8Z:d9d:Z;d;d<ZZ=d?d@Z>dAdBZ?    + +   dRdCdDZ@dOdEdFZAdGdHZB dSdIdJZC +   dTdKdLZD dOdMdNZEdS)U)absolute_importN)_)hexnullrevshort)open)errormatchmdiffphasespycompat requirementsscmutilutil) repository)sidedata) constants) storageutils 20s20s20s20ss20s20s20s20s20ss>20s20s20s20s20sHs>B20s20s20s20s20sHslfscCsJt|d}td|d}|dkr|rttd|dSt||dS)z-return the next chunk from stream as a string>lrinvalid chunk length %d) readexactlystructunpackr Abortr)streamdlr 7/usr/lib/python3/dist-packages/mercurial/changegroup.pygetchunk0s r"cCstd|dS)z*return a changegroup chunk header (string)rrrpack)lengthr r r! chunkheader;r&cCs tddS)zBreturn a changegroup chunk header (string) for a zero-length chunkrrr#r r r r! closechunk@s r(cCstt||S)z3Obtain a changegroup chunk header for a named path.)r&len)pathr r r! _fileheaderEr'r+c Csd}d}zN|r|r||d}nt|dd}ntjddd\}}t|d}|}|D]}||q*d}|W|dur>||durR|rL|rL||St|SS|dur[||duro|ri|ri||wt|ww)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)uichunksfilenamevfsfhcleanupfdcr r r! writechunksJs8      r=c@seZdZdZeZejZdZdZ d%ddZ ddZ d d Z d d Z d dZddZddZddZddZddZddZddZddZd%dd Zejddfd!d"Zd#d$ZdS)& 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. 01rNcCsh|durd}|tjjvrttd||dkrd}tj|}|||_||_ |p-i|_ d|_ dS)NUNs#unknown stream compression type: %ssBZs _truncatedBZ) r compenginessupportedbundletypesr rr forbundletypedecompressorreader_stream_typeextrascallback)selfr9algrG compenginer r r!__init__s     zcg1unpacker.__init__cCs|jduo |jdkS)Nr@)rFrIr r r! compressedszcg1unpacker.compressedcC |j|SN)rEread)rIrr r r!rQ zcg1unpacker.readcCrOrP)rEseek)rIposr r r!rSrRzcg1unpacker.seekcC |jSrP)rEtellrMr r r!rV zcg1unpacker.tellcCrUrP)rEr3rMr r r!r3rWzcg1unpacker.closecCsTt|jd}td|d}|dkr|rttd|dS|jr&||dS)Nrrrr)rrErrr rrrH)rIrrr r r! _chunklengths zcg1unpacker._chunklengthcCiS)z*v10 does not have a changelog header chunkr rMr r r!changelogheaderzcg1unpacker.changelogheadercCrY)z)v10 does not have a manifest header chunkr rMr r r!manifestheaderr[zcg1unpacker.manifestheadercCs$|}|siSt|j|}d|iS)zBreturn the header of the filelogs chunk, v10 only has the filenamefilename)rXrrE)rIrfnamer r r! filelogheaders  zcg1unpacker.filelogheaderc Cs8|\}}}}|dur |}n|}d}d} ||||||| fSNrr ) rI headertupleprevnodenodep1p2cs deltabaseflagsprotocol_flagsr r r! _deltaheaders zcg1unpacker._deltaheaderc Csp|}|siSt|j|j}|j|}t|j||j}|||}|\}}}} } } } |||| | || i| f SrP)rXrrEdeltaheadersize deltaheaderrrj) rIrbr headerdataheaderdeltarcrdrergrfrhrir r r! deltachunks  zcg1unpacker.deltachunkccsd}|d|jkrUd} t|}|s#|dkr|d7}n|r"|d7}n%d}tt|Vd}|t|krG|d}|||V|}|t|ks4q tV|d|jks dSdS)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()rIparts noentrieschunkrTnextr r r! getchunkss.   zcg1unpacker.getchunkscCsH|j|_||}|jd}|j||||d|d|_dS)Nr addrevisioncb) incrementrHr\ deltaiter manifestlog getstorageaddgroupcomplete)rIreporevmaptrpprogrydeltasstorager r r!_unpackmanifestss  zcg1unpacker._unpackmanifestsc( stjjvptjjvo|jdko|dk}|r'tj|p"tdd} nd} fdd} fdd } z|j d |}|j d |j d4d dit |jj |tt|} jtdtjjtdtd|d} | j|_tgfdd}fdd}||}j|| | d||dsjjdddt}t}|}| ~dd|_i i jtdjjtdtd|d} d}| rtj| dvr fdd}|j | | | |di}j!d d!r8j j"}t #|D]$}$|j%}||&}t '|D]\}}| |t(|q&qd}| rKtj)| dvrK fd"d#}jtd$t*|| | |||d\}}| rtj+| dvru,| | |d -D]\}\} }!|,| | | |!qy -D]\}"\} }!|",| | | |!q|j. d%d&|j. d'd&|j. d(d&|j. d)d&jj/s|j.d%|7<|j.d'|7<|j.d(|7<d&}#r}$|#t|$t7}#|$D]}%|%vr|%0r|#d8}#qjj/s|j.d)|#7<1|d&krbd*|jvr;t23|jd*<t23|d|jd+<t4|jnt4|jt23d*<t23|dd+<j ,d5d dit t #|d}&|d-vr5rzt6j7}}&nt6j8}}&rt69|||&durr:nt6j;||&gd.g|d&krÇfd/d0|.csmapcs |SrPrevrrr r!r?rWz!cg1unpacker.apply..revmapssourcesurlprechangegroupthrowsadding changesets changesetschunksunittotalcs|kr |dSdSrP)append)rr)clstartduprevsr r!ondupchangelog_sz)cg1unpacker.apply..ondupchangelogcs2||}dus J|j||dSrP)changelogrevisionupdatefilesregister_changeset)rrctx) efilessetrr r! onchangelogcs   z&cg1unpacker.apply..onchangelog) alwayscacheryduplicaterevisioncbs(applied empty changelog from changegroupswarn-empty-changegroup)configsadding manifests manifestsrcF|}|s||f|<dS||ddksJ|d|f|<dSNrrget)manifestrrange)touched_manifestsr r!on_manifest_rev z*cg1unpacker.apply..on_manifest_revrxsserversvalidatecrrr)filelogrr)touched_filelogsr r!on_filelog_revrz)cg1unpacker.apply..on_filelog_revsadding file changes schangegroup-count-changesetsrschangegroup-count-revisionsschangegroup-count-filesschangegroup-count-headsnode node_lastpretxnchangegroup)spushsserve)revsc stkrdSjd itD]}}t||d<|d=jd it|qfddD}j ddtd d d|DdS) N changegrouprrincomingcsg|]}|vr|qSr r ).0h)oldheadsr r! /z7cg1unpacker.apply..runhooks..s$%d incoming changes - new heads: %s s, cSsg|] }t|ddqS)N)rrr<r r r!r4s)r)r) r)hookr strkwargscopyrrcheadsr5logjoin)unused_successrargsnewheads)addedrrhookargsrrr r!runhooks s z#cg1unpacker.apply..runhooksschangegroup-runhooks-%020ics SrP) _afterlock)tr)rrr r!9 z#cg1unpacker.apply..)r)r)> unfilteredrREVLOGV2_REQUIREMENTCHANGELOGV2_REQUIREMENTversion sidedatamodget_sidedata_helperssetr setdefaultrr r changelog delayupdaterweakrefproxyr5statusrr) makeprogressrzrHrZr{r~ develwarnrrevlog_constantsKIND_MANIFESTLOGr configboolr|xrangerr readdelta iteritemsadd KIND_FILELOG_addchangegroupfilesKIND_CHANGELOGrewrite_sidedataitemschangesquiet closesbranchinvalidatevolatilesetsrrcdict publishingr publicdraft registernewextendadvanceboundary addpostcloseflush)(rIrrsrctypeurl targetphase expectedtotalsidedata_categoriesadding_sidedatasidedata_helpersrrrprogressrrrefilesclend changesetsr needfilesmlcsetmfnodemfestfnrnewrevsnewfilesmfstartrevendrevfl deltaheadsrrphaseallretr ) rrrrrrrrrrrr!applysZ                               zcg1unpacker.applyc#s:dtfddiD] }|ddV|dq dS)z returns an iterator of the deltas in this changegroup Useful for passing to the underlying storage system to be stored. Ncs SrP)rpr chainrIr r!rKrz'cg1unpacker.deltaiter..r)iter)rI chunkdatar rr!r{Ds  zcg1unpacker.deltaiterrP)__name__ __module__ __qualname____doc___CHANGEGROUPV1_DELTA_HEADERrlsizerkrrrrLrNrQrSrVr3rXrZr\r_rjrprwrr rrr{r r r r!r>ms6    -  7r>c@s&eZdZdZeZejZdZddZ 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 Cs(|\}}}}}d}d} ||||||| fSr`r rIrarbrcrdrergrfrhrir r r!rj]szcg2unpacker._deltaheaderN) rrrr_CHANGEGROUPV2_DELTA_HEADERrlrrkrrjr r r r!r Qs  r cs<eZdZdZeZejZdZdZ ddZ d fdd Z Z 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. 03rqc Cs&|\}}}}}}d} ||||||| fSr`r r"r r r!rjqszcg3unpacker._deltaheaderNc sxtt|j|||||dt|jiD]&}|d}|jd||}|j |j ||||ds9t t dqdS)Nrxr]adding %s revisions s"received dir revlog group is empty)superr$rrr_r5rr{r|r}r~r rr) rIrrrrryrrr __class__r r!rvs   zcg3unpacker._unpackmanifestsrP) rrrr_CHANGEGROUPV3_DELTA_HEADERrlrrkrrrrjr __classcell__r r r(r!r$dsr$cs6eZdZdZeZejZdZddZ fddZ Z S) cg4unpackerzTUnpacker for cg4 streams. cg4 streams add support for exchanging sidedata. rc Cs$|\}}}}}}} |||||| |fSrPr ) rIrarbrircrdrergrfrhr r r!rjszcg4unpacker._deltaheaderc sntt||}|s |S|\ }}}}}}} } } | rJi} | tj@r,t|j} t| } ||||||| | | f SrP) r'r,rprCG_FLAG_SIDEDATAr"rErdeserialize_sidedata) rIrbresrcrdrerfrgrorhrri sidedata_rawr(r r!rps:    zcg4unpacker.deltachunk) rrrr_CHANGEGROUPV4_DELTA_HEADERrlrrkrrjrpr+r r r(r!r,sr,c@seZdZddZddZdS)headerlessfixupcCs||_||_dSrP)_h_fh)rIr9rr r r!rLs zheaderlessfixup.__init__cCsZ|jr'|jd||j|d}|_t||kr%|t|j|t|7}|St|j|SrP)r3r)rr4)rIr rr r r!rQs    zheaderlessfixup.readN)rrrrLrQr r r r!r2s r2ccs|jdur d|j}}n|j|jkr|j}tt|}n |j}t|jt|}||}t t|t|t|V|V|rE|V|V|j t j @r]|j }t t|V|VdSdS)z0Serialize a revisiondelta to changegroup chunks.Nr)robasenodenullidrevisionr trivialdiffheaderr)replacediffheaderbaserevisionsizer&rirr-r)rroheaderfnr,datametarr r r!_revisiondeltatochunkss&    r>csfdd}t||dS)z&Sort nodes for changegroup generation.cs|SrPr)r rlookupr r!rsz$_sortnodesellipsis..key)sorted)storenodesrr@rBr r?r!_sortnodesellipsiss rFc s|} fdd| rttfkr!tt} } n"t| dkr6tfdd| D\} t} n tfdd| D\} } | | } } | | |fS)Ncs|tkrtSr |S|g}|rs|d}|dd}|vr!|S|vr3|dd|Dn>|vrD|dd|Dn-tddD] }||krX|SqKtdrcj}nj j}t d ||f|stS) 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. rrNcSg|]}|tkr|qSr rrppr r r!r+rz=_resolvenarrowrevisioninfo..local..cSrGr rHrIr r r!r.rtargets?unable to resolve parent while packing '%s' %r for changeset %r) rr parentrevsr rlinkrevr safehasattr display_id_revlogr r)clrevwalkpirL)rclrevtolocalrev fullclnodes ischangelogprecomputedellipsisrrDr r!local s<    (z)_resolvenarrowrevisioninfo..localrc3|]}|VqdSrPr rrTrZr r! Rz-_resolvenarrowrevisioninfo..c3r[rPr r\r]r r!r^Ur_)rMrr)rCrc)rrDrXrrNlinknoderVrWrY linkparentsrdrep1nodep2noder )rrVrWrXrZrYrrDr!_resolvenarrowrevisioninfos E   rdFc  cs|sdS|j} |r d} n|rt||| |}d} nd} |rhg}i}i}|D]@}||}||}| |}|||<|| vrB|||<n|| vrGq%t| ||||||| | \}}}||f||<|||<||q%|}d}|dur{|jj|tdt|d}|j dd}|dvrtd }|j ||t j }|rt j }n|d krt j}n|d krt j}|j|| d | || d }t|D]:\}}|r||d|r||j}|j|vr||j\}}||_||_|jt jO_n||j}||_|Vq|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: %srerfT) nodesorder revisiondataassumehaveparentrevisions deltamoderr)rrFrrdrr5rrr)rwarnrCG_DELTAMODE_STDCG_DELTAMODE_PREVCG_DELTAMODE_P1CG_DELTAMODE_FULL emitrevisions enumeraterrcrbrcrhREVISION_FLAG_ELLIPSISr`r)rrDrErXr@forcedeltaparentprevtopicellipsesrVrWrYrrrgfilteredadjustedparents linknodesrcrr`rNrbrcr configtargetmsgrj revisionsrUr7r r r! deltagroup\s          r|c@s\eZdZ       dddZ dddZ ddd Z dd d Zd d Z dddZdS)cgpackerFNcCs|sJ|sJ||_||_||_||_||_||_| |_|dur$t}||_| dur.t} | |_ | |_ | |_ | |_ ||_ |j jjrO|j jjsO|j jj|_dSdd|_dS)a Given a source repo, construct a bundler. oldmatcher is a matcher that matches on files the client already has. These will not be included in the changegroup. matcher is a matcher that matches on files to include in the changegroup. Used to facilitate sparse changegroups. forcedeltaparentprev indicates whether delta parents must be against the previous revision in a delta group. This should only be used for compatibility with changegroup version 1. builddeltaheader is a callable that constructs the header for a group delta. manifestsend is a chunk to send after manifests have been fully emitted. ellipses indicates whether ellipsis serving mode is enabled. bundlecaps is optional and can be used to specify the set of capabilities which can be used to build the bundle. While bundlecaps is unused in core Mercurial, extensions rely on this feature to communicate capabilities to customize the changegroup packer. shallow indicates whether shallow data might be sent. The packer may need to pack file contents not introduced by the changes being packed. fullnodes is the set of changelog nodes which should not be ellipsis nodes. We store this rather than the set of nodes that should be ellipsis because for very large histories we expect this to be significantly smaller. remote_sidedata is the set of sidedata categories wanted by the remote. NcSsdSrPr )sr r r!r?sz#cgpacker.__init__..) _oldmatcher_matcherr_forcedeltaparentprev_builddeltaheader _manifestsend _ellipsesr _bundlecaps_remote_sidedata _isshallow _fullclnodes_precomputedellipsis_repor5verbose debugflagnote _verbosenote)rIr oldmatchermatcherrbuilddeltaheader manifestsendrs bundlecapsrushallow ellipsisroots fullnodesremote_sidedatar r r!rLs,2zcgpacker.__init__Tc #s|jj|tdd}d}|jdkr'|j}|dkr!j}t|}|j |||d\} } | D]} t |j| |j D] } |t | 7}| Vq>q4t } |t | 7}t V|td|| d}| d }| d }|ott }i}d}|j||||||| d |d }|D]A\}} |r|jd vsJt|} |t | 7}| V| D]} t |j| |j }|D] } |t | 7}| Vqqt } |t | 7}| Vq|td||jVd}|jr|jrfddt|D}|fdd|D}|j||||||||d }|D]D\}} t|}t |}|V| D]} t |j| |j }|D] } |t | 7}| Vq&qt } |t | 7}| V|td||fq t V|rcjdt|d|ddSdS)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)r%rs%8.i (manifests) cs"g|] \}}j||fqSr )r|rQ)rr lrrr r!rsz%cgpacker.generate..csh|]}|qSr r)rrrr r! z$cgpacker.generate..s %8.i %s soutgoing)rcsource)rrrrrr_wanted_sidedatarr_generatechangelogr>rr)r(ristreemanifestgeneratemanifestsr+rrrr rclear generatefilesrr)rI commonrevsclnodesfastpathlinkrevrrrrrclstaterrorur3 clrevorder manifests changedfilesfnodesittreer6mfdictsclrevsr*rr rr!rAs                 zcgpacker.generatec siijjtid}|sAjsAt|jd}|D]}|}t|<|j | |j q"|dfSfdd}t j|d|j jtdijj|d } || 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`. )rrrrrAr cs|}t|<jrI|jvs|jvr0|j}||||jrA |j |S |j |S|j| |j |SrP) rr)rrrrrrrrrQkeysr)rr< manifestnoderrrclrevtomanifestrevrmflrIr r!lookupcls$      z-cgpacker._generatechangelog..lookupclTrrurtrVrWrYr)rr|rrrCrrr)rrrrr|rrrr) rIrrErrstatercr<rgenr rr!rsD   (zcgpacker._generatechangelogc #s|j} | jdifdd} r\} } |j| dd} | r-| s-q| }| s7g}n||| |}| rC|sCq| | | }t|j||d||j|j t d||j |j |d }|j |jddsp| |fVn |D]}qr| s|| gfVsdSdS) 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`. rcs,r rJjSfdd}|S)Nc s|}|jdd}|D]D\}}}|dkr:|d}|i}|||}||kr9|||<q|} | i} | ||} || krV|| |<q|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) rclnodemdatarTr rsubtree tmfclnodes tmfclnoder fclnodesfclnode)rrrrEtmfnodesrr r!lookupmflinknode^s"     zRcgpacker.generatemanifests..makelookupmflinknode..lookupmflinknode) __getitem__)rrErrrrrrr)rErr!makelookupmflinknodeVs !z8cgpacker.generatemanifests..makelookupmflinknodeNrKFrr)rr|popitemrvisitdirr}_prunemanifestsr|rrrrrrr)rIrrrrrrrVrrrrrE should_visitrD prunednodeslookupfnrrr rr!r<sL+      zcgpacker.generatemanifestscs2|js|S|j|jfdd|DS)Nc g|] }|vr|qSr r rr rflrfrevr r!rs z,cgpacker._prunemanifests..)rrrrN)rIrDrErr rr!rszcgpacker._prunemanifestsc #sp fdd|D}|sfdd n jjjfdd i jr= fddD jjj fdd} n } j} | jjtd td t|d } t t |D]Z\} } | | }|skt td | | ||  fd d }|j|jfdd D}|sqW| j| d| dt j||d| j j j j|d }| |fVqW| dS)Ncs$g|]}|r|s|qSr )rr)rr rMr r!rsz*cgpacker.generatefiles..cs |iSrPr)unusedr^)rr r!normallinknodesrRz/cgpacker.generatefiles..normallinknodescs4|j|jfdd|D}fdd|DS)Nc3s|] }||fVqdSrPr )rr)flinkrevr r!r^szBcgpacker.generatefiles..normallinknodes..cs&i|]\}}|vr||qSr r )rrr)clnrfnoder r! s&zCcgpacker.generatefiles..normallinknodes..)rNrc)rDr^r)rr)rrr!rscsg|]}j|qSr )rrrMr r!rrc sD]}z||}|||<WqtjyYqw||}t|tkrOD] \}}||d}||vrHt|||d||<q.|rN|||<q.|S)NrA)filenoderr ManifestLookupErrorr)rmin)flogr^r<rlinksr r)rRrV commonctxsrrr r!rxs"    z)cgpacker.generatefiles..linknodesfilesrs!empty or missing file data for %scs|SrPr r) linkrevnodesr r! lookupfilelogz-cgpacker.generatefiles..lookupfilelogcrr r rrr r!rsr)itemF)rurVrWrYr)rrrcrrr5rrr)rqrCfiler rrrNrr|rrrrr)rIrrrrrrrrrxrrrUr^ filerevlogr filenodesrr ) rrRrrVrrrrrrrrrIr!rsb         zcgpacker.generatefiles)FNFFNNN)T)TNrP) rrrrLrrrrrr r r r!r}s&  R  o yr}c Cs(dd} t|||d| dd|||||d S)NcSst|j|j|j|jSrP)rr$rcrbrcr`rr r r!r@sz _makecg1packer..r?rT)rrrsrrurrrr} rrrrrurrrrrr r r!_makecg1packer5s rc Cs&dd} t|||d| d|||||d S)NcSst|j|j|j|j|jSrP)r#r$rcrbrcr5r`rr r r!r_sz _makecg2packer..r!rrrrrurrrrrr r r!_makecg2packerTs rc Cs(dd} t|||d| t|||||d S)NcSs t|j|j|j|j|j|jSrP)r*r$rcrbrcr5r`rhrr r r!r}sz _makecg3packer..r%rr}r(rr r r!_makecg3packerrs rc Cs*dd} t|||d| t||||||d S)Nc Ss$t|j|j|j|j|j|j|jSrP) r1r$rircrbrcr5r`rhrr r r!rsz(_makecg4packer..builddeltaheaderr)rrrrurrrrrrr r r!_makecg4packers  r)r?r!r%rcCstt}d}|jdds|jddst|rd}|s$|d|jddp6tj |jvp6tj |jv}|s>|d|S) NFs experimentals changegroup3s treemanifestTr%s changegroup4r) r _packermaprr5rrrdiscardrrr)rversionsneedv03want_v4r r r!allsupportedversionss&        rcCst|SrP)rrr r r!supportedincomingversionsrrcCsht|}t|r|d|dtj|jvr#|d|dt|jvr2|d|d|S)Nr?r!)rrrrrNARROW_REQUIREMENTLFS_REQUIREMENTrrr r r!supportedoutgoingversionss         rcCs tt|SrP)maxrrr r r! localversions rcCs.t|}tj|jvr|d|sJt|S)Nr?)rrGENERALDELTA_REQUIREMENTrrrr r r! safeversions   rc Cs|t|vsJ|durt}|durt}|dkr%|s%td|r4|dvr4ttd|||}t |d} | ||||||||| d S)Nr?s;version 01 changegroups do not support sparse file matchers)r?r!sSellipsis nodes require at least cg3 on client and server, but negotiated version %sr)rurrrr) rmatchmodalwaysneverr ProgrammingErrorrr narrowmatchr) rrrrrrurrrrfnr r r! getbundlers<   r cCst|d|||dS)Nr)rG)r)rr9rJrGr r r! getunbundlerAsr cCsb|jjs|dkr|jtdt||jjr-|jd|D]}|jdt|q dSdS)Nsbundles%d changesets found slist of changesets: s%s )r5rrrr)rrr)rrErrcr r r!_changegroupinfoEs r cCs2t||||||d}t|t|ddt|jiS)N)fastpathrsclcount) makestreamr r chunkbufferr)missing)routgoingrrr rcgstreamr r r!makechangegroupNs rc Cs~t|||||d}|}|j} |j} |j} | |p(|jduo(| t|k} |j dd|dt || || | | | |S)N)rrrs preoutgoingT)rr) r rcommonr ancestorsofsort filternamerCrrr r) rrrrr rrrbundlerrcsetsrrr r r!ras$  rc Csd}d}|jjtdtd|d} t|jiD]} |d7}| d} |jd| | || } t| } z| }| j ||||d}|sMt tdWnt j yd}z t td |d}~ww|t| | 7}| |vr|| }t| t| D]}| |}||vr||q}t td |s|| =q| t|D]*\} }|| } |D]}z| |Wqt jyt td | t|fwq||fS) Nrrrrr]r&rxs#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)r5rrrr_rrzrr)r{r~r rCensoredBaseErrorr rrcremoverrr LookupErrorr)rrrr expectedfilesrryr{rrrr rorreneedsnewr r r r!rsj       rrP)NFNNNN)FFNNN)NNNFFNNN)FN)FNNN)F __future__rr0rri18nrrcrrrr rr r rr r rrr interfacesr revlogutilsrrrrutilsrStructrr#r*r1rrr"r&r(r+r=objectr>r r$r,r2r>rFrdr|r}rrrrrrrrrrr r r rrrr r r r!s   (         #g!2"f O $ # # )  3  *