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,22 +55,25 @@ 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 (dir, basename) = path.split().unwrap();
let tree = trees_to_write.get_mut(&dir).unwrap();
match file_override {
Override::Replace(value) => {
@ -81,7 +84,6 @@ impl TreeBuilder {
}
}
}
}
// Write trees in reverse lexicographical order, starting with trees without
// children.
@ -137,10 +139,9 @@ impl TreeBuilder {
}
};
for path in self.overrides.keys() {
if let Some(parent) = path.parent() {
let parent = path.parent().unwrap();
populate_trees(&parent);
}
}
tree_cache
.into_iter()