diff -r 898674a4dbc7 -r 0112803e6c01 rust/hg-cpython/src/revlog.rs --- a/rust/hg-cpython/src/revlog.rs Fri Sep 29 20:51:49 2023 +0200 +++ b/rust/hg-cpython/src/revlog.rs Thu Nov 02 11:40:23 2023 +0100 @@ -357,7 +357,37 @@ /// slice planned chunk read to reach a density threshold def slicechunktodensity(&self, *args, **kw) -> PyResult { - self.call_cindex(py, "slicechunktodensity", args, kw) + let rust_res = self.inner_slicechunktodensity( + py, + args.get_item(py, 0), + args.get_item(py, 1).extract(py)?, + args.get_item(py, 2).extract(py)? + )?; + + let c_res = self.call_cindex(py, "slicechunktodensity", args, kw)?; + assert_eq!( + rust_res.len(), + c_res.len(py)?, + "chunks differ {:?} {}", + rust_res, c_res + ); + for (i, chunk) in rust_res.iter().enumerate() { + let c_chunk = c_res.get_item(py, i)?; + assert_eq!( + chunk.len(), + c_chunk.len(py)?, + "chunk {} length differ {:?} {}", + i, + chunk, + c_res + ); + for (j, rev) in chunk.iter().enumerate() { + let c_chunk: BaseRevision + = c_chunk.get_item(py, j)?.extract(py)?; + assert_eq!(c_chunk, rev.0); + } + } + Ok(c_res) } /// stats for the index @@ -819,6 +849,18 @@ .collect(); Ok(PyList::new(py, &as_vec).into_object()) } + + fn inner_slicechunktodensity( + &self, + py: Python, + revs: PyObject, + target_density: f64, + min_gap_size: usize, + ) -> PyResult>> { + let index = &mut *self.index(py).borrow_mut(); + let revs: Vec<_> = rev_pyiter_collect(py, &revs, index)?; + Ok(index.slice_chunk_to_density(&revs, target_density, min_gap_size)) + } } fn revlog_error(py: Python) -> PyErr {