From patchwork Wed Dec 11 19:06:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D7603: cext-revlog: fixed __delitem__ for uninitialized nodetree From: phabricator X-Patchwork-Id: 43726 Message-Id: <9f5d3d1e0a5439a16c06fb3e74324605@localhost.localdomain> To: Phabricator Cc: mercurial-devel@mercurial-scm.org Date: Wed, 11 Dec 2019 19:06:54 +0000 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 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) {