[PATCH 2 of 2 narrowhg-ext] manifest: fix narrowmanifest to be narrowmanifestlog

Martin von Zweigbergk martinvonz at google.com
Tue Nov 15 12:26:34 EST 2016


queued these with some minor changes (dropped unused import and
changed an "add" to "write"). Thanks!

On Mon, Nov 14, 2016 at 3:30 PM, Durham Goode <durham at fb.com> wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1479166205 28800
> #      Mon Nov 14 15:30:05 2016 -0800
> # Node ID 331ce6adfeccf8f21bdda8ddfb28da8f4b410848
> # Parent  33646477f95dcfd2b7d4eede4d190569ca142be6
> manifest: fix narrowmanifest to be narrowmanifestlog
>
> Upstream hg has completely refactored the manifest class, so we need to update
> our internal narrowmanifest* logic. In some ways the new logic is simpler, since
> we only need to wrap manifestlog.get() to cover all manifestctx creations
> instead of having to wrap every manifest revlog to capture all creations. We
> still need to wrap manifestrevlog creations to insert the narrowrevlog mixin,
> but that is now completely separate logic from the tree oriented
> excludeddirmanfiestctx logic.
>
> diff --git a/src/narrowrepo.py b/src/narrowrepo.py
> --- a/src/narrowrepo.py
> +++ b/src/narrowrepo.py
> @@ -37,11 +37,16 @@ def wraprepo(repo):
>              narrowrevlog.makenarrowchangelog(cl)
>              return cl
>
> +        def _constructmanifest(self):
> +            manifest = super(narrowrepository, self)._constructmanifest()
> +            narrowrevlog.makenarrowmanifestrevlog(manifest)
> +            return manifest
> +
>          @cacheprop('00manifest.i')
> -        def manifest(self):
> -            mf = super(narrowrepository, self).manifest
> -            narrowrevlog.makenarrowmanifest(mf, self)
> -            return mf
> +        def manifestlog(self):
> +            mfl = super(narrowrepository, self).manifestlog
> +            narrowrevlog.makenarrowmanifestlog(mfl, self)
> +            return mfl
>
>          def file(self, f):
>              fl = super(narrowrepository, self).file(f)
> diff --git a/src/narrowrevlog.py b/src/narrowrevlog.py
> --- a/src/narrowrevlog.py
> +++ b/src/narrowrevlog.py
> @@ -17,15 +17,6 @@ assert (revlog.REVIDX_KNOWN_FLAGS & ELLI
>  revlog.REVIDX_KNOWN_FLAGS |= ELLIPSIS_NODE_FLAG
>
>
> -if util.safehasattr(manifest, 'treemanifestctx'):
> -    def inittreemanifestctx(orig, self, revlog, dir, node):
> -        orig(self, revlog, dir, node)
> -        if isinstance(self._revlog, excludeddirmanifestlog):
> -            self._data = excludeddir(dir, node)
> -
> -    extensions.wrapfunction(manifest.treemanifestctx, '__init__',
> -                            inittreemanifestctx)
> -
>  class narrowrevlogmixin(object):
>      """Mixin for revlog subclasses to make them support narrow clones."""
>
> @@ -77,15 +68,15 @@ class excludeddir(manifest.treemanifest)
>      def copy(self):
>          return self
>
> -class excludeddirmanifestlog(manifest.manifest):
> -    def __init__(self, dir):
> +class excludeddirmanifestctx(manifest.treemanifestctx):
> +    def __init__(self, dir, node):
>          self._dir = dir
> -        self._treeondisk = True
> +        self._node = node
>
> -    def read(self, node):
> -        return excludeddir(self._dir, node)
> +    def read(self):
> +        return excludeddir(self._dir, self._node)
>
> -    def add(self, *args):
> +    def write(self, *args):
>          # We should never write entries in dirlogs outside the narrow clone.
>          # However, the method still gets called from writesubtree() in
>          # _addtree(), so we need to handle it. We should possibly make that
> @@ -93,17 +84,23 @@ class excludeddirmanifestlog(manifest.ma
>          # in excludeddir instances).
>          pass
>
> -def makenarrowmanifest(mf, repo):
> -    if not isinstance(mf, narrowrevlogmixin):
> -        class narrowmanifest(narrowrevlogmixin, mf.__class__):
> +def makenarrowmanifestrevlog(mfrevlog):
> +    if not isinstance(mfrevlog, narrowrevlogmixin):
> +        class narrowmanifestrevlog(narrowrevlogmixin, mfrevlog.__class__):
>              def dirlog(self, dir):
> -                if not repo.narrowmatch().visitdir(dir[:-1] or '.'):
> -                    dirlog = excludeddirmanifestlog(dir)
> -                else:
> -                    dirlog = super(narrowmanifest, self).dirlog(dir)
> -                    makenarrowmanifest(dirlog, repo)
> -                return dirlog
> -        mf.__class__ = narrowmanifest
> +                result = super(narrowmanifestrevlog, self).dirlog(dir)
> +                makenarrowmanifestrevlog(result)
> +                return result
> +
> +        mfrevlog.__class__ = narrowmanifestrevlog
> +
> +def makenarrowmanifestlog(mfl, repo):
> +    class narrowmanifestlog(mfl.__class__):
> +        def get(self, dir, node, verify=True):
> +            if not repo.narrowmatch().visitdir(dir[:-1] or '.'):
> +                return excludeddirmanifestctx(dir, node)
> +            return super(narrowmanifestlog, self).get(dir, node, verify=verify)
> +    mfl.__class__ = narrowmanifestlog
>
>  def makenarrowfilelog(fl, narrowmatch):
>      if not isinstance(fl, narrowrevlogmixin):


More information about the Mercurial-devel mailing list