git: Handle git status output for deleted-in-index state (#23483)
When a file exists in HEAD, is deleted in the index, and exists again in the working copy, git produces two lines for it, one reading `D ` (deleted in index, unmodified in working copy), and the other reading `??` (untracked). Merge these two into the equivalent of `DA`. Release Notes: - Improved handling of files that are deleted in the git index but exist in HEAD and the working copy
This commit is contained in:
parent
08b3c03241
commit
55d99e0259
2 changed files with 83 additions and 0 deletions
|
@ -62,6 +62,13 @@ impl FileStatus {
|
|||
})
|
||||
}
|
||||
|
||||
pub const fn index(index_status: StatusCode) -> Self {
|
||||
FileStatus::Tracked(TrackedStatus {
|
||||
worktree_status: StatusCode::Unmodified,
|
||||
index_status,
|
||||
})
|
||||
}
|
||||
|
||||
/// Generate a FileStatus Code from a byte pair, as described in
|
||||
/// https://git-scm.com/docs/git-status#_output
|
||||
///
|
||||
|
@ -454,6 +461,26 @@ impl GitStatus {
|
|||
})
|
||||
.collect::<Vec<_>>();
|
||||
entries.sort_unstable_by(|(a, _), (b, _)| a.cmp(&b));
|
||||
// When a file exists in HEAD, is deleted in the index, and exists again in the working copy,
|
||||
// git produces two lines for it, one reading `D ` (deleted in index, unmodified in working copy)
|
||||
// and the other reading `??` (untracked). Merge these two into the equivalent of `DA`.
|
||||
entries.dedup_by(|(a, a_status), (b, b_status)| {
|
||||
const INDEX_DELETED: FileStatus = FileStatus::index(StatusCode::Deleted);
|
||||
if a.ne(&b) {
|
||||
return false;
|
||||
}
|
||||
match (*a_status, *b_status) {
|
||||
(INDEX_DELETED, FileStatus::Untracked) | (FileStatus::Untracked, INDEX_DELETED) => {
|
||||
*b_status = TrackedStatus {
|
||||
index_status: StatusCode::Deleted,
|
||||
worktree_status: StatusCode::Added,
|
||||
}
|
||||
.into();
|
||||
}
|
||||
_ => panic!("Unexpected duplicated status entries: {a_status:?} and {b_status:?}"),
|
||||
}
|
||||
true
|
||||
});
|
||||
Ok(Self {
|
||||
entries: entries.into(),
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue