diff --git a/crates/project/src/git_store.rs b/crates/project/src/git_store.rs index aaf66e8ea98110fda096e56aa4287af3b15b4725..debb1c643b06b06c0fd52cfcc65c92c210502b7b 100644 --- a/crates/project/src/git_store.rs +++ b/crates/project/src/git_store.rs @@ -2692,6 +2692,7 @@ impl MergeDetails { status: &SumTree, prev_snapshot: &RepositorySnapshot, ) -> Result<(MergeDetails, bool)> { + log::debug!("load merge details"); let message = backend.merge_message().await; let heads = backend .revparse_batch(vec![ @@ -2709,12 +2710,33 @@ impl MergeDetails { .collect::>(); let merge_heads_changed = heads != prev_snapshot.merge.heads; let conflicted_paths = if merge_heads_changed { - TreeSet::from_ordered_entries( + let current_conflicted_paths = TreeSet::from_ordered_entries( status .iter() .filter(|entry| entry.status.is_conflicted()) .map(|entry| entry.repo_path.clone()), - ) + ); + + // It can happen that we run a scan while a lengthy merge is in progress + // that will eventually result in conflicts, but before those conflicts + // are reported by `git status`. Since for the moment we only care about + // the merge heads state for the purposes of tracking conflicts, don't update + // this state until we see some conflicts. + if heads.iter().any(Option::is_some) + && !prev_snapshot.merge.heads.iter().any(Option::is_some) + && current_conflicted_paths.is_empty() + { + log::debug!("not updating merge heads because no conflicts found"); + return Ok(( + MergeDetails { + message: message.map(SharedString::from), + ..prev_snapshot.merge.clone() + }, + false, + )); + } + + current_conflicted_paths } else { prev_snapshot.merge.conflicted_paths.clone() }; @@ -3998,6 +4020,8 @@ impl Repository { Some(GitJobKey::ReloadGitState), None, |state, mut cx| async move { + log::debug!("run scheduled git status scan"); + let Some(this) = this.upgrade() else { return Ok(()); }; @@ -4535,6 +4559,7 @@ async fn compute_snapshot( ); let (merge_details, merge_heads_changed) = MergeDetails::load(&backend, &statuses_by_path, &prev_snapshot).await?; + log::debug!("new merge details (changed={merge_heads_changed:?}): {merge_details:?}"); if merge_heads_changed || branch != prev_snapshot.branch