diff --git a/rust/hg-core/src/copy_tracing.rs b/rust/hg-core/src/copy_tracing.rs index 9a3804eeea82a0c9d0af2242f747cb4f63b99150_cnVzdC9oZy1jb3JlL3NyYy9jb3B5X3RyYWNpbmcucnM=..bb85d624a55c3e070a3ccff9abaec38cc7533a3c_cnVzdC9oZy1jb3JlL3NyYy9jb3B5X3RyYWNpbmcucnM= 100644 --- a/rust/hg-core/src/copy_tracing.rs +++ b/rust/hg-core/src/copy_tracing.rs @@ -243,6 +243,10 @@ } } + fn record_overwrite(&mut self, anc: Revision, desc: Revision) { + self.pairs.insert((anc, desc), true); + } + /// returns `true` if `anc` is an ancestors of `desc`, `false` otherwise fn is_overwrite(&mut self, anc: Revision, desc: Revision) -> bool { if anc > desc { @@ -382,6 +386,7 @@ // combine it with data for that revision let vertex_copies = add_from_changes( &mut path_map, + &mut oracle, &parent_copies, &changes, Parent::FirstParent, @@ -399,6 +404,7 @@ // combine it with data for that revision let vertex_copies = add_from_changes( &mut path_map, + &mut oracle, &parent_copies, &changes, Parent::SecondParent, @@ -474,5 +480,5 @@ /// Combine ChangedFiles with some existing PathCopies information and return /// the result -fn add_from_changes( +fn add_from_changes<A: Fn(Revision, Revision) -> bool>( path_map: &mut TwoWayPathMap, @@ -478,4 +484,5 @@ path_map: &mut TwoWayPathMap, + oracle: &mut AncestorOracle<A>, base_copies: &TimeStampedPathCopies, changes: &ChangedFiles, parent: Parent, @@ -510,6 +517,7 @@ } Entry::Occupied(mut slot) => { let mut ttpc = slot.get_mut(); + oracle.record_overwrite(ttpc.rev, current_rev); ttpc.rev = current_rev; ttpc.path = entry; } @@ -523,6 +531,7 @@ // TimeStampedPathCopies object. let deleted = path_map.tokenize(deleted_path); copies.entry(deleted).and_modify(|old| { + oracle.record_overwrite(old.rev, current_rev); old.rev = current_rev; old.path = None; });