From patchwork Fri Dec 13 20:13:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D7657: rust-index: handle `MixedIndex` in `pyindex_to_graph` From: phabricator X-Patchwork-Id: 43810 Message-Id: To: Phabricator Cc: mercurial-devel@mercurial-scm.org Date: Fri, 13 Dec 2019 20:13:06 +0000 marmoute created this revision. Herald added subscribers: mercurial-devel, kevincox, durin42. Herald added a reviewer: hg-reviewers. REVISION SUMMARY On the long run we will want to implement the Graph trait directly in Rust, but for now we take the path with the least amount of change to focus on the coming persistent NodeMap code. We test this new code through with the lazy ancestors code. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D7657 AFFECTED FILES rust/hg-cpython/src/revlog.rs tests/test-rust-revlog.py CHANGE DETAILS To: marmoute, #hg-reviewers Cc: durin42, kevincox, mercurial-devel diff --git a/tests/test-rust-revlog.py b/tests/test-rust-revlog.py --- a/tests/test-rust-revlog.py +++ b/tests/test-rust-revlog.py @@ -10,6 +10,9 @@ else: from mercurial.rustext import revlog + # this would fail already without appropriate ancestor.__package__ + from mercurial.rustext.ancestor import LazyAncestors + from mercurial.testing import revlog as revlogtesting @@ -27,6 +30,22 @@ rustidx = revlog.MixedIndex(idx) self.assertEqual(len(rustidx), len(idx)) + def test_ancestors(self): + idx = self.parseindex() + rustidx = revlog.MixedIndex(idx) + lazy = LazyAncestors(rustidx, [3], 0, True) + # we have two more references to the index: + # - in its inner iterator for __contains__ and __bool__ + # - in the LazyAncestors instance itself (to spawn new iterators) + self.assertTrue(2 in lazy) + self.assertTrue(bool(lazy)) + self.assertEqual(list(lazy), [3, 2, 1, 0]) + # a second time to validate that we spawn new iterators + self.assertEqual(list(lazy), [3, 2, 1, 0]) + + # let's check bool for an empty one + self.assertFalse(LazyAncestors(idx, [0], 0, False)) + if __name__ == '__main__': import silenttestrunner diff --git a/rust/hg-cpython/src/revlog.rs b/rust/hg-cpython/src/revlog.rs --- a/rust/hg-cpython/src/revlog.rs +++ b/rust/hg-cpython/src/revlog.rs @@ -15,7 +15,10 @@ /// Return a Struct implementing the Graph trait pub(crate) fn pyindex_to_graph(py: Python, index: PyObject) -> PyResult { - cindex::Index::new(py, index) + match index.extract::(py) { + Ok(midx) => Ok(midx.clone_cindex(py)), + Err(_) => cindex::Index::new(py, index), + } } py_class!(pub class MixedIndex |py| {