Add branch rename action to Git panel (#38273)
Reopening #35136, cc @launay12u Release Notes: - git: added `git: rename branch` action to rename a branch (`git branch -m`) --------- Co-authored-by: Guillaume Launay <guillaume.launay@paylead.fr> Co-authored-by: Peter Tripp <petertripp@gmail.com>
This commit is contained in:
co-authored by
Guillaume Launay
Peter Tripp
parent
df50b5c14a
commit
439d31e2d4
@@ -11,6 +11,7 @@ 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;
|
||||
use schemars::JsonSchema;
|
||||
use serde::{Deserialize, Serialize};
|
||||
@@ -101,6 +102,18 @@ actions!(
|
||||
]
|
||||
);
|
||||
|
||||
/// Renames a git branch.
|
||||
#[derive(Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Action)]
|
||||
#[action(namespace = git)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct RenameBranch {
|
||||
/// The branch to rename.
|
||||
///
|
||||
/// Default: the current branch.
|
||||
#[serde(default)]
|
||||
pub branch: Option<String>,
|
||||
}
|
||||
|
||||
/// Restores a file to its last committed state, discarding local changes.
|
||||
#[derive(Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Action)]
|
||||
#[action(namespace = git, deprecated_aliases = ["editor::RevertFile"])]
|
||||
|
||||
@@ -346,6 +346,7 @@ pub trait GitRepository: Send + Sync {
|
||||
|
||||
fn change_branch(&self, name: String) -> BoxFuture<'_, Result<()>>;
|
||||
fn create_branch(&self, name: String) -> BoxFuture<'_, Result<()>>;
|
||||
fn rename_branch(&self, branch: String, new_name: String) -> BoxFuture<'_, Result<()>>;
|
||||
|
||||
fn reset(
|
||||
&self,
|
||||
@@ -1095,11 +1096,11 @@ impl GitRepository for RealGitRepository {
|
||||
let (_, branch_name) = name.split_once("/").context("Unexpected branch format")?;
|
||||
let revision = revision.get();
|
||||
let branch_commit = revision.peel_to_commit()?;
|
||||
let mut branch = repo.branch(branch_name, &branch_commit, false)?;
|
||||
let mut branch = repo.branch(&branch_name, &branch_commit, false)?;
|
||||
branch.set_upstream(Some(&name))?;
|
||||
branch
|
||||
} else {
|
||||
anyhow::bail!("Branch not found");
|
||||
anyhow::bail!("Branch '{}' not found", name);
|
||||
};
|
||||
|
||||
Ok(branch
|
||||
@@ -1115,7 +1116,6 @@ impl GitRepository for RealGitRepository {
|
||||
GitBinary::new(git_binary_path, working_directory?, executor)
|
||||
.run(&["checkout", &branch])
|
||||
.await?;
|
||||
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.boxed()
|
||||
@@ -1133,6 +1133,21 @@ impl GitRepository for RealGitRepository {
|
||||
.boxed()
|
||||
}
|
||||
|
||||
fn rename_branch(&self, branch: String, new_name: String) -> BoxFuture<'_, Result<()>> {
|
||||
let git_binary_path = self.git_binary_path.clone();
|
||||
let working_directory = self.working_directory();
|
||||
let executor = self.executor.clone();
|
||||
|
||||
self.executor
|
||||
.spawn(async move {
|
||||
GitBinary::new(git_binary_path, working_directory?, executor)
|
||||
.run(&["branch", "-m", &branch, &new_name])
|
||||
.await?;
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.boxed()
|
||||
}
|
||||
|
||||
fn blame(&self, path: RepoPath, content: Rope) -> BoxFuture<'_, Result<crate::blame::Blame>> {
|
||||
let working_directory = self.working_directory();
|
||||
let git_binary_path = self.git_binary_path.clone();
|
||||
|
||||
Reference in New Issue
Block a user