Patchwork D7603: cext-revlog: fixed __delitem__ for uninitialized nodetree

login
register
mail settings
Submitter phabricator
Date Dec. 11, 2019, 7:06 p.m.
Message ID <9f5d3d1e0a5439a16c06fb3e74324605@localhost.localdomain>
Download mbox | patch
Permalink /patch/43726/
State Not Applicable
Headers show

Comments

phabricator - Dec. 11, 2019, 7:06 p.m.
Closed by commit rHG49fa0b31ee1d: cext-revlog: fixed  __delitem__ for uninitialized nodetree (authored by gracinet).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D7603?vs=18598&id=18621

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7603/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7603

AFFECTED FILES
  mercurial/cext/revlog.c
  tests/test-parseindex2.py

CHANGE DETAILS




To: gracinet, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/tests/test-parseindex2.py b/tests/test-parseindex2.py
--- a/tests/test-parseindex2.py
+++ b/tests/test-parseindex2.py
@@ -247,6 +247,32 @@ 
         got = index[-1]
         self.assertEqual(want, got)  # no inline data
 
+    def testdelitemwithoutnodetree(self):
+        index, _junk = parsers.parse_index2(data_non_inlined, False)
+
+        def hexrev(rev):
+            if rev == nullrev:
+                return b'\xff\xff\xff\xff'
+            else:
+                return nodemod.bin('%08x' % rev)
+
+        def appendrev(p1, p2=nullrev):
+            # node won't matter for this test, let's just make sure
+            # they don't collide. Other data don't matter either.
+            node = hexrev(p1) + hexrev(p2) + b'.' * 12
+            index.append((0, 0, 12, 1, 34, p1, p2, node))
+
+        appendrev(4)
+        appendrev(5)
+        appendrev(6)
+        self.assertEqual(len(index), 7)
+
+        del index[1:7]
+
+        # assertions that failed before correction
+        self.assertEqual(len(index), 1)  # was 4
+        self.assertEqual(index.headrevs(), [0])  # gave ValueError
+
 
 if __name__ == '__main__':
     import silenttestrunner
diff --git a/mercurial/cext/revlog.c b/mercurial/cext/revlog.c
--- a/mercurial/cext/revlog.c
+++ b/mercurial/cext/revlog.c
@@ -2522,7 +2522,10 @@ 
 				index_invalidate_added(self, 0);
 			if (self->ntrev > start)
 				self->ntrev = (int)start;
+		} else if (self->added) {
+			Py_CLEAR(self->added);
 		}
+
 		self->length = start;
 		if (start < self->raw_length) {
 			if (self->cache) {