Mercurial > hg-stable
changeset 29835:58d4ecdc531e
manifest: make manifest derive from manifestrevlog
As part of our refactoring to split the manifest concept from its storage, we
need to start moving the revlog specific parts of the manifest implementation to
a new class. This patch creates manifestrevlog and moves the fulltextcache onto
the base class.
author | Durham Goode <durham@fb.com> |
---|---|
date | Wed, 17 Aug 2016 13:25:13 -0700 |
parents | 27c0792e834c |
children | 426d931e5db2 |
files | mercurial/manifest.py |
diffstat | 1 files changed, 30 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/manifest.py Wed Aug 17 13:25:13 2016 -0700 +++ b/mercurial/manifest.py Wed Aug 17 13:25:13 2016 -0700 @@ -890,7 +890,31 @@ subp1, subp2 = subp2, subp1 writesubtree(subm, subp1, subp2) -class manifest(revlog.revlog): +class manifestrevlog(revlog.revlog): + '''A revlog that stores manifest texts. This is responsible for caching the + full-text manifest contents. + ''' + def __init__(self, opener, indexfile): + super(manifestrevlog, self).__init__(opener, indexfile) + + # 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 + opts = getattr(opener, 'options', None) + if opts is not None: + cachesize = opts.get('manifestcachesize', cachesize) + self._fulltextcache = util.lrucachedict(cachesize) + + @property + def fulltextcache(self): + return self._fulltextcache + + def clearcaches(self): + super(manifestrevlog, self).clearcaches() + self._fulltextcache.clear() + +class manifest(manifestrevlog): def __init__(self, opener, dir='', dirlogcache=None): '''The 'dir' and 'dirlogcache' arguments are for internal use by manifest.manifest only. External users should create a root manifest @@ -908,7 +932,6 @@ usetreemanifest = opts.get('treemanifest', usetreemanifest) usemanifestv2 = opts.get('manifestv2', usemanifestv2) self._mancache = util.lrucachedict(cachesize) - self._fulltextcache = util.lrucachedict(cachesize) self._treeinmem = usetreemanifest self._treeondisk = usetreemanifest self._usemanifestv2 = usemanifestv2 @@ -918,7 +941,7 @@ if not dir.endswith('/'): dir = dir + '/' indexfile = "meta/" + dir + "00manifest.i" - revlog.revlog.__init__(self, opener, indexfile) + super(manifest, self).__init__(opener, indexfile) self._dir = dir # The dirlogcache is kept on the root manifest log if dir: @@ -1016,7 +1039,7 @@ m = self._newmanifest(text) arraytext = array.array('c', text) self._mancache[node] = m - self._fulltextcache[node] = arraytext + self.fulltextcache[node] = arraytext return m def readshallow(self, node): @@ -1036,7 +1059,7 @@ return None, None def add(self, m, transaction, link, p1, p2, added, removed): - if (p1 in self._fulltextcache and not self._treeinmem + if (p1 in self.fulltextcache and not self._treeinmem and not self._usemanifestv2): # If our first parent is in the manifest cache, we can # compute a delta here using properties we know about the @@ -1048,7 +1071,7 @@ work = heapq.merge([(x, False) for x in added], [(x, True) for x in removed]) - arraytext, deltatext = m.fastdelta(self._fulltextcache[p1], work) + arraytext, deltatext = m.fastdelta(self.fulltextcache[p1], work) cachedelta = self.rev(p1), deltatext text = util.buffer(arraytext) n = self.addrevision(text, transaction, link, p1, p2, cachedelta) @@ -1068,7 +1091,7 @@ arraytext = array.array('c', text) self._mancache[n] = m - self._fulltextcache[n] = arraytext + self.fulltextcache[n] = arraytext return n @@ -1095,6 +1118,5 @@ def clearcaches(self): super(manifest, self).clearcaches() - self._fulltextcache.clear() self._mancache.clear() self._dirlogcache = {'': self}