ok/jj
1
0
Fork 0
forked from mirrors/jj

tree_builder: ensure override file path never points to root tree

This commit is contained in:
Yuya Nishihara 2023-06-01 10:33:41 +09:00
parent f475122b7e
commit 7cf96bcae0

View file

@ -55,30 +55,32 @@ impl TreeBuilder {
} }
pub fn set(&mut self, path: RepoPath, value: TreeValue) { pub fn set(&mut self, path: RepoPath, value: TreeValue) {
assert!(!path.is_root());
self.overrides.insert(path, Override::Replace(value)); self.overrides.insert(path, Override::Replace(value));
} }
pub fn remove(&mut self, path: RepoPath) { pub fn remove(&mut self, path: RepoPath) {
assert!(!path.is_root());
self.overrides.insert(path, Override::Tombstone); self.overrides.insert(path, Override::Tombstone);
} }
pub fn write_tree(self) -> TreeId { pub fn write_tree(self) -> TreeId {
let mut trees_to_write = self.get_base_trees(); if self.overrides.is_empty() {
if trees_to_write.is_empty() {
return self.base_tree_id; return self.base_tree_id;
} }
let mut trees_to_write = self.get_base_trees();
// Update entries in parent trees for file overrides // Update entries in parent trees for file overrides
for (path, file_override) in self.overrides { for (path, file_override) in self.overrides {
if let Some((dir, basename)) = path.split() { let (dir, basename) = path.split().unwrap();
let tree = trees_to_write.get_mut(&dir).unwrap(); let tree = trees_to_write.get_mut(&dir).unwrap();
match file_override { match file_override {
Override::Replace(value) => { Override::Replace(value) => {
tree.set(basename.clone(), value); tree.set(basename.clone(), value);
} }
Override::Tombstone => { Override::Tombstone => {
tree.remove(basename); tree.remove(basename);
}
} }
} }
} }
@ -137,9 +139,8 @@ impl TreeBuilder {
} }
}; };
for path in self.overrides.keys() { for path in self.overrides.keys() {
if let Some(parent) = path.parent() { let parent = path.parent().unwrap();
populate_trees(&parent); populate_trees(&parent);
}
} }
tree_cache tree_cache