From patchwork Tue Sep 20 19:36:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [7, of, 9, V3] manifest: add shallow option to treemanifestctx.readdelta and readfast From: Durham Goode X-Patchwork-Id: 16691 Message-Id: To: Date: Tue, 20 Sep 2016 12:36:29 -0700 # HG changeset patch # User Durham Goode # Date 1474399441 25200 # Tue Sep 20 12:24:01 2016 -0700 # Node ID f778e735327d24c3ced233c206acb11f65f55ea0 # Parent 22915866409350cbb5302289c05bb65bc1bfd308 manifest: add shallow option to treemanifestctx.readdelta and readfast The old manifest had different functions for performing shallow reads, shallow readdeltas, and shallow readfasts. Since a lot of the code is duplicate (and since those functions don't make sense on a normal manifestctx), let's unify them into flags on the existing readdelta and readfast functions. A future diff will change consumers of these functions to use the manifestctx versions and will delete the old apis. diff --git a/mercurial/manifest.py b/mercurial/manifest.py --- a/mercurial/manifest.py +++ b/mercurial/manifest.py @@ -1109,7 +1109,7 @@ class manifestctx(object): self._data = manifestdict(text) return self._data - def readfast(self): + def readfast(self, shallow=False): rl = self._revlog r = rl.rev(self._node) deltaparent = rl.deltaparent(r) @@ -1117,7 +1117,7 @@ class manifestctx(object): return self.readdelta() return self.read() - def readdelta(self): + def readdelta(self, shallow=False): revlog = self._revlog if revlog._usemanifestv2: # Need to perform a slow delta @@ -1176,27 +1176,40 @@ class treemanifestctx(object): def node(self): return self._node - def readdelta(self): - # Need to perform a slow delta + def readdelta(self, shallow=False): revlog = self._revlog - r0 = revlog.deltaparent(revlog.rev(self._node)) - m0 = treemanifestctx(revlog, revlog.node(r0), dir=self._dir).read() - m1 = self.read() - md = treemanifest(dir=self._dir) - for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems(): - if n1: - md[f] = n1 - if fl1: - md.setflag(f, fl1) - return md + if shallow and revlog._treeondisk and not revlog._usemanifestv2: + if revlog._usemanifestv2: + raise error.Abort( + _("shallow readdelta() not implemented for manifestv2")) + r = revlog.rev(self._node) + d = mdiff.patchtext(revlog.revdiff(revlog.deltaparent(r), r)) + return manifestdict(d) + else: + # Need to perform a slow delta + r0 = revlog.deltaparent(revlog.rev(self._node)) + m0 = treemanifestctx(revlog, revlog.node(r0), dir=self._dir).read() + m1 = self.read() + md = treemanifest(dir=self._dir) + for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems(): + if n1: + md[f] = n1 + if fl1: + md.setflag(f, fl1) + return md - def readfast(self): + def readfast(self, shallow=False): rl = self._revlog r = rl.rev(self._node) deltaparent = rl.deltaparent(r) - if deltaparent != revlog.nullrev and deltaparent in rl.parentrevs(r): - return self.readdelta() - return self.read() + if (deltaparent != revlog.nullrev and + deltaparent in rl.parentrevs(r)): + return self.readdelta(shallow=shallow) + + if shallow: + return manifestdict(rl.revision(self._node)) + else: + return self.read() class manifest(manifestrevlog): def __init__(self, opener, dir='', dirlogcache=None):