new file mode 100644
@@ -0,0 +1,14 @@
+// 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)
+}
@@ -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| {
@@ -12,12 +12,9 @@
//! - [`PartialDiscover`] is the Rust implementation of
//! `mercurial.setdiscovery.partialdiscovery`.
-use crate::{
- cindex::Index, conversion::rev_pyiter_collect, exceptions::GraphError,
-};
+use crate::{cindex::Index, conversion::rev_pyiter_collect, exceptions::GraphError};
use cpython::{
- ObjectProtocol, PyDict, PyModule, PyObject, PyResult, PyTuple, Python,
- PythonObject, ToPyObject,
+ ObjectProtocol, PyDict, PyModule, PyObject, PyResult, PyTuple, Python, PythonObject, ToPyObject,
};
use hg::discovery::PartialDiscovery as CorePartialDiscovery;
use hg::Revision;
@@ -25,6 +22,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 +41,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,
@@ -9,24 +9,20 @@
//! `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`
-pub fn headrevs(
- py: Python,
- index: PyObject,
- revs: PyObject,
-) -> PyResult<HashSet<Revision>> {
+pub fn headrevs(py: Python, index: PyObject, 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)
}
@@ -34,17 +34,15 @@
//! [`LazyAncestors`]: struct.LazyAncestors.html
//! [`MissingAncestors`]: struct.MissingAncestors.html
//! [`AncestorsIterator`]: struct.AncestorsIterator.html
-use crate::{
- cindex::Index, conversion::rev_pyiter_collect, exceptions::GraphError,
-};
+use crate::revlog::pyindex_to_graph;
+use crate::{cindex::Index, conversion::rev_pyiter_collect, exceptions::GraphError};
use cpython::{
- ObjectProtocol, PyClone, PyDict, PyList, PyModule, PyObject, PyResult,
- Python, PythonObject, ToPyObject,
+ ObjectProtocol, PyClone, PyDict, PyList, PyModule, PyObject, PyResult, Python, PythonObject,
+ ToPyObject,
};
use hg::Revision;
use hg::{
- AncestorsIterator as CoreIterator, LazyAncestors as CoreLazy,
- MissingAncestors as CoreMissing,
+ AncestorsIterator as CoreIterator, LazyAncestors as CoreLazy, MissingAncestors as CoreMissing,
};
use std::cell::RefCell;
use std::collections::HashSet;
@@ -73,7 +71,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 +111,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 +125,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)))
}