From 5cc3b3a04fbba91c661373d2866a740ef0ea5aaa Mon Sep 17 00:00:00 2001 From: Agus Zubiaga Date: Wed, 17 Dec 2025 23:00:30 -0300 Subject: [PATCH] wait for workspace window to show --- crates/git_ui/src/clone.rs | 24 ++++++++++++----- crates/git_ui/src/git_panel.rs | 2 +- crates/zed/src/main.rs | 42 ++++++++++++++++++++++------- crates/zed/src/zed/open_listener.rs | 6 +++-- 4 files changed, 56 insertions(+), 18 deletions(-) diff --git a/crates/git_ui/src/clone.rs b/crates/git_ui/src/clone.rs index f8e65f477930bee451e3323924be90b27e220bb0..a6767d33304d3f20b7a5e78340f62c89ebe3ae58 100644 --- a/crates/git_ui/src/clone.rs +++ b/crates/git_ui/src/clone.rs @@ -1,12 +1,12 @@ use gpui::{App, Context, WeakEntity, Window}; use notifications::status_toast::{StatusToast, ToastIcon}; use std::sync::Arc; -use ui::{Color, IconName}; +use ui::{Color, IconName, SharedString}; use util::ResultExt; use workspace::{self, Workspace}; pub fn clone_and_open( - repo_url: String, + repo_url: SharedString, workspace: WeakEntity, window: &mut Window, cx: &mut App, @@ -57,8 +57,14 @@ pub fn clone_and_open( return None; } - let prompt_answer = cx - .update(|window, cx| { + let has_worktrees = workspace + .read_with(cx, |workspace, cx| { + workspace.project().read(cx).worktrees(cx).next().is_some() + }) + .ok()?; + + let prompt_answer = if has_worktrees { + cx.update(|window, cx| { window.prompt( gpui::PromptLevel::Info, &format!("Git Clone: {}", repo_name), @@ -67,11 +73,17 @@ pub fn clone_and_open( cx, ) }) - .ok()?; + .ok()? + .await + .ok()? + } else { + // Don't ask if project is empty + 0 + }; destination_dir.push(&repo_name); - match prompt_answer.await.ok()? { + match prompt_answer { 0 => { workspace .update_in(cx, |workspace, window, cx| { diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index d0bb4d2f22e05379c3770180bddad47deebe59ea..5b15b6e0db67bfe80b5d48547760709dc6695e5d 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -2851,7 +2851,7 @@ impl GitPanel { let workspace = self.workspace.clone(); crate::clone::clone_and_open( - repo, + repo.into(), workspace, window, cx, diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index b9f368bb09cba81802c8ee2c3d6f0d14bb71fd9e..ca7138613e0e700ff4a702086263cf6a3d372641 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -35,10 +35,12 @@ use release_channel::{AppCommitSha, AppVersion, ReleaseChannel}; use session::{AppSession, Session}; use settings::{BaseKeymap, Settings, SettingsStore, watch_config_file}; use std::{ + cell::RefCell, env, io::{self, IsTerminal}, path::{Path, PathBuf}, process, + rc::Rc, sync::{Arc, OnceLock}, time::Instant, }; @@ -897,15 +899,37 @@ fn handle_open_request(request: OpenRequest, app_state: Arc, cx: &mut } OpenRequestKind::GitClone { repo_url } => { workspace::with_active_or_new_workspace(cx, |_workspace, window, cx| { - clone_and_open( - repo_url, - cx.entity().downgrade(), - window, - cx, - Arc::new(|workspace: &mut workspace::Workspace, window, cx| { - workspace.focus_panel::(window, cx); - }), - ); + if window.is_window_active() { + clone_and_open( + repo_url, + cx.weak_entity(), + window, + cx, + Arc::new(|workspace: &mut workspace::Workspace, window, cx| { + workspace.focus_panel::(window, cx); + }), + ); + return; + } + + let subscription = Rc::new(RefCell::new(None)); + subscription.replace(Some(cx.observe_in(&cx.entity(), window, { + let subscription = subscription.clone(); + let repo_url = repo_url.clone(); + move |_, workspace_entity, window, cx| { + if window.is_window_active() && subscription.take().is_some() { + clone_and_open( + repo_url.clone(), + workspace_entity.downgrade(), + window, + cx, + Arc::new(|workspace: &mut workspace::Workspace, window, cx| { + workspace.focus_panel::(window, cx); + }), + ); + } + } + }))); }); } OpenRequestKind::GitCommit { sha } => { diff --git a/crates/zed/src/zed/open_listener.rs b/crates/zed/src/zed/open_listener.rs index a9f7b8208cf54874ce15fdcdf5a54a96731b3ef6..842f98520133c70f711d84d3f490bec1ec59e16f 100644 --- a/crates/zed/src/zed/open_listener.rs +++ b/crates/zed/src/zed/open_listener.rs @@ -25,6 +25,7 @@ use std::path::{Path, PathBuf}; use std::sync::Arc; use std::thread; use std::time::Duration; +use ui::SharedString; use util::ResultExt; use util::paths::PathWithPosition; use workspace::PathList; @@ -59,7 +60,7 @@ pub enum OpenRequestKind { setting_path: Option, }, GitClone { - repo_url: String, + repo_url: SharedString, }, GitCommit { sha: String, @@ -160,7 +161,8 @@ impl OpenRequest { .find_map(|(key, value)| (key == "repo").then_some(value)) .filter(|s| !s.is_empty()) .context("invalid git clone url: missing repo query parameter")? - .to_string(); + .to_string() + .into(); self.kind = Some(OpenRequestKind::GitClone { repo_url });