From c84f3b3bfc2a2434017ab23e3bcaeae98424623f Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 27 Jun 2023 20:12:20 +0200 Subject: [PATCH] Add toast for git checkout failure --- crates/collab_ui/src/branch_list.rs | 31 ++++++++++++++------ crates/collab_ui/src/collab_titlebar_item.rs | 22 +++++++------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 146e4c804113490779f30acd71747599772369a6..2558b24ae8b3d0bf5261145c761f96a65e8cd3e8 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -1,9 +1,10 @@ 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 project::Project; use std::{cmp::Ordering, sync::Arc}; use util::{ResultExt, TryFutureExt}; +use workspace::{Toast, Workspace}; pub fn init(cx: &mut AppContext) { Picker::::init(cx); @@ -12,13 +13,13 @@ pub fn init(cx: &mut AppContext) { pub type BranchList = Picker; pub fn build_branch_list( - project: ModelHandle, + workspace: ViewHandle, cx: &mut ViewContext, ) -> BranchList { Picker::new( BranchListDelegate { matches: vec![], - project, + workspace, selected_index: 0, last_query: String::default(), }, @@ -29,7 +30,7 @@ pub fn build_branch_list( pub struct BranchListDelegate { matches: Vec, - project: ModelHandle, + workspace: ViewHandle, selected_index: usize, last_query: String, } @@ -56,7 +57,7 @@ impl PickerDelegate for BranchListDelegate { let candidates = picker .read_with(&mut cx, |view, cx| { let delegate = view.delegate(); - let project = delegate.project.read(&cx); + let project = delegate.workspace.read(cx).project().read(&cx); let mut cwd = project .visible_worktrees(cx) .next() @@ -136,7 +137,7 @@ impl PickerDelegate for BranchListDelegate { fn confirm(&mut self, cx: &mut ViewContext>) { let current_pick = self.selected_index(); 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 .visible_worktrees(cx) .next() @@ -147,13 +148,25 @@ impl PickerDelegate for BranchListDelegate { .path .to_path_buf(); cwd.push(".git"); - project + let status = project .fs() .open_repo(&cwd) .unwrap() .lock() - .change_branch(¤t_pick) - .log_err(); + .change_branch(¤t_pick); + 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); } diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index e306aa20b358b8f1423d6940df74c24d3938b910..b38ac39798de0de3542df73f928f56a0836e1703 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -381,18 +381,20 @@ impl CollabTitlebarItem { } pub fn toggle_vcs_menu(&mut self, _: &ToggleVcsMenu, cx: &mut ViewContext) { if self.branch_popover.take().is_none() { - let view = cx.add_view(|cx| build_branch_list(self.project.clone(), cx)); - cx.subscribe(&view, |this, _, event, cx| { - match event { - PickerEvent::Dismiss => { - this.contacts_popover = None; + if let Some(workspace) = self.workspace.upgrade(cx) { + let view = cx.add_view(|cx| build_branch_list(workspace, cx)); + cx.subscribe(&view, |this, _, event, cx| { + match event { + PickerEvent::Dismiss => { + this.contacts_popover = None; + } } - } - cx.notify(); - }) - .detach(); - self.branch_popover = Some(view); + cx.notify(); + }) + .detach(); + self.branch_popover = Some(view); + } } cx.notify();