rust-index: add a function to convert PyObject index for hg-core
Function in hg-core need something implementing the `Graph` trait. Right now,
the `hg-cpython` entry points directly turn the PyObject passed as argument
into a `cindex::Index`. However, if we start having the option to use an Index
in Rust, we need to dispatch between the different possible PyObject we could
receive.
So move the "duplicate" call into a unified function. When time come. It will be
easy to update the logic of all interface when the time come.
Differential Revision: https://phab.mercurial-scm.org/D7653
--- a/rust/hg-cpython/src/ancestors.rs Wed Dec 11 18:40:04 2019 +0100
+++ b/rust/hg-cpython/src/ancestors.rs Fri Dec 13 19:59:59 2019 +0100
@@ -34,6 +34,7 @@
//! [`LazyAncestors`]: struct.LazyAncestors.html
//! [`MissingAncestors`]: struct.MissingAncestors.html
//! [`AncestorsIterator`]: struct.AncestorsIterator.html
+use crate::revlog::pyindex_to_graph;
use crate::{
cindex::Index, conversion::rev_pyiter_collect, exceptions::GraphError,
};
@@ -73,7 +74,7 @@
inclusive: bool) -> PyResult<AncestorsIterator> {
let initvec: Vec<Revision> = rev_pyiter_collect(py, &initrevs)?;
let ait = CoreIterator::new(
- Index::new(py, index)?,
+ pyindex_to_graph(py, index)?,
initvec,
stoprev,
inclusive,
@@ -113,7 +114,8 @@
let initvec: Vec<Revision> = rev_pyiter_collect(py, &initrevs)?;
let lazy =
- CoreLazy::new(Index::new(py, index)?, initvec, stoprev, inclusive)
+ CoreLazy::new(pyindex_to_graph(py, index)?,
+ initvec, stoprev, inclusive)
.map_err(|e| GraphError::pynew(py, e))?;
Self::create_instance(py, RefCell::new(Box::new(lazy)))
@@ -126,7 +128,7 @@
def __new__(_cls, index: PyObject, bases: PyObject) -> PyResult<MissingAncestors> {
let bases_vec: Vec<Revision> = rev_pyiter_collect(py, &bases)?;
- let inner = CoreMissing::new(Index::new(py, index)?, bases_vec);
+ let inner = CoreMissing::new(pyindex_to_graph(py, index)?, bases_vec);
MissingAncestors::create_instance(py, RefCell::new(Box::new(inner)))
}
--- a/rust/hg-cpython/src/dagops.rs Wed Dec 11 18:40:04 2019 +0100
+++ b/rust/hg-cpython/src/dagops.rs Fri Dec 13 19:59:59 2019 +0100
@@ -9,14 +9,14 @@
//! `hg-core` package.
//!
//! From Python, this will be seen as `mercurial.rustext.dagop`
-use crate::{
- cindex::Index, conversion::rev_pyiter_collect, exceptions::GraphError,
-};
+use crate::{conversion::rev_pyiter_collect, exceptions::GraphError};
use cpython::{PyDict, PyModule, PyObject, PyResult, Python};
use hg::dagops;
use hg::Revision;
use std::collections::HashSet;
+use crate::revlog::pyindex_to_graph;
+
/// Using the the `index`, return heads out of any Python iterable of Revisions
///
/// This is the Rust counterpart for `mercurial.dagop.headrevs`
@@ -26,7 +26,7 @@
revs: PyObject,
) -> PyResult<HashSet<Revision>> {
let mut as_set: HashSet<Revision> = rev_pyiter_collect(py, &revs)?;
- dagops::retain_heads(&Index::new(py, index)?, &mut as_set)
+ dagops::retain_heads(&pyindex_to_graph(py, index)?, &mut as_set)
.map_err(|e| GraphError::pynew(py, e))?;
Ok(as_set)
}
--- a/rust/hg-cpython/src/discovery.rs Wed Dec 11 18:40:04 2019 +0100
+++ b/rust/hg-cpython/src/discovery.rs Fri Dec 13 19:59:59 2019 +0100
@@ -25,6 +25,8 @@
use std::cell::RefCell;
+use crate::revlog::pyindex_to_graph;
+
py_class!(pub class PartialDiscovery |py| {
data inner: RefCell<Box<CorePartialDiscovery<Index>>>;
@@ -42,7 +44,7 @@
Self::create_instance(
py,
RefCell::new(Box::new(CorePartialDiscovery::new(
- Index::new(py, index)?,
+ pyindex_to_graph(py, index)?,
rev_pyiter_collect(py, &targetheads)?,
respectsize,
randomize,
--- a/rust/hg-cpython/src/lib.rs Wed Dec 11 18:40:04 2019 +0100
+++ b/rust/hg-cpython/src/lib.rs Fri Dec 13 19:59:59 2019 +0100
@@ -35,6 +35,7 @@
pub mod exceptions;
pub mod filepatterns;
pub mod parsers;
+pub mod revlog;
pub mod utils;
py_module_initializer!(rustext, initrustext, PyInit_rustext, |py, m| {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hg-cpython/src/revlog.rs Fri Dec 13 19:59:59 2019 +0100
@@ -0,0 +1,17 @@
+// revlog.rs
+//
+// Copyright 2019 Georges Racinet <georges.racinet@octobus.net>
+//
+// This software may be used and distributed according to the terms of the
+// GNU General Public License version 2 or any later version.
+
+use crate::cindex;
+use cpython::{PyObject, PyResult, Python};
+
+/// Return a Struct implementing the Graph trait
+pub(crate) fn pyindex_to_graph(
+ py: Python,
+ index: PyObject,
+) -> PyResult<cindex::Index> {
+ cindex::Index::new(py, index)
+}