changeset 52796:670ebb2f975a

rust-pyo3-revlog: reachable roots This time, it is obvious that we have one less copy of the whole result.
author Georges Racinet <georges.racinet@cloudcrane.io>
date Mon, 23 Dec 2024 19:22:21 +0100
parents adf91dfe6c04
children f76911bfbfb1
files rust/hg-pyo3/src/revlog/mod.rs
diffstat 1 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/rust/hg-pyo3/src/revlog/mod.rs	Wed Dec 25 19:06:59 2024 +0100
+++ b/rust/hg-pyo3/src/revlog/mod.rs	Mon Dec 23 19:22:21 2024 +0100
@@ -39,7 +39,10 @@
         rev_not_in_index, revlog_error_bare, revlog_error_from_msg,
     },
     node::{node_from_py_bytes, node_prefix_from_py_bytes, py_node_for_rev},
-    revision::{check_revision, rev_pyiter_collect, revs_py_list, PyRevision},
+    revision::{
+        check_revision, rev_pyiter_collect, rev_pyiter_collect_or_else,
+        revs_py_list, PyRevision,
+    },
     store::PyFnCache,
     util::{new_submodule, take_buffer_with_slice},
 };
@@ -331,6 +334,39 @@
         })
     }
 
+    /// reachableroots
+    #[pyo3(signature = (*args))]
+    fn _index_reachableroots2(
+        slf: &Bound<'_, Self>,
+        py: Python<'_>,
+        args: &Bound<'_, PyTuple>,
+    ) -> PyResult<Py<PyList>> {
+        // TODO what was the point of having a signature with variable args?
+        let min_root = UncheckedRevision(args.get_item(0)?.extract()?);
+        let heads = args.get_item(1)?;
+        let roots = args.get_item(2)?;
+        let include_path: bool = args.get_item(3)?.extract()?;
+
+        let as_set = Self::with_index_read(slf, |idx| {
+            let heads = rev_pyiter_collect_or_else(&heads, idx, |_rev| {
+                PyIndexError::new_err("head out of range")
+            })?;
+            let roots: Result<_, _> = roots
+                .try_iter()?
+                .map(|r| {
+                    r.and_then(|o| match o.extract::<PyRevision>() {
+                        Ok(r) => Ok(UncheckedRevision(r.0)),
+                        Err(e) => Err(e),
+                    })
+                })
+                .collect();
+            idx.reachable_roots(min_root, heads, roots?, include_path)
+                .map_err(graph_error)
+        })?;
+
+        revs_py_list(py, as_set)
+    }
+
     #[pyo3(signature = (*args))]
     fn _index_headrevs(
         slf: &Bound<'_, Self>,