From 7f23875c5ec7b7cd41c413e1a21bec2039552839 Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Tue, 18 Mar 2025 13:21:20 -0400 Subject: [PATCH] Fold git merge messages into commit editor placeholder text (#26992) This PR changes the git commit message editors to surface git's suggested merge message, if any, as placeholder text, as opposed to "real" buffer text as was previously the case. Release Notes: - Changed git commit message editors to use placeholder text for git's suggested merge messages --- crates/git_ui/src/commit_modal.rs | 2 +- crates/git_ui/src/git_panel.rs | 38 +++++++++++++++++-------------- crates/project/src/git.rs | 22 ++---------------- 3 files changed, 24 insertions(+), 38 deletions(-) diff --git a/crates/git_ui/src/commit_modal.rs b/crates/git_ui/src/commit_modal.rs index a1449a73ea08d5efa68530be9dc59e2a7f06fc3c..0bcbd2a71f127ad4c5a3c6ec9424f6387904aaa4 100644 --- a/crates/git_ui/src/commit_modal.rs +++ b/crates/git_ui/src/commit_modal.rs @@ -136,7 +136,7 @@ impl CommitModal { cx: &mut Context, ) -> Self { let panel = git_panel.read(cx); - let suggested_commit_message = panel.suggest_commit_message(); + let suggested_commit_message = panel.suggest_commit_message(cx); let commit_editor = git_panel.update(cx, |git_panel, cx| { git_panel.set_modal_open(true, cx); diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index b52bd3441965294c59ebfb8349a0cd7e24939ff9..57a9453fb611d80bc331ff5e9fc545c915e2ef52 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -1407,7 +1407,7 @@ impl GitPanel { return Some(message.to_string()); } - self.suggest_commit_message() + self.suggest_commit_message(cx) .filter(|message| !message.trim().is_empty()) } @@ -1576,7 +1576,15 @@ impl GitPanel { } /// Suggests a commit message based on the changed files and their statuses - pub fn suggest_commit_message(&self) -> Option { + pub fn suggest_commit_message(&self, cx: &App) -> Option { + if let Some(merge_message) = self + .active_repository + .as_ref() + .and_then(|repo| repo.read(cx).merge_message.as_ref()) + { + return Some(merge_message.clone()); + } + let git_status_entry = if let Some(staged_entry) = &self.single_staged_entry { Some(staged_entry) } else if let Some(single_tracked_entry) = &self.single_tracked_entry { @@ -1712,19 +1720,6 @@ impl GitPanel { })); } - fn update_editor_placeholder(&mut self, cx: &mut Context) { - let suggested_commit_message = self.suggest_commit_message(); - let placeholder_text = suggested_commit_message - .as_deref() - .unwrap_or("Enter commit message"); - - self.commit_editor.update(cx, |editor, cx| { - editor.set_placeholder_text(Arc::from(placeholder_text), cx) - }); - - cx.notify(); - } - pub(crate) fn fetch(&mut self, window: &mut Window, cx: &mut Context) { if !self.can_push_and_pull(cx) { return; @@ -2181,7 +2176,6 @@ impl GitPanel { git_panel.clear_pending(); } git_panel.update_visible_entries(cx); - git_panel.update_editor_placeholder(cx); git_panel.update_scrollbar_properties(window, cx); }) .ok(); @@ -2217,7 +2211,7 @@ impl GitPanel { git_panel.commit_editor = cx.new(|cx| { commit_message_editor( buffer, - git_panel.suggest_commit_message().as_deref(), + git_panel.suggest_commit_message(cx).as_deref(), git_panel.project.clone(), true, window, @@ -2237,6 +2231,7 @@ impl GitPanel { fn update_visible_entries(&mut self, cx: &mut Context) { self.entries.clear(); self.single_staged_entry.take(); + self.single_tracked_entry.take(); self.conflicted_count = 0; self.conflicted_staged_count = 0; self.new_count = 0; @@ -2396,6 +2391,15 @@ impl GitPanel { self.select_first_entry_if_none(cx); + let suggested_commit_message = self.suggest_commit_message(cx); + let placeholder_text = suggested_commit_message + .as_deref() + .unwrap_or("Enter commit message"); + + self.commit_editor.update(cx, |editor, cx| { + editor.set_placeholder_text(Arc::from(placeholder_text), cx) + }); + cx.notify(); } diff --git a/crates/project/src/git.rs b/crates/project/src/git.rs index 81e4b43131637eec6548518a11d91da3fe8e9d54..51271f9b77202768a27e786c4dcca83f76d8de37 100644 --- a/crates/project/src/git.rs +++ b/crates/project/src/git.rs @@ -605,20 +605,9 @@ impl GitStore { } // Update the statuses and merge message but keep everything else. let existing_handle = handle.clone(); - existing_handle.update(cx, |existing_handle, cx| { + existing_handle.update(cx, |existing_handle, _| { existing_handle.repository_entry = repo.clone(); - if matches!(git_repo, GitRepo::Local { .. }) - && existing_handle.merge_message != merge_message - { - if let (Some(merge_message), Some(buffer)) = - (&merge_message, &existing_handle.commit_message_buffer) - { - buffer.update(cx, |buffer, cx| { - if buffer.is_empty() { - buffer.set_text(merge_message.as_str(), cx); - } - }) - } + if matches!(git_repo, GitRepo::Local { .. }) { existing_handle.merge_message = merge_message; } }); @@ -2177,7 +2166,6 @@ impl Repository { buffer_store: Entity, cx: &mut Context, ) -> Task>> { - let merge_message = self.merge_message.clone(); cx.spawn(|repository, mut cx| async move { let buffer = buffer_store .update(&mut cx, |buffer_store, cx| buffer_store.create_buffer(cx))? @@ -2190,12 +2178,6 @@ impl Repository { })?; } - if let Some(merge_message) = merge_message { - buffer.update(&mut cx, |buffer, cx| { - buffer.set_text(merge_message.as_str(), cx) - })?; - } - repository.update(&mut cx, |repository, _| { repository.commit_message_buffer = Some(buffer.clone()); })?;