@@ -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<Self>) {
- 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<Self>,
) -> Option<AnyElement> {
- 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<Self>) -> Option<AnyElement> {
@@ -4469,20 +4493,6 @@ impl GitPanel {
}
}
-fn current_language_model(cx: &Context<'_, GitPanel>) -> Option<Arc<dyn LanguageModel>> {
- 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<Self>) -> impl IntoElement {
let project = self.project.read(cx);