Compare commits

...

8 Commits

Author SHA1 Message Date
Cole Miller
055b1433b1 wip 2025-11-04 11:38:55 -05:00
Sathiyaraman M
59bdf1de5d Fix clippy issues 2025-11-04 13:09:15 +05:30
Sathiyaraman M
4334ab6ac2 Address PR comment 2025-10-28 10:25:13 +05:30
Sathiyaraman M
106c8b8c2c Update Git Docs 2025-10-24 22:16:41 +05:30
Sathiyaraman M
2044ecb9ac Update keybindings for pull-rebase 2025-10-24 20:50:12 +05:30
Sathiyaraman M
3a3d0832e2 Include Pull Rebase in Git Panel 2025-10-24 20:42:04 +05:30
Sathiyaraman M
b7ae52d124 Support git::PullRebase action 2025-10-24 20:30:44 +05:30
Sathiyaraman M
62faf10793 Add rebase for Git-Pull in proto 2025-10-24 20:28:23 +05:30
12 changed files with 80 additions and 47 deletions

View File

@@ -933,6 +933,7 @@
"ctrl-g ctrl-g": "git::Fetch",
"ctrl-g up": "git::Push",
"ctrl-g down": "git::Pull",
"ctrl-g shift-down": "git::PullRebase",
"ctrl-g shift-up": "git::ForcePush",
"ctrl-g d": "git::Diff",
"ctrl-g backspace": "git::RestoreTrackedFiles",

View File

@@ -1026,6 +1026,7 @@
"ctrl-g ctrl-g": "git::Fetch",
"ctrl-g up": "git::Push",
"ctrl-g down": "git::Pull",
"ctrl-g shift-down": "git::PullRebase",
"ctrl-g shift-up": "git::ForcePush",
"ctrl-g d": "git::Diff",
"ctrl-g backspace": "git::RestoreTrackedFiles",

View File

@@ -943,6 +943,7 @@
"ctrl-g ctrl-g": "git::Fetch",
"ctrl-g up": "git::Push",
"ctrl-g down": "git::Pull",
"ctrl-g shift-down": "git::PullRebase",
"ctrl-g shift-up": "git::ForcePush",
"ctrl-g d": "git::Diff",
"ctrl-g backspace": "git::RestoreTrackedFiles",

View File

@@ -530,6 +530,7 @@ impl GitRepository for FakeGitRepository {
&self,
_branch: String,
_remote: String,
_rebase: bool,
_askpass: AskPassDelegate,
_env: Arc<HashMap<String, String>>,
_cx: AsyncApp,

View File

@@ -72,6 +72,8 @@ actions!(
ForcePush,
/// Pulls changes from the remote repository.
Pull,
/// Pulls changes from the remote repository with rebase.
PullRebase,
/// Fetches changes from the remote repository.
Fetch,
/// Fetches changes from a specific remote.

View File

@@ -480,6 +480,7 @@ pub trait GitRepository: Send + Sync {
&self,
branch_name: String,
upstream_name: String,
rebase: bool,
askpass: AskPassDelegate,
env: Arc<HashMap<String, String>>,
// This method takes an AsyncApp to ensure it's invoked on the main thread,
@@ -1578,6 +1579,7 @@ impl GitRepository for RealGitRepository {
&self,
branch_name: String,
remote_name: String,
rebase: bool,
ask_pass: AskPassDelegate,
env: Arc<HashMap<String, String>>,
cx: AsyncApp,
@@ -1591,7 +1593,13 @@ impl GitRepository for RealGitRepository {
command
.envs(env.iter())
.current_dir(&working_directory?)
.args(["pull"])
.arg("pull");
if rebase {
command.arg("--rebase");
}
command
.arg(remote_name)
.arg(branch_name)
.stdout(smol::process::Stdio::piped())

View File

@@ -2211,7 +2211,7 @@ impl GitPanel {
.detach();
}
pub(crate) fn pull(&mut self, window: &mut Window, cx: &mut Context<Self>) {
pub(crate) fn pull(&mut self, rebase: bool, window: &mut Window, cx: &mut Context<Self>) {
if !self.can_push_and_pull(cx) {
return;
}
@@ -2246,6 +2246,7 @@ impl GitPanel {
repo.pull(
branch.name().to_owned().into(),
remote.name.clone(),
rebase,
askpass,
cx,
)

View File

@@ -124,7 +124,15 @@ pub fn init(cx: &mut App) {
return;
};
panel.update(cx, |panel, cx| {
panel.pull(window, cx);
panel.pull(false, window, cx);
});
});
workspace.register_action(|workspace, _: &git::PullRebase, window, cx| {
let Some(panel) = workspace.panel::<git_panel::GitPanel>(cx) else {
return;
};
panel.update(cx, |panel, cx| {
panel.pull(true, window, cx);
});
});
}
@@ -595,6 +603,7 @@ mod remote_button {
.action("Fetch", git::Fetch.boxed_clone())
.action("Fetch From", git::FetchFrom.boxed_clone())
.action("Pull", git::Pull.boxed_clone())
.action("Pull (Rebase)", git::PullRebase.boxed_clone())
.separator()
.action("Push", git::Push.boxed_clone())
.action("Push To", git::PushTo.boxed_clone())

View File

@@ -5,9 +5,9 @@ use collections::HashMap;
use futures::{AsyncBufReadExt, StreamExt as _};
use gpui::{App, AsyncApp, SharedString, Task};
use http_client::github::{AssetKind, GitHubLspBinaryVersion, latest_github_release};
use languaGe::{ContextProvider, LspAdapter, LspAdapterDelegate};
use language::language_settings::language_settings;
use language::{ContextLocation, LanguageToolchainStore, LspInstaller};
use language::{ContextProvider, LspAdapter, LspAdapterDelegate};
use language::{LanguageName, ManifestName, ManifestProvider, ManifestQuery};
use language::{Toolchain, ToolchainList, ToolchainLister, ToolchainMetadata};
use lsp::LanguageServerBinary;

View File

@@ -1716,10 +1716,11 @@ impl GitStore {
let branch_name = envelope.payload.branch_name.into();
let remote_name = envelope.payload.remote_name.into();
let rebase = envelope.payload.rebase;
let remote_message = repository_handle
.update(&mut cx, |repository_handle, cx| {
repository_handle.pull(branch_name, remote_name, askpass, cx)
repository_handle.pull(branch_name, remote_name, rebase, askpass, cx)
})?
.await??;
@@ -4226,6 +4227,7 @@ impl Repository {
&mut self,
branch: SharedString,
remote: SharedString,
rebase: bool,
askpass: AskPassDelegate,
_cx: &mut App,
) -> oneshot::Receiver<Result<RemoteCommandOutput>> {
@@ -4233,50 +4235,55 @@ impl Repository {
let askpass_id = util::post_inc(&mut self.latest_askpass_id);
let id = self.id;
self.send_job(
Some(format!("git pull {} {}", remote, branch).into()),
move |git_repo, cx| async move {
match git_repo {
RepositoryState::Local {
backend,
environment,
..
} => {
backend
.pull(
branch.to_string(),
remote.to_string(),
askpass,
environment.clone(),
cx,
)
.await
}
RepositoryState::Remote { project_id, client } => {
askpass_delegates.lock().insert(askpass_id, askpass);
let _defer = util::defer(|| {
let askpass_delegate = askpass_delegates.lock().remove(&askpass_id);
debug_assert!(askpass_delegate.is_some());
});
let response = client
.request(proto::Pull {
project_id: project_id.0,
repository_id: id.to_proto(),
askpass_id,
branch_name: branch.to_string(),
remote_name: remote.to_string(),
})
.await
.context("sending pull request")?;
let status = if rebase {
Some(format!("git pull --rebase {} {}", remote, branch).into())
} else {
Some(format!("git pull {} {}", remote, branch).into())
};
Ok(RemoteCommandOutput {
stdout: response.stdout,
stderr: response.stderr,
})
}
self.send_job(status, move |git_repo, cx| async move {
match git_repo {
RepositoryState::Local {
backend,
environment,
..
} => {
backend
.pull(
branch.to_string(),
remote.to_string(),
rebase,
askpass,
environment.clone(),
cx,
)
.await
}
},
)
RepositoryState::Remote { project_id, client } => {
askpass_delegates.lock().insert(askpass_id, askpass);
let _defer = util::defer(|| {
let askpass_delegate = askpass_delegates.lock().remove(&askpass_id);
debug_assert!(askpass_delegate.is_some());
});
let response = client
.request(proto::Pull {
project_id: project_id.0,
repository_id: id.to_proto(),
askpass_id,
rebase,
branch_name: branch.to_string(),
remote_name: remote.to_string(),
})
.await
.context("sending pull request")?;
Ok(RemoteCommandOutput {
stdout: response.stdout,
stderr: response.stderr,
})
}
}
})
}
fn spawn_set_index_text_job(

View File

@@ -405,6 +405,7 @@ message Pull {
string remote_name = 4;
string branch_name = 5;
uint64 askpass_id = 6;
bool rebase = 7;
}
message RemoteMessageResponse {

View File

@@ -179,6 +179,7 @@ When viewing files with changes, Zed displays diff hunks that can be expanded or
| {#action git::Push} | {#kb git::Push} |
| {#action git::ForcePush} | {#kb git::ForcePush} |
| {#action git::Pull} | {#kb git::Pull} |
| {#action git::PullRebase} | {#kb git::PullRebase} |
| {#action git::Fetch} | {#kb git::Fetch} |
| {#action git::Diff} | {#kb git::Diff} |
| {#action git::Restore} | {#kb git::Restore} |