Mercurial > public > mercurial-scm > hg
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 |