diff -r 3f37d80d3ab4 -r b01e7d97e167 rust/hg-cpython/src/revlog.rs --- a/rust/hg-cpython/src/revlog.rs Thu Dec 21 20:30:03 2023 +0000 +++ b/rust/hg-cpython/src/revlog.rs Mon Feb 12 20:01:27 2024 +0000 @@ -315,6 +315,15 @@ Ok(rust_res) } + /// get diff in head revisions + def headrevsdiff(&self, *args, **_kw) -> PyResult { + let rust_res = self.inner_headrevsdiff( + py, + &args.get_item(py, 0), + &args.get_item(py, 1))?; + Ok(rust_res) + } + /// get filtered head revisions def headrevsfiltered(&self, *args, **_kw) -> PyResult { let rust_res = self.inner_headrevsfiltered(py, &args.get_item(py, 0))?; @@ -827,6 +836,38 @@ .into_object()) } + fn check_revision( + index: &hg::index::Index, + rev: UncheckedRevision, + py: Python, + ) -> PyResult { + index + .check_revision(rev) + .ok_or_else(|| rev_not_in_index(py, rev)) + } + + fn inner_headrevsdiff( + &self, + py: Python, + begin: &PyObject, + end: &PyObject, + ) -> PyResult { + let begin = begin.extract::(py)?; + let end = end.extract::(py)?; + let index = &mut *self.index(py).borrow_mut(); + let begin = + Self::check_revision(index, UncheckedRevision(begin - 1), py)?; + let end = Self::check_revision(index, UncheckedRevision(end - 1), py)?; + let (removed, added) = index + .head_revs_diff(begin, end) + .map_err(|e| graph_error(py, e))?; + let removed: Vec<_> = + removed.into_iter().map(PyRevision::from).collect(); + let added: Vec<_> = added.into_iter().map(PyRevision::from).collect(); + let res = (removed, added).to_py_object(py).into_object(); + Ok(res) + } + fn inner_headrevsfiltered( &self, py: Python,