Properly clean up dnagling unmanaged entries in the state file.

This commit is contained in:
R-VdP 2023-03-14 17:06:18 +01:00
parent 16b3a09558
commit 5b91600523
No known key found for this signature in database

View file

@ -125,7 +125,7 @@ impl EtcTree {
where where
F: Fn(&Path) -> bool, F: Fn(&Path) -> bool,
{ {
let new_tree = self.nested.clone().keys().fold(self, |mut new_tree, name| { let new_tree = self.nested.keys().fold(self.clone(), |mut new_tree, name| {
new_tree.nested = new_tree.nested.alter( new_tree.nested = new_tree.nested.alter(
|subtree| subtree.and_then(|subtree| subtree.deactivate(delete_action)), |subtree| subtree.and_then(|subtree| subtree.deactivate(delete_action)),
name.to_owned(), name.to_owned(),
@ -133,11 +133,15 @@ impl EtcTree {
new_tree new_tree
}); });
if let EtcFileStatus::Managed = new_tree.status { if new_tree.nested.is_empty() {
if new_tree.nested.is_empty() && delete_action(&new_tree.path) { if let EtcFileStatus::Managed = new_tree.status {
None if delete_action(&new_tree.path) {
None
} else {
Some(new_tree)
}
} else { } else {
Some(new_tree) None
} }
} else { } else {
Some(new_tree) Some(new_tree)
@ -185,6 +189,11 @@ impl EtcTree {
new_tree new_tree
}); });
if merged.nested.is_empty() {
if let EtcFileStatus::Unmanaged = merged.status {
return None;
}
}
Some(merged) Some(merged)
} }
} }
@ -291,7 +300,11 @@ mod tests {
.register_managed_entry(&PathBuf::from("/").join("foo3").join("baz2").join("bar")) .register_managed_entry(&PathBuf::from("/").join("foo3").join("baz2").join("bar"))
.register_managed_entry(&PathBuf::from("/").join("foo4")) .register_managed_entry(&PathBuf::from("/").join("foo4"))
.register_managed_entry(&PathBuf::from("/").join("foo4").join("baz")) .register_managed_entry(&PathBuf::from("/").join("foo4").join("baz"))
.register_managed_entry(&PathBuf::from("/").join("foo4").join("baz").join("bar")); .register_managed_entry(&PathBuf::from("/").join("foo4").join("baz").join("bar"))
.register_managed_entry(&PathBuf::from("/").join("foo5"))
.register_managed_entry(&PathBuf::from("/").join("foo5").join("baz"))
.register_managed_entry(&PathBuf::from("/").join("foo5").join("baz2"))
.register_managed_entry(&PathBuf::from("/").join("foo5").join("baz").join("bar"));
let tree2 = tree1 let tree2 = tree1
.clone() .clone()
.deactivate_managed_entry(&PathBuf::from("/").join("foo4"), &|p| { .deactivate_managed_entry(&PathBuf::from("/").join("foo4"), &|p| {
@ -302,19 +315,22 @@ mod tests {
println!("Deactivating: {}", p.display()); println!("Deactivating: {}", p.display());
true true
}) })
// Since foo3 is unmanaged, it should not be removed
.deactivate_managed_entry(&PathBuf::from("/").join("foo3"), &|p| { .deactivate_managed_entry(&PathBuf::from("/").join("foo3"), &|p| {
println!("Deactivating: {}", p.display()); println!("Deactivating: {}", p.display());
true true
})
.deactivate_managed_entry(&PathBuf::from("/").join("foo5").join("baz"), &|p| {
println!("Deactivating: {}", p.display());
true
}); });
dbg!(&tree1); dbg!(&tree1);
assert_eq!( assert_eq!(
tree2.nested.keys().sorted().collect::<Vec<_>>(), tree2.nested.keys().sorted().collect::<Vec<_>>(),
["foo", "foo3", "foo4"] ["foo", "foo4", "foo5"]
); );
assert!(tree2 assert!(tree2
.nested .nested
.get("foo3") .get("foo5")
.unwrap() .unwrap()
.nested .nested
.get("baz2") .get("baz2")
@ -326,7 +342,7 @@ mod tests {
.is_empty()); .is_empty());
assert_eq!( assert_eq!(
tree1.nested.keys().sorted().collect::<Vec<_>>(), tree1.nested.keys().sorted().collect::<Vec<_>>(),
["foo", "foo2", "foo3", "foo4"] ["foo", "foo2", "foo3", "foo4", "foo5"]
); );
} }