Skip to content
Snippets Groups Projects
Commit f98f0e3d authored by Pierre-Yves David's avatar Pierre-Yves David :octopus:
Browse files

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
parent 8a8305f5
No related branches found
No related tags found
No related merge requests found
......@@ -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)))
}
......
......@@ -9,11 +9,9 @@
//! `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;
......@@ -15,8 +13,10 @@
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)
}
......
......@@ -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,
......
......@@ -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| {
......
// 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)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment