[PATCH 4 of 4 v2] changegroup3: move treemanifest support into _unpackmanifests()

Augie Fackler raf at durin42.com
Wed Jan 13 13:34:21 CST 2016


On Wed, Jan 13, 2016 at 12:09:42PM -0600, Martin von Zweigbergk wrote:
> # HG changeset patch
> # User Martin von Zweigbergk <martinvonz at google.com>
> # Date 1452298378 28800
> #      Fri Jan 08 16:12:58 2016 -0800
> # Node ID 42af0ccdbc9ededd770e35f3f7243dbc81ac98df
> # Parent  12f845942d02e226575a9185cda3b2ede378fe46
> changegroup3: move treemanifest support into _unpackmanifests()

queued these. In hindsight this new format should have been behind a
flag all along. Sigh.

>
> By putting the treemanifest code in _unpackmanifests(),
> _addchangegroupfiles() will only be about files again, and we get a
> nice symmetry between _packmanifests() and _unpackmanifest(). The
> immediate benefit to me is that remotefilelog should not need to be
> updated to work with treemanifests. It should also make
> server.validate and progress output easier to get right. Probably
> bundlerepo too.
>
> diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
> --- a/mercurial/changegroup.py
> +++ b/mercurial/changegroup.py
> @@ -517,6 +517,20 @@
>          node, p1, p2, deltabase, cs, flags = headertuple
>          return node, p1, p2, deltabase, cs, flags
>
> +    def _unpackmanifests(self, repo, revmap, trp, prog, numchanges):
> +        super(cg3unpacker, self)._unpackmanifests(repo, revmap, trp, prog,
> +                                                  numchanges)
> +        while True:
> +            chunkdata = self.filelogheader()
> +            if not chunkdata:
> +                break
> +            # If we get here, there are directory manifests in the changegroup
> +            d = chunkdata["filename"]
> +            repo.ui.debug("adding %s revisions\n" % d)
> +            dirlog = repo.manifest.dirlog(d)
> +            if not dirlog.addgroup(self, revmap, trp):
> +                raise error.Abort(_("received dir revlog group is empty"))
> +
>  class headerlessfixup(object):
>      def __init__(self, fh, h):
>          self._h = h
> @@ -1055,32 +1069,22 @@
>  def _addchangegroupfiles(repo, source, revmap, trp, pr, needfiles):
>      revisions = 0
>      files = 0
> -    submfsdone = False
>      while True:
>          chunkdata = source.filelogheader()
>          if not chunkdata:
> -            if source.version == "03" and not submfsdone:
> -                submfsdone = True
> -                continue
>              break
>          f = chunkdata["filename"]
>          repo.ui.debug("adding %s revisions\n" % f)
>          pr()
> -        directory = (f[-1] == '/')
> -        if directory:
> -            # a directory using treemanifests
> -            fl = repo.manifest.dirlog(f)
> -        else:
> -            fl = repo.file(f)
> +        fl = repo.file(f)
>          o = len(fl)
>          try:
>              if not fl.addgroup(source, revmap, trp):
>                  raise error.Abort(_("received file revlog group is empty"))
>          except error.CensoredBaseError as e:
>              raise error.Abort(_("received delta base is censored: %s") % e)
> -        if not directory:
> -            revisions += len(fl) - o
> -            files += 1
> +        revisions += len(fl) - o
> +        files += 1
>          if f in needfiles:
>              needs = needfiles[f]
>              for new in xrange(o, len(fl)):
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list