# HG changeset patch # User Pierre-Yves David # Date 2019-11-09 04:54:22 # Node ID 642433629e20a723190aafccbf4688de3116ae7d # Parent 53581e220ba393b369e09240ac240fee7bc10dfc revlog: deal with nodemap deletion within the index Since the nodemap data now live in the index, it should be the index responsibility to ensure the data are up to date. The C version of the index is already dealing with such deletion. This work is part of a refactoring to unify the revlog index and the nodemap. This unification prepare the use of a persistent nodemap. Differential Revision: https://phab.mercurial-scm.org/D7321 diff --git a/mercurial/bundlerepo.py b/mercurial/bundlerepo.py --- a/mercurial/bundlerepo.py +++ b/mercurial/bundlerepo.py @@ -93,7 +93,6 @@ class bundlerevlog(revlog.revlog): node, ) self.index.append(e) - self.nodemap[node] = n self.bundlerevs.add(n) n += 1 diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py --- a/mercurial/pure/parsers.py +++ b/mercurial/pure/parsers.py @@ -55,6 +55,12 @@ class BaseIndexObject(object): nodemap[n] = r return nodemap + def _stripnodes(self, start): + if 'nodemap' in vars(self): + for r in range(start, len(self)): + n = self[r][7] + del self.nodemap[n] + def clearcaches(self): self.__dict__.pop('nodemap', None) @@ -103,6 +109,7 @@ class IndexObject(BaseIndexObject): raise ValueError(b"deleting slices only supports a:-1 with step 1") i = i.start self._check_index(i) + self._stripnodes(i) if i < self._lgt: self._data = self._data[: i * indexsize] self._lgt = i @@ -140,6 +147,7 @@ class InlinedIndexObject(BaseIndexObject raise ValueError(b"deleting slices only supports a:-1 with step 1") i = i.start self._check_index(i) + self._stripnodes(i) if i < self._lgt: self._offsets = self._offsets[:i] self._lgt = i diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -217,6 +217,13 @@ class revlogoldindex(list): self.nodemap[tup[7]] = len(self) super(revlogoldindex, self).append(tup) + def __delitem__(self, i): + if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: + raise ValueError(b"deleting slices only supports a:-1 with step 1") + for r in pycompat.xrange(i.start, len(self)): + del self.nodemap[self[r][7]] + super(revlogoldindex, self).__delitem__(i) + def clearcaches(self): self.__dict__.pop('nodemap', None) @@ -2431,8 +2438,6 @@ class revlog(object): self._revisioncache = None self._chaininfocache = {} self._chunkclear() - for x in pycompat.xrange(rev, len(self)): - del self.nodemap[self.node(x)] del self.index[rev:-1] self._nodepos = None diff --git a/mercurial/unionrepo.py b/mercurial/unionrepo.py --- a/mercurial/unionrepo.py +++ b/mercurial/unionrepo.py @@ -83,7 +83,6 @@ class unionrevlog(revlog.revlog): node, ) self.index.append(e) - self.nodemap[node] = n self.bundlerevs.add(n) n += 1