forked from mirrors/jj
tree_builder: ensure override file path never points to root tree
This commit is contained in:
parent
f475122b7e
commit
7cf96bcae0
1 changed files with 15 additions and 14 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue