diff tests/test-rust-ancestor.py @ 41188:006c9ce486fa

rust-cpython: bindings for MissingAncestors The exposition is rather straightforward, except for the remove_ancestors_from() method, which forces us to an inefficient conversion between Python sets and Rust HashSets. Two alternatives are proposed in comments: - changing the inner API to "emit" the revision numbers to discard this would be a substantial change, and it would be better only in the cases where there are more to retain than to discard - mutating the Python set directly: this would force us to define an abstract `RevisionSet` trait, and implement it both for plain `HashSet` and for a struct enclosing a Python set with the GIL marker `Python<'p>`, also a non trivial effort. The main (and seemingly only) caller of this method being `mercurial.setdiscovery`, which is currently undergoing serious refactoring, it's not clear whether these improvements would be worth the effort right now, so we're leaving it as-is. Also, in `get_bases()` (will also be used by `setdiscovery`), we'd prefer to build a Python set directly, but we resort to returning a tuple, waiting to hear back from our PR onto rust-cpython about that Differential Revision: https://phab.mercurial-scm.org/D5550
author Georges Racinet <georges.racinet@octobus.net>
date Fri, 30 Nov 2018 20:05:34 +0100
parents b31a41f24864
children 5257e6299d4c
line wrap: on
line diff
--- a/tests/test-rust-ancestor.py	Wed Jan 09 17:31:36 2019 +0100
+++ b/tests/test-rust-ancestor.py	Fri Nov 30 20:05:34 2018 +0100
@@ -11,7 +11,8 @@
     # this would fail already without appropriate ancestor.__package__
     from mercurial.rustext.ancestor import (
         AncestorsIterator,
-        LazyAncestors
+        LazyAncestors,
+        MissingAncestors,
     )
 
 try:
@@ -105,6 +106,22 @@
         # let's check bool for an empty one
         self.assertFalse(LazyAncestors(idx, [0], 0, False))
 
+    def testmissingancestors(self):
+        idx = self.parseindex()
+        missanc = MissingAncestors(idx, [1])
+        self.assertTrue(missanc.hasbases())
+        self.assertEqual(missanc.missingancestors([3]), [2, 3])
+        missanc.addbases({2})
+        self.assertEqual(set(missanc.bases()), {1, 2})
+        self.assertEqual(missanc.missingancestors([3]), [3])
+
+    def testmissingancestorsremove(self):
+        idx = self.parseindex()
+        missanc = MissingAncestors(idx, [1])
+        revs = {0, 1, 2, 3}
+        missanc.removeancestorsfrom(revs)
+        self.assertEqual(revs, {2, 3})
+
     def testrefcount(self):
         idx = self.parseindex()
         start_count = sys.getrefcount(idx)