diff -r 27e773aa607d -r 4c5f6e95df84 rust/hg-cpython/src/conversion.rs --- a/rust/hg-cpython/src/conversion.rs Thu Aug 10 11:01:07 2023 +0200 +++ b/rust/hg-cpython/src/conversion.rs Fri Aug 18 14:34:29 2023 +0200 @@ -8,8 +8,10 @@ //! Bindings for the hg::ancestors module provided by the //! `hg-core` crate. From Python, this will be seen as `rustext.ancestor` -use cpython::{ObjectProtocol, PyObject, PyResult, Python}; -use hg::Revision; +use cpython::{ObjectProtocol, PyErr, PyObject, PyResult, Python}; +use hg::{Revision, RevlogIndex, UncheckedRevision}; + +use crate::{exceptions::GraphError, PyRevision}; /// Utility function to convert a Python iterable into various collections /// @@ -17,11 +19,28 @@ /// with `impl IntoIterator` arguments, because /// a `PyErr` can arise at each step of iteration, whereas these methods /// expect iterables over `Revision`, not over some `Result` -pub fn rev_pyiter_collect(py: Python, revs: &PyObject) -> PyResult +pub fn rev_pyiter_collect( + py: Python, + revs: &PyObject, + index: &I, +) -> PyResult where C: FromIterator, + I: RevlogIndex, { revs.iter(py)? - .map(|r| r.and_then(|o| o.extract::(py))) + .map(|r| { + r.and_then(|o| match o.extract::(py) { + Ok(r) => index + .check_revision(UncheckedRevision(r.0)) + .ok_or_else(|| { + PyErr::new::( + py, + ("InvalidRevision", r.0), + ) + }), + Err(e) => Err(e), + }) + }) .collect() }