manifest: add manifestctx.readdelta()

This adds an implementation of readdelta to the new manifestctx class and adds a
couple consumers of it. This currently appears to have some duplicate code, but
future patches cause this function to diverge when things like "shallow" are
introduced.
This commit is contained in:
Durham Goode 2016-09-13 16:25:21 -07:00
parent 5bcff70a60
commit 23d229132c
3 changed files with 36 additions and 2 deletions

View File

@ -332,7 +332,7 @@ class cg1unpacker(object):
for cset in xrange(clstart, clend):
mfnode = repo.changelog.read(
repo.changelog.node(cset))[0]
mfest = repo.manifest.readdelta(mfnode)
mfest = repo.manifestlog[mfnode].readdelta()
# store file nodes we must see
for f, n in mfest.iteritems():
needfiles.setdefault(f, set()).add(n)

View File

@ -532,7 +532,8 @@ class changectx(basectx):
@propertycache
def _manifestdelta(self):
return self._repo.manifest.readdelta(self._changeset.manifest)
mfnode = self._changeset.manifest
return self._repo.manifestlog[mfnode].readdelta()
@propertycache
def _parents(self):

View File

@ -993,6 +993,25 @@ class manifestctx(object):
self._data = manifestdict(text)
return self._data
def readdelta(self):
revlog = self._revlog
if revlog._usemanifestv2:
# Need to perform a slow delta
r0 = revlog.deltaparent(revlog.rev(self._node))
m0 = manifestctx(revlog, revlog.node(r0)).read()
m1 = self.read()
md = manifestdict()
for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems():
if n1:
md[f] = n1
if fl1:
md.setflag(f, fl1)
return md
r = revlog.rev(self._node)
d = mdiff.patchtext(revlog.revdiff(revlog.deltaparent(r), r))
return manifestdict(d)
class treemanifestctx(object):
def __init__(self, revlog, dir, node):
revlog = revlog.dirlog(dir)
@ -1033,6 +1052,20 @@ class treemanifestctx(object):
def node(self):
return self._node
def readdelta(self):
# Need to perform a slow delta
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
class manifest(manifestrevlog):
def __init__(self, opener, dir='', dirlogcache=None):
'''The 'dir' and 'dirlogcache' arguments are for internal use by