comparison mercurial/manifest.py @ 29938:a059b17352ef

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.
author Durham Goode <durham@fb.com>
date Tue, 13 Sep 2016 16:25:21 -0700
parents be16091ac14d
children 80be4436e4cc
comparison
equal deleted inserted replaced
29937:2c302c654451 29938:a059b17352ef
991 arraytext = array.array('c', text) 991 arraytext = array.array('c', text)
992 self._revlog._fulltextcache[self._node] = arraytext 992 self._revlog._fulltextcache[self._node] = arraytext
993 self._data = manifestdict(text) 993 self._data = manifestdict(text)
994 return self._data 994 return self._data
995 995
996 def readdelta(self):
997 revlog = self._revlog
998 if revlog._usemanifestv2:
999 # Need to perform a slow delta
1000 r0 = revlog.deltaparent(revlog.rev(self._node))
1001 m0 = manifestctx(revlog, revlog.node(r0)).read()
1002 m1 = self.read()
1003 md = manifestdict()
1004 for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems():
1005 if n1:
1006 md[f] = n1
1007 if fl1:
1008 md.setflag(f, fl1)
1009 return md
1010
1011 r = revlog.rev(self._node)
1012 d = mdiff.patchtext(revlog.revdiff(revlog.deltaparent(r), r))
1013 return manifestdict(d)
1014
996 class treemanifestctx(object): 1015 class treemanifestctx(object):
997 def __init__(self, revlog, dir, node): 1016 def __init__(self, revlog, dir, node):
998 revlog = revlog.dirlog(dir) 1017 revlog = revlog.dirlog(dir)
999 self._revlog = revlog 1018 self._revlog = revlog
1000 self._dir = dir 1019 self._dir = dir
1030 1049
1031 return self._data 1050 return self._data
1032 1051
1033 def node(self): 1052 def node(self):
1034 return self._node 1053 return self._node
1054
1055 def readdelta(self):
1056 # Need to perform a slow delta
1057 revlog = self._revlog
1058 r0 = revlog.deltaparent(revlog.rev(self._node))
1059 m0 = treemanifestctx(revlog, revlog.node(r0), dir=self._dir).read()
1060 m1 = self.read()
1061 md = treemanifest(dir=self._dir)
1062 for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems():
1063 if n1:
1064 md[f] = n1
1065 if fl1:
1066 md.setflag(f, fl1)
1067 return md
1035 1068
1036 class manifest(manifestrevlog): 1069 class manifest(manifestrevlog):
1037 def __init__(self, opener, dir='', dirlogcache=None): 1070 def __init__(self, opener, dir='', dirlogcache=None):
1038 '''The 'dir' and 'dirlogcache' arguments are for internal use by 1071 '''The 'dir' and 'dirlogcache' arguments are for internal use by
1039 manifest.manifest only. External users should create a root manifest 1072 manifest.manifest only. External users should create a root manifest