From 7cf96bcae0031a9d53fcfb7ca8bacf5ca473b70d Mon Sep 17 00:00:00 2001 From: Yuya Nishihara Date: Thu, 1 Jun 2023 10:33:41 +0900 Subject: [PATCH] tree_builder: ensure override file path never points to root tree --- lib/src/tree_builder.rs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/src/tree_builder.rs b/lib/src/tree_builder.rs index 3a293a1bf..1ced009cb 100644 --- a/lib/src/tree_builder.rs +++ b/lib/src/tree_builder.rs @@ -55,30 +55,32 @@ impl TreeBuilder { } pub fn set(&mut self, path: RepoPath, value: TreeValue) { + assert!(!path.is_root()); self.overrides.insert(path, Override::Replace(value)); } pub fn remove(&mut self, path: RepoPath) { + assert!(!path.is_root()); self.overrides.insert(path, Override::Tombstone); } pub fn write_tree(self) -> TreeId { - let mut trees_to_write = self.get_base_trees(); - if trees_to_write.is_empty() { + if self.overrides.is_empty() { return self.base_tree_id; } + let mut trees_to_write = self.get_base_trees(); + // Update entries in parent trees for file overrides for (path, file_override) in self.overrides { - if let Some((dir, basename)) = path.split() { - let tree = trees_to_write.get_mut(&dir).unwrap(); - match file_override { - Override::Replace(value) => { - tree.set(basename.clone(), value); - } - Override::Tombstone => { - tree.remove(basename); - } + let (dir, basename) = path.split().unwrap(); + let tree = trees_to_write.get_mut(&dir).unwrap(); + match file_override { + Override::Replace(value) => { + tree.set(basename.clone(), value); + } + Override::Tombstone => { + tree.remove(basename); } } } @@ -137,9 +139,8 @@ impl TreeBuilder { } }; for path in self.overrides.keys() { - if let Some(parent) = path.parent() { - populate_trees(&parent); - } + let parent = path.parent().unwrap(); + populate_trees(&parent); } tree_cache