In `GitStore::open_diff_internal`, when opening a `DiffKind::Unstaged` diff, we previously always overwrote the `unstaged_diff` field of `BufferGitState`. This causes a bug in the following situation: - We call `open_unstaged_diff`, and it hits an await point where it is loading the index text - While that task is suspended, we call `open_uncommitted_diff`. It reaches `open_diff_internal` and sets `buffer_git_state.uncommitted_diff` and `buffer_git_state.unstaged_diff`. It also sets the secondary diff for the uncommitted diff to be the unstaged diff that it just opened. - The `open_unstaged_diff` task wakes up and enters `open_diff_internal`. It creates a new entity for the unstaged diff and overwrites `buffer_git_state.unstaged_diff` with it, but it doesn't update the secondary diff of the uncommitted diff, which still has the entity that was produced in the previous step. - Now the uncommitted diff's secondary diff will never receive updates from the `GitStore`, causing staging information to be incorrect. The fix is for `open_diff_internal` to not overwrite an existing unstaged diff. Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - Fixed a bug that could cause diff hunks to have an incorrect staged status.
2 files changedLine totals unavailable