[PATCH 4 of 4 STABLE] manifest: make treemanifestctx store the repo

Durham Goode durham at fb.com
Tue Oct 18 20:54:33 EDT 2016


Foozy pointed this out to me at the sprint and I didn't manage to get it 
done in time for the freeze.  This series fixes a pretty notable 
regression from the old manifest code in that the manifestlog is being 
recreated every time repo.manifestlog is called.


On 10/18/16 5:50 PM, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1476837882 25200
> #      Tue Oct 18 17:44:42 2016 -0700
> # Branch stable
> # Node ID d5bc7048144e6c9675134b85aadb9d7b69d406aa
> # Parent  3efece5c59853908d65de53635488361dbf20c49
> manifest: make treemanifestctx store the repo
>
> Same as in the last commit, the old treemanifestctx stored a reference to the
> revlog.  If the inmemory revlog became invalid, the ctx now held an old copy and
> would be incorrect. To fix this, we need the ctx to go through the manifestlog
> for each access.
>
> This is the same pattern that changectx already uses (it stores the repo, and
> accesses commit data through self._repo.changelog).
>
> diff --git a/mercurial/manifest.py b/mercurial/manifest.py
> --- a/mercurial/manifest.py
> +++ b/mercurial/manifest.py
> @@ -1274,7 +1274,7 @@ class manifestlog(object):
>                   return cachemf
>   
>           if self._treeinmem:
> -            m = treemanifestctx(self._revlog, '', node)
> +            m = treemanifestctx(self._repo, '', node)
>           else:
>               m = manifestctx(self._repo, node)
>           if node != revlog.nullid:
> @@ -1344,9 +1344,8 @@ class manifestctx(object):
>           return manifestdict(d)
>   
>   class treemanifestctx(object):
> -    def __init__(self, revlog, dir, node):
> -        revlog = revlog.dirlog(dir)
> -        self._revlog = revlog
> +    def __init__(self, repo, dir, node):
> +        self._repo = repo
>           self._dir = dir
>           self._data = None
>   
> @@ -1359,23 +1358,27 @@ class treemanifestctx(object):
>           #rev = revlog.rev(node)
>           #self.linkrev = revlog.linkrev(rev)
>   
> +    def _revlog(self):
> +        return self._repo.manifestlog._revlog.dirlog(self._dir)
> +
>       def read(self):
>           if not self._data:
> +            rl = self._revlog()
>               if self._node == revlog.nullid:
>                   self._data = treemanifest()
> -            elif self._revlog._treeondisk:
> +            elif rl._treeondisk:
>                   m = treemanifest(dir=self._dir)
>                   def gettext():
> -                    return self._revlog.revision(self._node)
> +                    return rl.revision(self._node)
>                   def readsubtree(dir, subm):
> -                    return treemanifestctx(self._revlog, dir, subm).read()
> +                    return treemanifestctx(self._repo, dir, subm).read()
>                   m.read(gettext, readsubtree)
>                   m.setnode(self._node)
>                   self._data = m
>               else:
> -                text = self._revlog.revision(self._node)
> +                text = revlog.revision(self._node)
>                   arraytext = array.array('c', text)
> -                self._revlog.fulltextcache[self._node] = arraytext
> +                rl.fulltextcache[self._node] = arraytext
>                   self._data = treemanifest(dir=self._dir, text=text)
>   
>           return self._data
> @@ -1385,9 +1388,9 @@ class treemanifestctx(object):
>   
>       def readdelta(self):
>           # Need to perform a slow delta
> -        revlog = self._revlog
> +        revlog = self._revlog()
>           r0 = revlog.deltaparent(revlog.rev(self._node))
> -        m0 = treemanifestctx(revlog, self._dir, revlog.node(r0)).read()
> +        m0 = treemanifestctx(self._repo, self._dir, revlog.node(r0)).read()
>           m1 = self.read()
>           md = treemanifest(dir=self._dir)
>           for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems():
> @@ -1398,7 +1401,7 @@ class treemanifestctx(object):
>           return md
>   
>       def readfast(self):
> -        rl = self._revlog
> +        rl = self._revlog()
>           r = rl.rev(self._node)
>           deltaparent = rl.deltaparent(r)
>           if deltaparent != revlog.nullrev and deltaparent in rl.parentrevs(r):
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=DQIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=OIS_lb8Kz_3P14_jz49eK8NtZN8h_4KBUiwQwg-aGE0&s=ERR5QLZxx3JCSTEzVblfNLFdAGeJFkFj1ag-Hp79DaI&e=



More information about the Mercurial-devel mailing list