[PATCH 5 of 8] manifest: add manifestlog.get to obtain subdirectory instances

Martin von Zweigbergk martinvonz at google.com
Thu Sep 15 12:51:26 EDT 2016


On Wed, Sep 14, 2016 at 4:04 PM, Durham Goode <durham at fb.com> wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1473893509 25200
> #      Wed Sep 14 15:51:49 2016 -0700
> # Node ID 33a7df42b989c555972280f6b84e2fac38babf7b
> # Parent  d41da1522f8efb5bf5aa75a51f0093b1129b6b5a
> manifest: add manifestlog.get to obtain subdirectory instances
>
> Previously manifestlog only allowed obtaining root level manifests. Future
> patches will need direct access to subdirectory manifests as part of changegroup
> creation,

Can I ask for this patch to be moved closer to those future patches so
it's easier to see how this is related and that the API makes sense
for those patches? I haven't checked to make sure, but the next
patches in this series didn't seem to depend on this patch. I can just
drop this patch in flight if you agree.

> so let's add a get() function that knows how to deal with
> subdirectories.
>
> diff --git a/mercurial/manifest.py b/mercurial/manifest.py
> --- a/mercurial/manifest.py
> +++ b/mercurial/manifest.py
> @@ -1040,20 +1040,34 @@ class manifestlog(object):
>          """Retrieves the manifest instance for the given node. Throws a KeyError
>          if not found.
>          """
> -        if node in self._mancache:
> -            cachemf = self._mancache[node]
> -            # The old manifest may put non-ctx manifests in the cache, so skip
> -            # those since they don't implement the full api.
> -            if (isinstance(cachemf, manifestctx) or
> -                isinstance(cachemf, treemanifestctx)):
> -                return cachemf
> +        return self.get('', node)
>
> -        if self._treeinmem:
> -            m = treemanifestctx(self._revlog, '', node)
> +    def get(self, dir, node):
> +        """Retrieves the manifest instance for the given node. Throws a KeyError
> +        if not found.
> +        """
> +        if dir:
> +            if self._treeinmem:
> +                m = treemanifestctx(self._revlog.dirlog(dir), dir, node)
> +            else:
> +                raise error.Abort(
> +                        _("cannot ask for manifest directory '%s' in a flat "
> +                          "manifest") % dir)
>          else:
> -            m = manifestctx(self._revlog, node)
> -        if node != revlog.nullid:
> -            self._mancache[node] = m
> +            if node in self._mancache:
> +                cachemf = self._mancache[node]
> +                # The old manifest may put non-ctx manifests in the cache, so
> +                # skip those since they don't implement the full api.
> +                if (isinstance(cachemf, manifestctx) or
> +                    isinstance(cachemf, treemanifestctx)):
> +                    return cachemf
> +
> +            if self._treeinmem:
> +                m = treemanifestctx(self._revlog, '', node)
> +            else:
> +                m = manifestctx(self._revlog, node)
> +            if node != revlog.nullid:
> +                self._mancache[node] = m
>          return m
>
>      def add(self, m, transaction, link, p1, p2, added, removed):
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list