changeset 43533:642433629e20

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
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sat, 09 Nov 2019 05:54:22 +0100
parents 53581e220ba3
children 0c659fc20207
files mercurial/bundlerepo.py mercurial/pure/parsers.py mercurial/revlog.py mercurial/unionrepo.py
diffstat 4 files changed, 15 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/bundlerepo.py	Fri Nov 08 10:01:10 2019 +0100
+++ b/mercurial/bundlerepo.py	Sat Nov 09 05:54:22 2019 +0100
@@ -93,7 +93,6 @@
                 node,
             )
             self.index.append(e)
-            self.nodemap[node] = n
             self.bundlerevs.add(n)
             n += 1
 
--- a/mercurial/pure/parsers.py	Fri Nov 08 10:01:10 2019 +0100
+++ b/mercurial/pure/parsers.py	Sat Nov 09 05:54:22 2019 +0100
@@ -55,6 +55,12 @@
             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 @@
             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 @@
             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
--- a/mercurial/revlog.py	Fri Nov 08 10:01:10 2019 +0100
+++ b/mercurial/revlog.py	Sat Nov 09 05:54:22 2019 +0100
@@ -217,6 +217,13 @@
         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 @@
         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
--- a/mercurial/unionrepo.py	Fri Nov 08 10:01:10 2019 +0100
+++ b/mercurial/unionrepo.py	Sat Nov 09 05:54:22 2019 +0100
@@ -83,7 +83,6 @@
                 node,
             )
             self.index.append(e)
-            self.nodemap[node] = n
             self.bundlerevs.add(n)
             n += 1