From cdbddc21708419287c4d249b34199b9fef0a280d Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Tue, 9 Sep 2025 11:05:49 -0600 Subject: [PATCH] Allow unauthenticated commit models to show (#37857) Closes #37462 Closes #37814 Release Notes: - Fixed a bug where the commit generation message would not always show --- crates/git_ui/src/git_panel.rs | 68 +++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index 87a573a7a8b3dd4d3619bd284c1627ab0cfcbbff..b816976557c5542192b7c7275fe2669977babccc 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -40,8 +40,7 @@ use gpui::{ use itertools::Itertools; use language::{Buffer, File}; use language_model::{ - ConfiguredModel, LanguageModel, LanguageModelRegistry, LanguageModelRequest, - LanguageModelRequestMessage, Role, + ConfiguredModel, LanguageModelRegistry, LanguageModelRequest, LanguageModelRequestMessage, Role, }; use menu::{Confirm, SecondaryConfirm, SelectFirst, SelectLast, SelectNext, SelectPrevious}; use multi_buffer::ExcerptInfo; @@ -1860,13 +1859,17 @@ impl GitPanel { /// Generates a commit message using an LLM. pub fn generate_commit_message(&mut self, cx: &mut Context) { - if !self.can_commit() || DisableAiSettings::get_global(cx).disable_ai { + if !self.can_commit() + || DisableAiSettings::get_global(cx).disable_ai + || !agent_settings::AgentSettings::get_global(cx).enabled + { return; } - let model = match current_language_model(cx) { - Some(value) => value, - None => return, + let Some(ConfiguredModel { provider, model }) = + LanguageModelRegistry::read_global(cx).commit_message_model() + else { + return; }; let Some(repo) = self.active_repository.as_ref() else { @@ -1891,6 +1894,16 @@ impl GitPanel { this.generate_commit_message_task.take(); }); + if let Some(task) = cx.update(|cx| { + if !provider.is_authenticated(cx) { + Some(provider.authenticate(cx)) + } else { + None + } + })? { + task.await.log_err(); + }; + let mut diff_text = match diff.await { Ok(result) => match result { Ok(text) => text, @@ -3080,9 +3093,18 @@ impl GitPanel { &self, cx: &Context, ) -> Option { - current_language_model(cx).is_some().then(|| { - if self.generate_commit_message_task.is_some() { - return h_flex() + if !agent_settings::AgentSettings::get_global(cx).enabled + || DisableAiSettings::get_global(cx).disable_ai + || LanguageModelRegistry::read_global(cx) + .commit_message_model() + .is_none() + { + return None; + } + + if self.generate_commit_message_task.is_some() { + return Some( + h_flex() .gap_1() .child( Icon::new(IconName::ArrowCircle) @@ -3095,11 +3117,13 @@ impl GitPanel { .size(LabelSize::Small) .color(Color::Muted), ) - .into_any_element(); - } + .into_any_element(), + ); + } - let can_commit = self.can_commit(); - let editor_focus_handle = self.commit_editor.focus_handle(cx); + let can_commit = self.can_commit(); + let editor_focus_handle = self.commit_editor.focus_handle(cx); + Some( IconButton::new("generate-commit-message", IconName::AiEdit) .shape(ui::IconButtonShape::Square) .icon_color(Color::Muted) @@ -3120,8 +3144,8 @@ impl GitPanel { .on_click(cx.listener(move |this, _event, _window, cx| { this.generate_commit_message(cx); })) - .into_any_element() - }) + .into_any_element(), + ) } pub(crate) fn render_co_authors(&self, cx: &Context) -> Option { @@ -4469,20 +4493,6 @@ impl GitPanel { } } -fn current_language_model(cx: &Context<'_, GitPanel>) -> Option> { - let is_enabled = agent_settings::AgentSettings::get_global(cx).enabled - && !DisableAiSettings::get_global(cx).disable_ai; - - is_enabled - .then(|| { - let ConfiguredModel { provider, model } = - LanguageModelRegistry::read_global(cx).commit_message_model()?; - - provider.is_authenticated(cx).then(|| model) - }) - .flatten() -} - impl Render for GitPanel { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { let project = self.project.read(cx);