# git: Fix a race that caused incorrect hunk staging information \(\#53929\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/652f1fa3b08e0ef906f017ba9e474fb357d9f8e0)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 652f1fa3b08e0ef906f017ba9e474fb357d9f8e0

Requested commit: 652f1fa3b08e0ef906f017ba9e474fb357d9f8e0

Commit: 652f1fa3b08e0ef906f017ba9e474fb357d9f8e0

Tree: 53fb4fe790e2b89c1e5db160f1add25cd744047c

Author: Cole Miller

Committer: GitHub

## Message

```
git: Fix a race that caused incorrect hunk staging information (#53929)

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.
```

## Parents

- [5d15e010aee869a9e1f3e168d089b5650aa13ba1](https://git.cafe/gitcafe/zed/commit/5d15e010aee869a9e1f3e168d089b5650aa13ba1?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/652f1fa3b08e0ef906f017ba9e474fb357d9f8e0?format=markdown)
