D7603: cext-revlog: fixed __delitem__ for uninitialized nodetree
gracinet (Georges Racinet)
phabricator at mercurial-scm.org
Wed Dec 11 14:06:54 EST 2019
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
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) {
To: gracinet, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list