Add toast for git checkout failure

This commit is contained in:
Piotr Osiewicz 2023-06-27 20:12:20 +02:00
parent 54fad5969f
commit c84f3b3bfc
2 changed files with 34 additions and 19 deletions

View file

@ -1,9 +1,10 @@
use fuzzy::{StringMatch, StringMatchCandidate}; use fuzzy::{StringMatch, StringMatchCandidate};
use gpui::{elements::*, AppContext, ModelHandle, MouseState, Task, ViewContext}; use gpui::{elements::*, AppContext, ModelHandle, MouseState, Task, ViewContext, ViewHandle};
use picker::{Picker, PickerDelegate, PickerEvent}; use picker::{Picker, PickerDelegate, PickerEvent};
use project::Project; use project::Project;
use std::{cmp::Ordering, sync::Arc}; use std::{cmp::Ordering, sync::Arc};
use util::{ResultExt, TryFutureExt}; use util::{ResultExt, TryFutureExt};
use workspace::{Toast, Workspace};
pub fn init(cx: &mut AppContext) { pub fn init(cx: &mut AppContext) {
Picker::<BranchListDelegate>::init(cx); Picker::<BranchListDelegate>::init(cx);
@ -12,13 +13,13 @@ pub fn init(cx: &mut AppContext) {
pub type BranchList = Picker<BranchListDelegate>; pub type BranchList = Picker<BranchListDelegate>;
pub fn build_branch_list( pub fn build_branch_list(
project: ModelHandle<Project>, workspace: ViewHandle<Workspace>,
cx: &mut ViewContext<BranchList>, cx: &mut ViewContext<BranchList>,
) -> BranchList { ) -> BranchList {
Picker::new( Picker::new(
BranchListDelegate { BranchListDelegate {
matches: vec![], matches: vec![],
project, workspace,
selected_index: 0, selected_index: 0,
last_query: String::default(), last_query: String::default(),
}, },
@ -29,7 +30,7 @@ pub fn build_branch_list(
pub struct BranchListDelegate { pub struct BranchListDelegate {
matches: Vec<StringMatch>, matches: Vec<StringMatch>,
project: ModelHandle<Project>, workspace: ViewHandle<Workspace>,
selected_index: usize, selected_index: usize,
last_query: String, last_query: String,
} }
@ -56,7 +57,7 @@ impl PickerDelegate for BranchListDelegate {
let candidates = picker let candidates = picker
.read_with(&mut cx, |view, cx| { .read_with(&mut cx, |view, cx| {
let delegate = view.delegate(); let delegate = view.delegate();
let project = delegate.project.read(&cx); let project = delegate.workspace.read(cx).project().read(&cx);
let mut cwd = project let mut cwd = project
.visible_worktrees(cx) .visible_worktrees(cx)
.next() .next()
@ -136,7 +137,7 @@ impl PickerDelegate for BranchListDelegate {
fn confirm(&mut self, cx: &mut ViewContext<Picker<Self>>) { fn confirm(&mut self, cx: &mut ViewContext<Picker<Self>>) {
let current_pick = self.selected_index(); let current_pick = self.selected_index();
let current_pick = self.matches[current_pick].string.clone(); let current_pick = self.matches[current_pick].string.clone();
let project = self.project.read(cx); let project = self.workspace.read(cx).project().read(cx);
let mut cwd = project let mut cwd = project
.visible_worktrees(cx) .visible_worktrees(cx)
.next() .next()
@ -147,13 +148,25 @@ impl PickerDelegate for BranchListDelegate {
.path .path
.to_path_buf(); .to_path_buf();
cwd.push(".git"); cwd.push(".git");
project let status = project
.fs() .fs()
.open_repo(&cwd) .open_repo(&cwd)
.unwrap() .unwrap()
.lock() .lock()
.change_branch(&current_pick) .change_branch(&current_pick);
.log_err(); if let Err(err) = &status {
const GIT_CHECKOUT_FAILURE_ID: usize = 2048;
self.workspace.update(cx, |model, ctx| {
model.show_toast(
Toast::new(
GIT_CHECKOUT_FAILURE_ID,
format!("Failed to check out branch `{current_pick}`, error: `{err}`"),
),
ctx,
)
});
}
status.log_err();
cx.emit(PickerEvent::Dismiss); cx.emit(PickerEvent::Dismiss);
} }

View file

@ -381,18 +381,20 @@ impl CollabTitlebarItem {
} }
pub fn toggle_vcs_menu(&mut self, _: &ToggleVcsMenu, cx: &mut ViewContext<Self>) { pub fn toggle_vcs_menu(&mut self, _: &ToggleVcsMenu, cx: &mut ViewContext<Self>) {
if self.branch_popover.take().is_none() { if self.branch_popover.take().is_none() {
let view = cx.add_view(|cx| build_branch_list(self.project.clone(), cx)); if let Some(workspace) = self.workspace.upgrade(cx) {
cx.subscribe(&view, |this, _, event, cx| { let view = cx.add_view(|cx| build_branch_list(workspace, cx));
match event { cx.subscribe(&view, |this, _, event, cx| {
PickerEvent::Dismiss => { match event {
this.contacts_popover = None; PickerEvent::Dismiss => {
this.contacts_popover = None;
}
} }
}
cx.notify(); cx.notify();
}) })
.detach(); .detach();
self.branch_popover = Some(view); self.branch_popover = Some(view);
}
} }
cx.notify(); cx.notify();