# HG changeset patch # User Georges Racinet # Date 1698620045 -3600 # Node ID 96e05f1a99bdc3cab19acb7c617f89a355d3caa2 # Parent fd1aa5e18f75a3b6556797614def10f5583b34d3 rust-index: stop instantiating a C Index The only missing piece was the `cache` to be returned from `revlog.parse_index_v1_mixed`, and it really seems that it is essentially repetition of the input, if `inline` is `True`. Not worth a Rust implementation (C implementation is probably there for historical reasons). diff -r fd1aa5e18f75 -r 96e05f1a99bd mercurial/revlog.py --- a/mercurial/revlog.py Mon Oct 30 21:28:30 2023 +0100 +++ b/mercurial/revlog.py Sun Oct 29 23:54:05 2023 +0100 @@ -226,8 +226,8 @@ def parse_index_v1_mixed(data, inline, default_header): - index, cache = parse_index_v1(data, inline) - return rustrevlog.MixedIndex(index, data, default_header), cache + cache = (0, data) if inline else None + return rustrevlog.MixedIndex(data, default_header), cache # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte diff -r fd1aa5e18f75 -r 96e05f1a99bd mercurial/testing/revlog.py --- a/mercurial/testing/revlog.py Mon Oct 30 21:28:30 2023 +0100 +++ b/mercurial/testing/revlog.py Sun Oct 29 23:54:05 2023 +0100 @@ -57,5 +57,4 @@ # not inheriting RevlogBasedTestCase to avoid having a # `parseindex` method that would be shadowed by future subclasses # this duplication will soon be removed - cindex = cparsers.parse_index2(data, False)[0] - return MixedIndex(cindex, data, REVLOGV1) + return MixedIndex(data, REVLOGV1) diff -r fd1aa5e18f75 -r 96e05f1a99bd rust/hg-cpython/src/cindex.rs --- a/rust/hg-cpython/src/cindex.rs Mon Oct 30 21:28:30 2023 +0100 +++ b/rust/hg-cpython/src/cindex.rs Sun Oct 29 23:54:05 2023 +0100 @@ -9,7 +9,7 @@ //! //! Ideally, we should use an Index entirely implemented in Rust, //! but this will take some time to get there. - +#![allow(dead_code)] use cpython::{ exc::ImportError, exc::TypeError, ObjectProtocol, PyClone, PyErr, PyObject, PyResult, PyTuple, Python, PythonObject, diff -r fd1aa5e18f75 -r 96e05f1a99bd rust/hg-cpython/src/revlog.rs --- a/rust/hg-cpython/src/revlog.rs Mon Oct 30 21:28:30 2023 +0100 +++ b/rust/hg-cpython/src/revlog.rs Sun Oct 29 23:54:05 2023 +0100 @@ -6,7 +6,6 @@ // GNU General Public License version 2 or any later version. use crate::{ - cindex, conversion::{rev_pyiter_collect, rev_pyiter_collect_or_else}, utils::{node_from_py_bytes, node_from_py_object}, PyRevision, @@ -87,7 +86,6 @@ } py_class!(pub class MixedIndex |py| { - data cindex: RefCell; @shared data index: hg::index::Index; data nt: RefCell>; data docket: RefCell>; @@ -98,11 +96,10 @@ def __new__( _cls, - cindex: PyObject, data: PyObject, default_header: u32, ) -> PyResult { - Self::new(py, cindex, data, default_header) + Self::new(py, data, default_header) } /// Compatibility layer used for Python consumers needing access to the C index @@ -111,11 +108,11 @@ /// that may need to build a custom `nodetree`, based on a specified revset. /// With a Rust implementation of the nodemap, we will be able to get rid of /// this, by exposing our own standalone nodemap class, - /// ready to accept `MixedIndex`. - def get_cindex(&self) -> PyResult { + /// ready to accept `Index`. +/* def get_cindex(&self) -> PyResult { Ok(self.cindex(py).borrow().inner().clone_ref(py)) } - +*/ // Index API involving nodemap, as defined in mercurial/pure/parsers.py /// Return Revision if found, raises a bare `error.RevlogError` @@ -602,18 +599,12 @@ } impl MixedIndex { - fn new( - py: Python, - cindex: PyObject, - data: PyObject, - header: u32, - ) -> PyResult { + fn new(py: Python, data: PyObject, header: u32) -> PyResult { // Safety: we keep the buffer around inside the class as `index_mmap` let (buf, bytes) = unsafe { mmap_keeparound(py, data)? }; Self::create_instance( py, - RefCell::new(cindex::Index::new(py, cindex)?), hg::index::Index::new( bytes, IndexHeader::parse(&header.to_be_bytes()) @@ -666,10 +657,6 @@ Ok(self.nt(py)) } - pub fn clone_cindex(&self, py: Python) -> cindex::Index { - self.cindex(py).borrow().clone_ref(py) - } - /// Returns the full nodemap bytes to be written as-is to disk fn inner_nodemap_data_all(&self, py: Python) -> PyResult { let nodemap = self.get_nodetree(py)?.borrow_mut().take().unwrap(); diff -r fd1aa5e18f75 -r 96e05f1a99bd tests/test-rust-revlog.py --- a/tests/test-rust-revlog.py Mon Oct 30 21:28:30 2023 +0100 +++ b/tests/test-rust-revlog.py Sun Oct 29 23:54:05 2023 +0100 @@ -27,24 +27,16 @@ class RustRevlogIndexTest(revlogtesting.RevlogBasedTestBase): def test_heads(self): idx = self.parseindex() - rustidx = revlog.MixedIndex(idx, revlogtesting.data_non_inlined, header) + rustidx = revlog.MixedIndex(revlogtesting.data_non_inlined, header) self.assertEqual(rustidx.headrevs(), idx.headrevs()) - def test_get_cindex(self): - # drop me once we no longer need the method for shortest node - idx = self.parseindex() - rustidx = revlog.MixedIndex(idx, revlogtesting.data_non_inlined, header) - cidx = rustidx.get_cindex() - self.assertTrue(idx is cidx) - def test_len(self): idx = self.parseindex() - rustidx = revlog.MixedIndex(idx, revlogtesting.data_non_inlined, header) + rustidx = revlog.MixedIndex(revlogtesting.data_non_inlined, header) self.assertEqual(len(rustidx), len(idx)) def test_ancestors(self): - idx = self.parseindex() - rustidx = revlog.MixedIndex(idx, revlogtesting.data_non_inlined, header) + rustidx = revlog.MixedIndex(revlogtesting.data_non_inlined, header) lazy = LazyAncestors(rustidx, [3], 0, True) # we have two more references to the index: # - in its inner iterator for __contains__ and __bool__ diff -r fd1aa5e18f75 -r 96e05f1a99bd tests/test-verify.t --- a/tests/test-verify.t Mon Oct 30 21:28:30 2023 +0100 +++ b/tests/test-verify.t Sun Oct 29 23:54:05 2023 +0100 @@ -311,7 +311,8 @@ $ cat start b > .hg/store/data/a.i $ hg verify -q - a@1: broken revlog! (index a is corrupted) + a@1: broken revlog! (index a is corrupted) (no-rust !) + a@1: broken revlog! (abort: unexpected inline revlog length) (rust !) warning: orphan data file 'data/a.i' not checking dirstate because of previous errors 1 warnings encountered!