##// END OF EJS Templates
rust-nodemap: add binding for `nodemap_data_incremental`...
Georges Racinet -
r44996:5bbf8872 default
parent child Browse files
Show More
@@ -15,7 +15,7 b' use cpython::{'
15 15 PyResult, PyString, PyTuple, Python, PythonObject, ToPyObject,
16 16 };
17 17 use hg::{
18 nodemap::{NodeMapError, NodeTree},
18 nodemap::{Block, NodeMapError, NodeTree},
19 19 revlog::{nodemap::NodeMap, RevlogIndex},
20 20 NodeError, Revision,
21 21 };
@@ -35,6 +35,7 b' pub(crate) fn pyindex_to_graph('
35 35 py_class!(pub class MixedIndex |py| {
36 36 data cindex: RefCell<cindex::Index>;
37 37 data nt: RefCell<Option<NodeTree>>;
38 data docket: RefCell<Option<PyObject>>;
38 39
39 40 def __new__(_cls, cindex: PyObject) -> PyResult<MixedIndex> {
40 41 Self::new(py, cindex)
@@ -264,6 +265,9 b' py_class!(pub class MixedIndex |py| {'
264 265 self.inner_nodemap_data_all(py)
265 266 }
266 267
268 def nodemap_data_incremental(&self) -> PyResult<PyObject> {
269 self.inner_nodemap_data_incremental(py)
270 }
267 271
268 272 });
269 273
@@ -273,6 +277,7 b' impl MixedIndex {'
273 277 py,
274 278 RefCell::new(cindex::Index::new(py, cindex)?),
275 279 RefCell::new(None),
280 RefCell::new(None),
276 281 )
277 282 }
278 283
@@ -347,6 +352,28 b' impl MixedIndex {'
347 352 let bytes = PyBytes::new(py, &bytes);
348 353 Ok(bytes)
349 354 }
355
356 /// Returns the last saved docket along with the size of any changed data
357 /// (in number of blocks), and said data as bytes.
358 fn inner_nodemap_data_incremental(
359 &self,
360 py: Python,
361 ) -> PyResult<PyObject> {
362 let docket = self.docket(py).borrow();
363 let docket = match docket.as_ref() {
364 Some(d) => d,
365 None => return Ok(py.None()),
366 };
367
368 let node_tree = self.get_nodetree(py)?.borrow_mut().take().unwrap();
369 let masked_blocks = node_tree.masked_readonly_blocks();
370 let (_, data) = node_tree.into_readonly_and_added_bytes();
371 let changed = masked_blocks * std::mem::size_of::<Block>();
372
373 Ok((docket, changed, PyBytes::new(py, &data))
374 .to_py_object(py)
375 .into_object())
376 }
350 377 }
351 378
352 379 fn revlog_error(py: Python) -> PyErr {
General Comments 0
You need to be logged in to leave comments. Login now