Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions assets/keymaps/default-linux.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions assets/keymaps/default-macos.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions assets/keymaps/default-windows.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions crates/fs/src/fake_git_repo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,7 @@ impl GitRepository for FakeGitRepository {
&self,
_branch: String,
_remote: String,
_rebase: bool,
_askpass: AskPassDelegate,
_env: Arc<HashMap<String, String>>,
_cx: AsyncApp,
Expand Down
2 changes: 2 additions & 0 deletions crates/git/src/git.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 9 additions & 1 deletion crates/git/src/repository.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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())
Expand Down
3 changes: 2 additions & 1 deletion crates/git_ui/src/git_panel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -2246,6 +2246,7 @@ impl GitPanel {
repo.pull(
branch.name().to_owned().into(),
remote.name.clone(),
rebase,
askpass,
cx,
)
Expand Down
11 changes: 10 additions & 1 deletion crates/git_ui/src/git_ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
});
}
Expand Down Expand Up @@ -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())
Expand Down
91 changes: 49 additions & 42 deletions crates/project/src/git_store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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??;

Expand Down Expand Up @@ -4226,57 +4227,63 @@ impl Repository {
&mut self,
branch: SharedString,
remote: SharedString,
rebase: bool,
askpass: AskPassDelegate,
_cx: &mut App,
) -> oneshot::Receiver<Result<RemoteCommandOutput>> {
let askpass_delegates = self.askpass_delegates.clone();
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(
Expand Down
1 change: 1 addition & 0 deletions crates/proto/proto/git.proto
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ message Pull {
string remote_name = 4;
string branch_name = 5;
uint64 askpass_id = 6;
bool rebase = 7;
}

message RemoteMessageResponse {
Expand Down
1 change: 1 addition & 0 deletions docs/src/git.md
Original file line number Diff line number Diff line change
Expand Up @@ -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} |
Expand Down
Loading