# HG changeset patch # User Raphaël Gomès # Date 1648483741 -7200 # Node ID c1a3fdedc492d791368c008464d39147b705c5ad # Parent a69ea5a3c5a5fba20096005872f0ccd17b200628 rust-dirstatemap: add `set_possibly_dirty` method This is the new API that Python has already migrated to. Differential Revision: https://phab.mercurial-scm.org/D12504 diff -r a69ea5a3c5a5 -r c1a3fdedc492 rust/hg-core/src/dirstate_tree/dirstate_map.rs --- a/rust/hg-core/src/dirstate_tree/dirstate_map.rs Mon Mar 28 18:02:45 2022 +0200 +++ b/rust/hg-core/src/dirstate_tree/dirstate_map.rs Mon Mar 28 18:09:01 2022 +0200 @@ -427,6 +427,13 @@ _ => None, } } + + fn as_entry_mut(&mut self) -> Option<&mut DirstateEntry> { + match self { + NodeData::Entry(entry) => Some(entry), + _ => None, + } + } } impl<'on_disk> DirstateMap<'on_disk> { @@ -791,6 +798,24 @@ Ok(()) } + fn set_possibly_dirty( + &mut self, + filename: &HgPath, + ) -> Result<(), DirstateError> { + let node = Self::get_or_insert_node( + self.on_disk, + &mut self.unreachable_bytes, + &mut self.root, + filename, + WithBasename::to_cow_owned, + |_ancestor| {}, + )?; + let entry = node.data.as_entry_mut().expect("entry should exist"); + entry.set_possibly_dirty(); + node.data = NodeData::Entry(*entry); + Ok(()) + } + fn iter_nodes<'tree>( &'tree self, ) -> impl Iterator< @@ -929,6 +954,16 @@ }) } + pub fn set_possibly_dirty( + &mut self, + filename: &HgPath, + ) -> Result<(), DirstateError> { + if self.get(filename)?.is_none() { + return Err(DirstateMapError::PathNotFound(filename.into()).into()); + } + self.with_dmap_mut(|map| map.set_possibly_dirty(filename)) + } + pub fn reset_state( &mut self, filename: &HgPath, diff -r a69ea5a3c5a5 -r c1a3fdedc492 rust/hg-cpython/src/dirstate/dirstate_map.rs --- a/rust/hg-cpython/src/dirstate/dirstate_map.rs Mon Mar 28 18:02:45 2022 +0200 +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs Mon Mar 28 18:09:01 2022 +0200 @@ -164,6 +164,16 @@ Ok(PyNone) } + def set_possibly_dirty(&self, f: PyObject) -> PyResult { + let bytes = f.extract::(py)?; + let path = HgPath::new(bytes.data(py)); + let res = self.inner(py).borrow_mut().set_possibly_dirty(path); + res.or_else(|_| { + Err(PyErr::new::(py, "Dirstate error".to_string())) + })?; + Ok(PyNone) + } + def reset_state( &self, f: PyObject,