diff --git a/crates/git/src/git.rs b/crates/git/src/git.rs index ede44d9a135dc8941880521fb7971e55be388279..b731d44f938e741237f343799327caa51543fb39 100644 --- a/crates/git/src/git.rs +++ b/crates/git/src/git.rs @@ -10,8 +10,8 @@ pub use crate::remote::*; use anyhow::{Context as _, Result}; pub use git2 as libgit; use gpui::{Action, actions}; +pub use repository::RemoteCommandOutput; pub use repository::WORK_DIRECTORY_REPO_PATH; -pub use repository::{GitCommandOutput, RemoteCommandOutput}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::ffi::OsStr; diff --git a/crates/git/src/repository.rs b/crates/git/src/repository.rs index be6d5b4f03e4685b94b6f637c04d432c4acc4332..ea272959b573ef0daa257c64a686bdf77823fbb1 100644 --- a/crates/git/src/repository.rs +++ b/crates/git/src/repository.rs @@ -132,32 +132,6 @@ pub struct RemoteCommandOutput { pub stderr: String, } -#[derive(Debug, Clone)] -pub struct GitCommandOutput { - pub stdout: String, - pub stderr: String, -} - -impl std::fmt::Display for GitCommandOutput { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let stderr = self.stderr.trim(); - let message = if stderr.is_empty() { - self.stdout.trim() - } else { - stderr - }; - write!(f, "{}", message) - } -} - -impl std::error::Error for GitCommandOutput {} - -impl GitCommandOutput { - pub fn is_empty(&self) -> bool { - self.stdout.is_empty() && self.stderr.is_empty() - } -} - impl RemoteCommandOutput { pub fn is_empty(&self) -> bool { self.stdout.is_empty() && self.stderr.is_empty() @@ -1103,18 +1077,10 @@ impl GitRepository for RealGitRepository { .spawn(async move { let branch = branch.await?; - match GitBinary::new(git_binary_path, working_directory?, executor) - .run_with_output(&["checkout", &branch]) - .await - { - Ok(_) => anyhow::Ok(()), - Err(e) => { - if let Some(git_error) = e.downcast_ref::() { - anyhow::bail!("{}", git_error.stderr.trim()); - } - Err(e) - } - } + GitBinary::new(git_binary_path, working_directory?, executor) + .run(&["checkout", &branch]) + .await?; + anyhow::Ok(()) }) .boxed() } @@ -1138,18 +1104,10 @@ impl GitRepository for RealGitRepository { self.executor .spawn(async move { - match GitBinary::new(git_binary_path, working_directory?, executor) - .run_with_output(&["branch", "-m", &branch, &new_name]) - .await - { - Ok(_) => Ok(()), - Err(e) => { - if let Some(git_error) = e.downcast_ref::() { - anyhow::bail!("{}", git_error.stderr.trim()); - } - Err(e) - } - } + GitBinary::new(git_binary_path, working_directory?, executor) + .run(&["branch", "-m", &branch, &new_name]) + .await?; + anyhow::Ok(()) }) .boxed() } @@ -1865,31 +1823,6 @@ impl GitBinary { Ok(stdout) } - pub async fn run_with_output( - &self, - args: impl IntoIterator, - ) -> Result - where - S: AsRef, - { - let mut command = self.build_command(args); - let output = command.output().await?; - - let stdout = String::from_utf8_lossy(&output.stdout).to_string(); - let stderr = String::from_utf8_lossy(&output.stderr).to_string(); - - if !output.status.success() { - return Err(GitBinaryCommandError { - stdout: stdout.clone(), - stderr: stderr.clone(), - status: output.status, - } - .into()); - } - - Ok(GitCommandOutput { stdout, stderr }) - } - /// Returns the result of the command without trimming the trailing newline. pub async fn run_raw(&self, args: impl IntoIterator) -> Result where diff --git a/crates/git_ui/src/branch_picker.rs b/crates/git_ui/src/branch_picker.rs index 02ba79ce08b200622690a649eadf530cfc0ce4b2..42558b7b79bca1892b9d36ae4b39bb3cdb196d4f 100644 --- a/crates/git_ui/src/branch_picker.rs +++ b/crates/git_ui/src/branch_picker.rs @@ -244,37 +244,25 @@ impl BranchListDelegate { let new_branch_name = new_branch_name.to_string().replace(' ', "-"); cx.spawn(async move |_, cx| { if let Some(based_branch) = from_branch { - match repo - .update(cx, |repo, _| repo.change_branch(based_branch.to_string()))? - .await - { - Ok(Ok(_)) => {} - Ok(Err(error)) => return Err(error), - Err(_) => return Err(anyhow::anyhow!("Operation was canceled")), - } + repo.update(cx, |repo, _| repo.change_branch(based_branch.to_string()))? + .await??; } - match repo - .update(cx, |repo, _| repo.create_branch(new_branch_name.clone()))? - .await - { - Ok(Ok(_)) => {} - Ok(Err(error)) => return Err(error), - Err(_) => return Err(anyhow::anyhow!("Operation was canceled")), - } - - match repo - .update(cx, |repo, _| repo.change_branch(new_branch_name))? - .await - { - Ok(Ok(_)) => {} - Ok(Err(error)) => return Err(error), - Err(_) => return Err(anyhow::anyhow!("Operation was canceled")), - } + repo.update(cx, |repo, _| { + repo.create_branch(new_branch_name.to_string()) + })? + .await??; + repo.update(cx, |repo, _| { + repo.change_branch(new_branch_name.to_string()) + })? + .await??; Ok(()) }) - .detach_and_prompt_err("Failed to create branch", window, cx, |_, _, _| None); + .detach_and_prompt_err("Failed to create branch", window, cx, |e, _, _| { + Some(e.to_string()) + }); + cx.emit(DismissEvent); } } @@ -425,8 +413,6 @@ impl PickerDelegate for BranchListDelegate { cx.spawn_in(window, { let branch = entry.branch.clone(); async move |picker, cx| { - let branch_name = branch.name().to_string(); - let branch_change_task = picker.update(cx, |this, cx| { let repo = this .delegate @@ -438,31 +424,23 @@ impl PickerDelegate for BranchListDelegate { let mut cx = cx.to_async(); anyhow::Ok(async move { - repo.update(&mut cx, |repo, _| repo.change_branch(branch_name))? - .await? + repo.update(&mut cx, |repo, _| { + repo.change_branch(branch.name().to_string()) + })? + .await? }) })??; - match branch_change_task.await { - Ok(_) => { - let _ = picker.update(cx, |_, cx| { - cx.emit(DismissEvent); - anyhow::Ok(()) - })?; - } - Err(error) => { - let _ = picker.update(cx, |_, cx| { - cx.emit(DismissEvent); - anyhow::Ok(()) - })?; - return Err(error); - } - } + branch_change_task.await?; + + picker.update(cx, |_, cx| { + cx.emit(DismissEvent); - anyhow::Ok(()) + anyhow::Ok(()) + }) } }) - .detach_and_prompt_err("Failed to switch branch", window, cx, |_, _, _| None); + .detach_and_prompt_err("Failed to change branch", window, cx, |_, _, _| None); } fn dismissed(&mut self, _: &mut Window, cx: &mut Context>) {