changeset 52813:65df754d598b

rust-pyo3-revlog: _index_update_nodemap_data
author Rapha?l Gom?s <rgomes@octobus.net>
date Thu, 02 Jan 2025 17:27:22 +0100
parents 6fc1637f0986
children 3fcd86374074
files rust/hg-pyo3/src/revlog/mod.rs
diffstat 1 files changed, 40 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/rust/hg-pyo3/src/revlog/mod.rs	Thu Jan 02 17:16:39 2025 +0100
+++ b/rust/hg-pyo3/src/revlog/mod.rs	Thu Jan 02 17:27:22 2025 +0100
@@ -835,6 +835,46 @@
         })
     }
 
+    /// Update the nodemap from the new (mmaped) data.
+    /// The docket is kept as a reference for later incremental calls.
+    fn _index_update_nodemap_data(
+        slf: &Bound<'_, Self>,
+        py: Python<'_>,
+        docket: &Bound<'_, PyAny>,
+        nm_data: &Bound<'_, PyAny>,
+    ) -> PyResult<PyObject> {
+        // Safety: we keep the buffer around inside the class as `nodemap_mmap`
+        let (buf, bytes) = unsafe { take_buffer_with_slice(nm_data)? };
+        let len = buf.item_count();
+        let data_tip =
+            docket.getattr("tip_rev")?.extract::<BaseRevision>()?.into();
+
+        let mut nt = CoreNodeTree::load_bytes(bytes, len);
+
+        Self::with_index_read(slf, |idx| {
+            let data_tip = idx.check_revision(data_tip).ok_or_else(|| {
+                nodemap_error(NodeMapError::RevisionNotInIndex(data_tip))
+            })?;
+            let current_tip = idx.len();
+
+            for r in (data_tip.0 + 1)..current_tip as BaseRevision {
+                let rev = Revision(r);
+                // in this case node() won't ever return None
+                nt.insert(idx, idx.node(rev).expect("node should exist"), rev)
+                    .map_err(nodemap_error)?;
+            }
+
+            Ok(py.None())
+        })?;
+
+        let mut self_ref = slf.borrow_mut();
+        self_ref.docket.replace(docket.clone().unbind());
+        self_ref.nodemap_mmap = Some(buf);
+        self_ref.nt.write().map_err(map_lock_error)?.replace(nt);
+
+        Ok(py.None())
+    }
+
     #[getter]
     fn _index_entry_size(&self) -> usize {
         INDEX_ENTRY_SIZE