[PATCH 4 of 4] manifest: change manifestctx to not inherit from manifestdict
Durham Goode
durham at fb.com
Tue Aug 30 19:40:44 EDT 2016
# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1472519937 25200
# Mon Aug 29 18:18:57 2016 -0700
# Node ID 8076d529408e977951286dbd58e81066f97a9b8d
# Parent 4b26b5cd815a717ee0ee930f4deef0959ef7c492
manifest: change manifestctx to not inherit from manifestdict
If manifestctx inherits from manifestdict, it requires some weird logic to
lazily load the dict if a piece of information is asked for. This ended up being
complicated and unintuitive to use.
Let's move the dict creation to .read(). This will make even more sense once we
start adding readdelta() and other similar methods to manifestctx.
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -528,7 +528,7 @@ class changectx(basectx):
@propertycache
def _manifest(self):
- return self._repo.manifestlog[self._changeset.manifest]
+ return self._repo.manifestlog[self._changeset.manifest].read()
@propertycache
def _manifestdelta(self):
diff --git a/mercurial/manifest.py b/mercurial/manifest.py
--- a/mercurial/manifest.py
+++ b/mercurial/manifest.py
@@ -948,9 +948,9 @@ class manifestlog(object):
"""
if node == revlog.nullid:
if self._oldmanifest._treeinmem:
- return treemanifest()
+ return treemanifestctx(self._revlog, node, dir='')
else:
- return manifestdict()
+ return manifestctx(self._revlog, node)
if node in self._mancache:
cachemf = self._mancache[node]
@@ -967,33 +967,38 @@ class manifestlog(object):
self._mancache[node] = m
return m
-class manifestctx(manifestdict):
+class manifestctx(object):
"""A class representing a single revision of a manifest, including its
contents, its parent revs, and its linkrev.
"""
def __init__(self, revlog, node):
self._revlog = revlog
+ self._data = None
self._node = node
self.p1, self.p2 = revlog.parents(node)
rev = revlog.rev(node)
self.linkrev = revlog.linkrev(rev)
- # This should eventually be made lazy loaded, so consumers can access
- # the node/p1/linkrev data without having to parse the whole manifest.
- data = revlog.revision(node)
- arraytext = array.array('c', data)
- revlog._fulltextcache[node] = arraytext
- super(manifestctx, self).__init__(data)
-
def node(self):
return self._node
-class treemanifestctx(treemanifest):
+ def read(self):
+ if self._node == revlog.nullid:
+ return manifestdict()
+ if not self._data:
+ data = self._revlog.revision(self._node)
+ arraytext = array.array('c', data)
+ self._revlog._fulltextcache[self._node] = arraytext
+ self._data = manifestdict(data)
+ return self._data
+
+class treemanifestctx(object):
def __init__(self, revlog, node, dir=''):
revlog = revlog.dirlog(dir)
self._revlog = revlog
self._dir = dir
+ self._data = None
self._node = node
@@ -1004,19 +1009,27 @@ class treemanifestctx(treemanifest):
#rev = revlog.rev(node)
#self.linkrev = revlog.linkrev(rev)
- if revlog._treeondisk:
- super(treemanifestctx, self).__init__(dir=dir)
- def gettext():
- return revlog.revision(node)
- def readsubtree(dir, subm):
- return revlog.dirlog(dir).read(subm)
- self.read(gettext, readsubtree)
- self.setnode(node)
- else:
- data = revlog.revision(node)
- arraytext = array.array('c', data)
- revlog.fulltextcache[node] = arraytext
- super(treemanifestctx, self).__init__(dir=dir, text=data)
+ def read(self):
+ if self._node == revlog.nullid:
+ return treemanifest()
+
+ if not self._data:
+ if self._revlog._treeondisk:
+ treemf = treemanifest(dir=self._dir)
+ def gettext():
+ return self._revlog.revision(self._node)
+ def readsubtree(dir, subm):
+ return treemanifestctx(self._revlog, subm, dir).read()
+ treemf.read(gettext, readsubtree)
+ treemf.setnode(self._node)
+ self._data = treemf
+ else:
+ data = self._revlog.revision(self._node)
+ arraytext = array.array('c', data)
+ self._revlog.fulltextcache[self._node] = arraytext
+ self._data = treemanifest(dir=self._dir, text=data)
+
+ return self._data
class manifest(manifestrevlog):
def __init__(self, opener, dir='', dirlogcache=None):
More information about the Mercurial-devel
mailing list