changeset 29941:1cc93a154723

manifest: move dirlog up to manifestrevlog This removes dirlog and its associated cache from manifest and puts it in manifestrevlog. The notion of there being sub-logs is specific to the revlog implementation, and therefore belongs on the revlog class. This patch will enable future patches to move the serialization logic for manifests onto manifestrevlog, which will allow us to move manifest.add onto manifestlog in a way that it just calls out to manifestrevlog for the serialization.
author Durham Goode <durham@fb.com>
date Tue, 13 Sep 2016 16:00:41 -0700
parents fa145a205a7f
children 3664537386ab
files mercurial/manifest.py
diffstat 1 files changed, 19 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/manifest.py	Tue Sep 13 16:00:41 2016 -0700
+++ b/mercurial/manifest.py	Tue Sep 13 16:00:41 2016 -0700
@@ -896,7 +896,7 @@
     '''A revlog that stores manifest texts. This is responsible for caching the
     full-text manifest contents.
     '''
-    def __init__(self, opener, dir=''):
+    def __init__(self, opener, dir='', dirlogcache=None):
         # During normal operations, we expect to deal with not more than four
         # revs at a time (such as during commit --amend). When rebasing large
         # stacks of commits, the number can go up, hence the config knob below.
@@ -921,6 +921,11 @@
                 dir = dir + '/'
             indexfile = "meta/" + dir + "00manifest.i"
         self._dir = dir
+        # The dirlogcache is kept on the root manifest log
+        if dir:
+            self._dirlogcache = dirlogcache
+        else:
+            self._dirlogcache = {'': self}
 
         super(manifestrevlog, self).__init__(opener, indexfile)
 
@@ -931,6 +936,15 @@
     def clearcaches(self):
         super(manifestrevlog, self).clearcaches()
         self._fulltextcache.clear()
+        self._dirlogcache = {'': self}
+
+    def dirlog(self, dir):
+        if dir:
+            assert self._treeondisk
+        if dir not in self._dirlogcache:
+            self._dirlogcache[dir] = manifestrevlog(self.opener, dir,
+                                                    self._dirlogcache)
+        return self._dirlogcache[dir]
 
 class manifestlog(object):
     """A collection class representing the collection of manifest snapshots
@@ -1115,12 +1129,7 @@
             usetreemanifest = opts.get('treemanifest', usetreemanifest)
         self._mancache = util.lrucachedict(cachesize)
         self._treeinmem = usetreemanifest
-        super(manifest, self).__init__(opener, dir=dir)
-        # The dirlogcache is kept on the root manifest log
-        if dir:
-            self._dirlogcache = dirlogcache
-        else:
-            self._dirlogcache = {'': self}
+        super(manifest, self).__init__(opener, dir=dir, dirlogcache=dirlogcache)
 
     def _newmanifest(self, data=''):
         if self._treeinmem:
@@ -1128,6 +1137,9 @@
         return manifestdict(data)
 
     def dirlog(self, dir):
+        """This overrides the base revlog implementation to allow construction
+        'manifest' types instead of manifestrevlog types. This is only needed
+        until we migrate off the 'manifest' type."""
         if dir:
             assert self._treeondisk
         if dir not in self._dirlogcache:
@@ -1282,4 +1294,3 @@
     def clearcaches(self):
         super(manifest, self).clearcaches()
         self._mancache.clear()
-        self._dirlogcache = {'': self}