From a658e1d3b0e24551e50973dc87363130025cae8e Mon Sep 17 00:00:00 2001 From: Bennet Bo Fenner Date: Thu, 23 Apr 2026 00:30:05 +0200 Subject: [PATCH] git_ui: Fix double borrow when showing worktree error message (#54555) Fixes ZED-6Q0 Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [ ] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Closes #54544 Release Notes: - Fixed a crash that could occur when git worktree creating fails --- crates/git_ui/src/git_panel.rs | 38 ++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index 23d9c728c058f1b4fb1aef1146089a73c3f0bb1f..8f66350a30603899e3a2c72763c43de30f0d6fa7 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -6572,25 +6572,27 @@ pub(crate) fn show_error_toast( .is_some() { // Hide the cancelled by user message } else { - workspace.update(cx, |workspace, cx| { - let workspace_weak = cx.weak_entity(); - let toast = StatusToast::new(format!("git {} failed", action), cx, |this, _cx| { - this.icon( - Icon::new(IconName::XCircle) - .size(IconSize::Small) - .color(Color::Error), - ) - .action("View Log", move |window, cx| { - let message = message.clone(); - let action = action.clone(); - workspace_weak - .update(cx, move |workspace, cx| { - open_output(action, workspace, &message, window, cx) - }) - .ok(); - }) + cx.defer(move |cx| { + workspace.update(cx, |workspace, cx| { + let workspace_weak = cx.weak_entity(); + let toast = StatusToast::new(format!("git {} failed", action), cx, |this, _cx| { + this.icon( + Icon::new(IconName::XCircle) + .size(IconSize::Small) + .color(Color::Error), + ) + .action("View Log", move |window, cx| { + let message = message.clone(); + let action = action.clone(); + workspace_weak + .update(cx, move |workspace, cx| { + open_output(action, workspace, &message, window, cx) + }) + .ok(); + }) + }); + workspace.toggle_status_toast(toast, cx) }); - workspace.toggle_status_toast(toast, cx) }); } }