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