treemanifest: allow manifestrevlog to take an explicit treemanifest arg
Previously we relied on the opener options to tell the revlog to be a tree
manifest. This makes it complicated for extensions to create treemanifests and
normal manifests at the same time. Let's add a construtor argument to create a
treemanifest revlog as well.
I considered removing the options['treemanifest'] logic from manifestrevlog
entirely, but doing so shifts the responsibility to the caller which ends up
requiring changes in localrepo, bundlerepo, and unionrepo. I figured having the
dual mechanism was better than polluting other parts of the code base with
treemanifest knowledge.
--- a/mercurial/manifest.py Wed Apr 26 23:02:43 2017 +0900
+++ b/mercurial/manifest.py Tue May 09 13:56:46 2017 -0700
@@ -1175,25 +1175,31 @@
'''A revlog that stores manifest texts. This is responsible for caching the
full-text manifest contents.
'''
- def __init__(self, opener, dir='', dirlogcache=None, indexfile=None):
+ def __init__(self, opener, dir='', dirlogcache=None, indexfile=None,
+ treemanifest=False):
"""Constructs a new manifest revlog
`indexfile` - used by extensions to have two manifests at once, like
when transitioning between flatmanifeset and treemanifests.
+
+ `treemanifest` - used to indicate this is a tree manifest revlog. Opener
+ options can also be used to make this a tree manifest revlog. The opener
+ option takes precedence, so if it is set to True, we ignore whatever
+ value is passed in to the constructor.
"""
# 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.
cachesize = 4
- usetreemanifest = False
+ optiontreemanifest = False
usemanifestv2 = False
opts = getattr(opener, 'options', None)
if opts is not None:
cachesize = opts.get('manifestcachesize', cachesize)
- usetreemanifest = opts.get('treemanifest', usetreemanifest)
+ optiontreemanifest = opts.get('treemanifest', False)
usemanifestv2 = opts.get('manifestv2', usemanifestv2)
- self._treeondisk = usetreemanifest
+ self._treeondisk = optiontreemanifest or treemanifest
self._usemanifestv2 = usemanifestv2
self._fulltextcache = util.lrucachedict(cachesize)
@@ -1231,8 +1237,10 @@
if dir:
assert self._treeondisk
if dir not in self._dirlogcache:
- self._dirlogcache[dir] = manifestrevlog(self.opener, dir,
- self._dirlogcache)
+ mfrevlog = manifestrevlog(self.opener, dir,
+ self._dirlogcache,
+ treemanifest=self._treeondisk)
+ self._dirlogcache[dir] = mfrevlog
return self._dirlogcache[dir]
def add(self, m, transaction, link, p1, p2, added, removed, readtree=None):