[Commented On] D12460: rust-dirstatemap: add `set_untracked` method
baymax (Baymax, Your Personal Patch-care Companion)
phabricator at mercurial-scm.org
Tue Apr 12 14:58:14 UTC 2022
baymax added a comment.
baymax updated this revision to Diff 33034.
✅ refresh by Heptapod after a successful CI run (🐙 💚)
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D12460?vs=32932&id=33034
BRANCH
default
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D12460/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D12460
AFFECTED FILES
rust/hg-core/src/dirstate_tree/dirstate_map.rs
rust/hg-cpython/src/dirstate/dirstate_map.rs
CHANGE DETAILS
diff --git a/rust/hg-cpython/src/dirstate/dirstate_map.rs b/rust/hg-cpython/src/dirstate/dirstate_map.rs
--- a/rust/hg-cpython/src/dirstate/dirstate_map.rs
+++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs
@@ -142,6 +142,16 @@
Ok(was_tracked.to_py_object(py))
}
+ def set_untracked(&self, f: PyObject) -> PyResult<PyBool> {
+ let bytes = f.extract::<PyBytes>(py)?;
+ let path = HgPath::new(bytes.data(py));
+ let res = self.inner(py).borrow_mut().set_untracked(path);
+ let was_tracked = res.or_else(|_| {
+ Err(PyErr::new::<exc::OSError, _>(py, "Dirstate error".to_string()))
+ })?;
+ Ok(was_tracked.to_py_object(py))
+ }
+
def set_clean(
&self,
f: PyObject,
diff --git a/rust/hg-core/src/dirstate_tree/dirstate_map.rs b/rust/hg-core/src/dirstate_tree/dirstate_map.rs
--- a/rust/hg-core/src/dirstate_tree/dirstate_map.rs
+++ b/rust/hg-core/src/dirstate_tree/dirstate_map.rs
@@ -772,6 +772,32 @@
Ok(())
}
+ /// It is the responsibility of the caller to know that there was an entry
+ /// there before. Does not handle the removal of copy source
+ fn set_untracked(
+ &mut self,
+ filename: &HgPath,
+ old_entry: DirstateEntry,
+ ) -> Result<(), DirstateV2ParseError> {
+ let node = Self::get_or_insert_node(
+ self.on_disk,
+ &mut self.unreachable_bytes,
+ &mut self.root,
+ filename,
+ WithBasename::to_cow_owned,
+ |ancestor| {
+ ancestor.tracked_descendants_count = ancestor
+ .tracked_descendants_count
+ .checked_sub(1)
+ .expect("tracked_descendants_count should be >= 0");
+ },
+ )?;
+ let mut new_entry = old_entry.clone();
+ new_entry.set_untracked();
+ node.data = NodeData::Entry(new_entry);
+ Ok(())
+ }
+
fn set_clean(
&mut self,
filename: &HgPath,
@@ -933,6 +959,39 @@
self.with_dmap_mut(|map| map.set_tracked(filename, old_entry_opt))
}
+ pub fn set_untracked(
+ &mut self,
+ filename: &HgPath,
+ ) -> Result<bool, DirstateError> {
+ let old_entry_opt = self.get(filename)?;
+ match old_entry_opt {
+ None => Ok(false),
+ Some(old_entry) => {
+ if !old_entry.tracked() {
+ // `DirstateMap::set_untracked` is not a noop if
+ // already not tracked as it will decrement the
+ // tracked counters while going down.
+ return Ok(true);
+ }
+ if old_entry.added() {
+ // Untracking an "added" entry will just result in a
+ // worthless entry (and other parts of the code will
+ // complain about it), just drop it entirely.
+ self.drop_entry_and_copy_source(filename)?;
+ return Ok(true);
+ }
+ if !old_entry.p2_info() {
+ self.copy_map_remove(filename)?;
+ }
+
+ self.with_dmap_mut(|map| {
+ map.set_untracked(filename, old_entry)?;
+ Ok(true)
+ })
+ }
+ }
+ }
+
pub fn set_clean(
&mut self,
filename: &HgPath,
To: Alphare, #hg-reviewers
Cc: marmoute, mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20220412/99b0be22/attachment-0002.html>
More information about the Mercurial-patches
mailing list