From 9431c6573318dde690bc4e61b3b82d97a69030b8 Mon Sep 17 00:00:00 2001
From: Jacob <33708767+jacobtread@users.noreply.github.com>
Date: Wed, 10 Sep 2025 06:16:29 +1200
Subject: [PATCH] git: Improve error messages (#35946)
Release Notes:
- Improved git error messages
Includes stderr in the error message for git commands, provides better
output for things like errors when switching branches.
Before:
After:
---------
Co-authored-by: Conrad Irwin
---
crates/git/src/repository.rs | 4 +++-
crates/workspace/src/notifications.rs | 7 ++++++-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/crates/git/src/repository.rs b/crates/git/src/repository.rs
index fd12dafa98575b5d8b0190d6ed4e894ac61e8165..6d053e1855d34d3bc0c173f760e7f71cd816d288 100644
--- a/crates/git/src/repository.rs
+++ b/crates/git/src/repository.rs
@@ -1814,6 +1814,7 @@ impl GitBinary {
output.status.success(),
GitBinaryCommandError {
stdout: String::from_utf8_lossy(&output.stdout).to_string(),
+ stderr: String::from_utf8_lossy(&output.stderr).to_string(),
status: output.status,
}
);
@@ -1836,9 +1837,10 @@ impl GitBinary {
}
#[derive(Error, Debug)]
-#[error("Git command failed: {stdout}")]
+#[error("Git command failed:\n{stdout}{stderr}\n")]
struct GitBinaryCommandError {
stdout: String,
+ stderr: String,
status: ExitStatus,
}
diff --git a/crates/workspace/src/notifications.rs b/crates/workspace/src/notifications.rs
index 039aec51990cda02e99996e9a4029aa42613f492..768b10abe4f3973ca6424b7b59b4e3bfb44cbb15 100644
--- a/crates/workspace/src/notifications.rs
+++ b/crates/workspace/src/notifications.rs
@@ -1077,8 +1077,13 @@ where
if let Err(err) = result.as_ref() {
log::error!("{err:?}");
if let Ok(prompt) = cx.update(|window, cx| {
+ let mut display = format!("{err}");
+ if !display.ends_with('\n') {
+ display.push('.');
+ display.push(' ')
+ }
let detail =
- f(err, window, cx).unwrap_or_else(|| format!("{err}. Please try again."));
+ f(err, window, cx).unwrap_or_else(|| format!("{display}Please try again."));
window.prompt(PromptLevel::Critical, &msg, Some(&detail), &["Ok"], cx)
}) {
prompt.await.ok();