Mercurial > hg
changeset 43945:f98f0e3ddaa1
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
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 13 Dec 2019 19:59:59 +0100 |
parents | 8a8305f557d0 |
children | ac627ed8a911 |
files | rust/hg-cpython/src/ancestors.rs rust/hg-cpython/src/dagops.rs rust/hg-cpython/src/discovery.rs rust/hg-cpython/src/lib.rs rust/hg-cpython/src/revlog.rs |
diffstat | 5 files changed, 30 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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) +}