# HG changeset patch # User Raphaël Gomès # Date 1701857058 -3600 # Node ID 5b4995b40db02dc12aa9b0fe523ed48205afcaaf # Parent f20c4b307a5a31059ead6759ef02ab81ffc72c45 rust-index: cache the head nodeids python list Same optimization as before, but for the nodeids this time. diff -r f20c4b307a5a -r 5b4995b40db0 rust/hg-cpython/src/revlog.rs --- a/rust/hg-cpython/src/revlog.rs Tue Dec 05 14:50:05 2023 +0100 +++ b/rust/hg-cpython/src/revlog.rs Wed Dec 06 11:04:18 2023 +0100 @@ -97,6 +97,7 @@ // Holds a reference to the mmap'ed persistent index data data index_mmap: RefCell>; data head_revs_py_list: RefCell>; + data head_node_ids_py_list: RefCell>; def __new__( _cls, @@ -259,6 +260,7 @@ self.docket(py).borrow_mut().take(); self.nodemap_mmap(py).borrow_mut().take(); self.head_revs_py_list(py).borrow_mut().take(); + self.head_node_ids_py_list(py).borrow_mut().take(); self.index(py).borrow().clear_caches(); Ok(py.None()) } @@ -630,6 +632,7 @@ RefCell::new(None), RefCell::new(Some(buf)), RefCell::new(None), + RefCell::new(None), ) } @@ -801,7 +804,8 @@ }) .collect(); - self.cache_new_heads_py_list(head_revs, py); + self.cache_new_heads_py_list(&head_revs, py); + self.cache_new_heads_node_ids_py_list(&head_revs, py); Ok(PyList::new(py, &res).into_object()) } @@ -811,7 +815,7 @@ if let Some(new_heads) = index.head_revs_shortcut().map_err(|e| graph_error(py, e))? { - self.cache_new_heads_py_list(new_heads, py); + self.cache_new_heads_py_list(&new_heads, py); } Ok(self @@ -835,7 +839,7 @@ .head_revs_filtered(&filtered_revs, true) .map_err(|e| graph_error(py, e))? { - self.cache_new_heads_py_list(new_heads, py); + self.cache_new_heads_py_list(&new_heads, py); } Ok(self @@ -847,9 +851,34 @@ .into_object()) } + fn cache_new_heads_node_ids_py_list( + &self, + new_heads: &[Revision], + py: Python<'_>, + ) -> PyList { + let index = self.index(py).borrow(); + let as_vec: Vec = new_heads + .iter() + .map(|r| { + PyBytes::new( + py, + index + .node(*r) + .expect("rev should have been in the index") + .as_bytes(), + ) + .into_object() + }) + .collect(); + let new_heads_py_list = PyList::new(py, &as_vec); + *self.head_node_ids_py_list(py).borrow_mut() = + Some(new_heads_py_list.clone_ref(py)); + new_heads_py_list + } + fn cache_new_heads_py_list( &self, - new_heads: Vec, + new_heads: &[Revision], py: Python<'_>, ) -> PyList { let as_vec: Vec = new_heads