Fix the project diff sometimes missing updates (#40662)
This PR does two related things: - First, it gets rid of the undifferentiated `RepositoryEvent::Updated` in favor of three new events that have clearer definitions: `BranchChanged`, `StashEntriesChanged`, and `StatusesChanged`. An implication of this is that we no longer emit a `RepositoryEvent` unless some git state changed; previously we would emit `RepositoryUpdated` after doing a git status scan even if no statuses changed. - Second, it changes the subscription strategy of the project diff to make it update more robustly. Previously, the project diff only subscribed to the `GitStore`, so it relied on getting a `GitStoreEvent` when some buffer's diff hunks changed, even if the git status of the buffer's file didn't change (e.g. a second hunk in a file that was already modified). After this PR, it also subscribes to the individual `BufferDiff` entities for buffers that have a git status, so the `GitStore` is freed from that responsibility. This also fixes some real cases where the previous strategy was not effective in keeping the project diff up to date (captured in a test). Release Notes: - Fixed some cases where the project diff would fail to update in response to git events.
This commit is contained in:
@@ -156,7 +156,7 @@ use project::{
|
||||
},
|
||||
session::{Session, SessionEvent},
|
||||
},
|
||||
git_store::{GitStoreEvent, RepositoryEvent},
|
||||
git_store::GitStoreEvent,
|
||||
lsp_store::{
|
||||
CacheInlayHints, CompletionDocumentation, FormatTrigger, LspFormatTarget,
|
||||
OpenLspBufferHandle,
|
||||
@@ -1978,14 +1978,7 @@ impl Editor {
|
||||
let git_store = project.read(cx).git_store().clone();
|
||||
let project = project.clone();
|
||||
project_subscriptions.push(cx.subscribe(&git_store, move |this, _, event, cx| {
|
||||
if let GitStoreEvent::RepositoryUpdated(
|
||||
_,
|
||||
RepositoryEvent::Updated {
|
||||
new_instance: true, ..
|
||||
},
|
||||
_,
|
||||
) = event
|
||||
{
|
||||
if let GitStoreEvent::RepositoryAdded = event {
|
||||
this.load_diff_task = Some(
|
||||
update_uncommitted_diff_for_buffer(
|
||||
cx.entity(),
|
||||
|
||||
Reference in New Issue
Block a user