Mercurial > public > mercurial-scm > hg-stable
changeset 52825:6fc1637f0986
rust-pyo3-revlog: _index_nodemap_data_incremental
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Thu, 02 Jan 2025 17:16:39 +0100 |
parents | e7ad174ae58f |
children | 65df754d598b |
files | rust/hg-pyo3/src/revlog/mod.rs |
diffstat | 1 files changed, 39 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/hg-pyo3/src/revlog/mod.rs Thu Jan 02 17:06:31 2025 +0100 +++ b/rust/hg-pyo3/src/revlog/mod.rs Thu Jan 02 17:16:39 2025 +0100 @@ -7,13 +7,14 @@ // This software may be used and distributed according to the terms of the // GNU General Public License version 2 or any later version. #![allow(non_snake_case)] +use hg::revlog::nodemap::Block; use pyo3::buffer::PyBuffer; use pyo3::conversion::IntoPyObject; use pyo3::exceptions::{PyIndexError, PyTypeError, PyValueError}; -use pyo3::prelude::*; use pyo3::types::{ PyBool, PyBytes, PyBytesMethods, PyDict, PyList, PySet, PyTuple, }; +use pyo3::{prelude::*, IntoPyObjectExt}; use pyo3_sharedref::{PyShareable, SharedByPyObject}; use std::collections::{HashMap, HashSet}; @@ -797,6 +798,43 @@ }) } + /// Returns the last saved docket along with the size of any changed data + /// (in number of blocks), and said data as bytes. + fn _index_nodemap_data_incremental( + slf: &Bound<'_, Self>, + py: Python<'_>, + ) -> PyResult<PyObject> { + let mut self_ref = slf.borrow_mut(); + let docket = &mut self_ref.docket; + let docket = match docket.as_ref() { + Some(d) => d.clone_ref(py), + None => return Ok(py.None()), + }; + drop(self_ref); + + Self::with_core_write(slf, |self_ref, irl| { + let mut nt = self_ref + .get_nodetree(&irl.index)? + .write() + .map_err(map_lock_error)?; + let nt = nt.take().expect("nodetree should be set"); + let masked_blocks = nt.masked_readonly_blocks(); + let (_, data) = nt.into_readonly_and_added_bytes(); + let changed = masked_blocks * std::mem::size_of::<Block>(); + + Ok(PyTuple::new( + py, + [ + docket, + changed.into_py_any(py)?, + PyBytes::new(py, &data).into_py_any(py)?, + ], + )? + .unbind() + .into_any()) + }) + } + #[getter] fn _index_entry_size(&self) -> usize { INDEX_ENTRY_SIZE