diff --git a/crates/collab/src/tests/test_server.rs b/crates/collab/src/tests/test_server.rs index 0f5c86fdfd3..1f0204c1d57 100644 --- a/crates/collab/src/tests/test_server.rs +++ b/crates/collab/src/tests/test_server.rs @@ -862,7 +862,10 @@ impl TestClient { self.app_state.languages.clone(), self.app_state.fs.clone(), None, - init_worktree_trust, + project::LocalProjectFlags { + init_worktree_trust, + ..Default::default() + }, cx, ) }) diff --git a/crates/component_preview/src/component_preview_example.rs b/crates/component_preview/src/component_preview_example.rs index 3de3e34e583..6f2235e88a6 100644 --- a/crates/component_preview/src/component_preview_example.rs +++ b/crates/component_preview/src/component_preview_example.rs @@ -92,7 +92,10 @@ pub fn run_component_preview() { app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ); diff --git a/crates/edit_prediction_cli/src/load_project.rs b/crates/edit_prediction_cli/src/load_project.rs index 287123cbfc3..2635c11f611 100644 --- a/crates/edit_prediction_cli/src/load_project.rs +++ b/crates/edit_prediction_cli/src/load_project.rs @@ -211,7 +211,10 @@ async fn setup_project( app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + watch_global_configs: false, + }, cx, ) }); @@ -229,10 +232,16 @@ async fn setup_project( let buffer_store = project.read_with(cx, |project, _| project.buffer_store().clone()); cx.subscribe(&buffer_store, { - let project = project.clone(); + let project = project.downgrade(); + let ep_store = ep_store.downgrade(); move |_, event, cx| match event { BufferStoreEvent::BufferAdded(buffer) => { - ep_store.update(cx, |store, cx| store.register_buffer(&buffer, &project, cx)); + let Some(project) = project.upgrade() else { + return; + }; + ep_store + .update(cx, |store, cx| store.register_buffer(&buffer, &project, cx)) + .ok(); } _ => {} } diff --git a/crates/edit_prediction_cli/src/main.rs b/crates/edit_prediction_cli/src/main.rs index 5b8d5ba4f6a..311066c121a 100644 --- a/crates/edit_prediction_cli/src/main.rs +++ b/crates/edit_prediction_cli/src/main.rs @@ -22,7 +22,7 @@ use collections::HashSet; use edit_prediction::EditPredictionStore; use futures::channel::mpsc; use futures::{SinkExt as _, StreamExt as _}; -use gpui::{AppContext as _, Application, BackgroundExecutor}; +use gpui::{AppContext as _, Application, BackgroundExecutor, Task}; use zeta_prompt::ZetaVersion; use reqwest_client::ReqwestClient; @@ -674,23 +674,35 @@ fn main() { } } - if let Some(state) = - repo_examples.first().and_then(|e| e.state.as_ref()) - { + let repo_url = &repo_examples.first().unwrap().spec.repository_url; + let project = repo_examples + .iter() + .find_map(|e| e.state.as_ref().map(|s| s.project.clone())) + .or_else(|| app_state.project_cache.get(repo_url)); + + if let Some(project) = project { let mut cx = cx.clone(); + + let shutdown_task: Task<()> = + project.update(&mut cx, |project, cx| { + let lsp_store = project.lsp_store(); + lsp_store.update(cx, |lsp_store, cx| { + lsp_store.shutdown_all_language_servers(cx) + }) + }); + + shutdown_task.await; + if let Some(ep_store) = cx.update(|cx| EditPredictionStore::try_global(cx)) { - let project = state.project.clone(); ep_store.update(&mut cx, |store, _| { store.remove_project(&project); }); } } - app_state - .project_cache - .remove(&repo_examples.first().unwrap().spec.repository_url); + app_state.project_cache.remove(repo_url); for example in &mut repo_examples { example.state.take(); } diff --git a/crates/eval/src/instance.rs b/crates/eval/src/instance.rs index 83eb11f4728..17b5adfc4aa 100644 --- a/crates/eval/src/instance.rs +++ b/crates/eval/src/instance.rs @@ -202,7 +202,10 @@ impl ExampleInstance { app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ); diff --git a/crates/inspector_ui/src/inspector.rs b/crates/inspector_ui/src/inspector.rs index a82d27b6d01..8be2db69e5b 100644 --- a/crates/inspector_ui/src/inspector.rs +++ b/crates/inspector_ui/src/inspector.rs @@ -33,7 +33,10 @@ pub fn init(app_state: Arc, cx: &mut App) { app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ); diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index fb37b0faee9..f9b45a0d982 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -11036,6 +11036,10 @@ impl LspStore { } pub fn stop_all_language_servers(&mut self, cx: &mut Context) { + self.shutdown_all_language_servers(cx).detach(); + } + + pub fn shutdown_all_language_servers(&mut self, cx: &mut Context) -> Task<()> { if let Some((client, project_id)) = self.upstream_client() { let request = client.request(proto::StopLanguageServers { project_id, @@ -11043,10 +11047,12 @@ impl LspStore { also_servers: Vec::new(), all: true, }); - cx.background_spawn(request).detach_and_log_err(cx); + cx.background_spawn(async move { + request.await.ok(); + }) } else { let Some(local) = self.as_local_mut() else { - return; + return Task::ready(()); }; let language_servers_to_stop = local .language_server_ids @@ -11061,7 +11067,6 @@ impl LspStore { cx.background_spawn(async move { futures::future::join_all(tasks).await; }) - .detach(); } } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index c279d3d89f8..452a436e79c 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -164,6 +164,21 @@ pub use lsp_store::{ pub use toolchain_store::{ToolchainStore, Toolchains}; const MAX_PROJECT_SEARCH_HISTORY_SIZE: usize = 500; +#[derive(Clone, Copy, Debug)] +pub struct LocalProjectFlags { + pub init_worktree_trust: bool, + pub watch_global_configs: bool, +} + +impl Default for LocalProjectFlags { + fn default() -> Self { + Self { + init_worktree_trust: true, + watch_global_configs: true, + } + } +} + pub trait ProjectItem: 'static { fn try_open( project: &Entity, @@ -1088,7 +1103,7 @@ impl Project { languages: Arc, fs: Arc, env: Option>, - init_worktree_trust: bool, + flags: LocalProjectFlags, cx: &mut App, ) -> Entity { cx.new(|cx: &mut Context| { @@ -1097,7 +1112,7 @@ impl Project { .detach(); let snippets = SnippetProvider::new(fs.clone(), BTreeSet::from_iter([]), cx); let worktree_store = cx.new(|_| WorktreeStore::local(false, fs.clone())); - if init_worktree_trust { + if flags.init_worktree_trust { trusted_worktrees::track_worktree_trust( worktree_store.clone(), None, @@ -1185,6 +1200,7 @@ impl Project { fs.clone(), worktree_store.clone(), task_store.clone(), + flags.watch_global_configs, cx, ) }); @@ -1899,7 +1915,10 @@ impl Project { Arc::new(languages), fs, None, - false, + LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ) }); @@ -1956,7 +1975,10 @@ impl Project { Arc::new(languages), fs, None, - init_worktree_trust, + LocalProjectFlags { + init_worktree_trust, + ..Default::default() + }, cx, ) }); diff --git a/crates/project/src/project_settings.rs b/crates/project/src/project_settings.rs index 6c514bf56fb..d40e5002e9f 100644 --- a/crates/project/src/project_settings.rs +++ b/crates/project/src/project_settings.rs @@ -691,6 +691,7 @@ impl SettingsObserver { fs: Arc, worktree_store: Entity, task_store: Entity, + watch_global_configs: bool, cx: &mut Context, ) -> Self { cx.subscribe(&worktree_store, Self::on_worktree_store_event) @@ -787,16 +788,24 @@ impl SettingsObserver { _user_settings_watcher: None, _editorconfig_watcher: Some(_editorconfig_watcher), project_id: REMOTE_SERVER_PROJECT_ID, - _global_task_config_watcher: Self::subscribe_to_global_task_file_changes( - fs.clone(), - paths::tasks_file().clone(), - cx, - ), - _global_debug_config_watcher: Self::subscribe_to_global_debug_scenarios_changes( - fs.clone(), - paths::debug_scenarios_file().clone(), - cx, - ), + _global_task_config_watcher: if watch_global_configs { + Self::subscribe_to_global_task_file_changes( + fs.clone(), + paths::tasks_file().clone(), + cx, + ) + } else { + Task::ready(()) + }, + _global_debug_config_watcher: if watch_global_configs { + Self::subscribe_to_global_debug_scenarios_changes( + fs.clone(), + paths::debug_scenarios_file().clone(), + cx, + ) + } else { + Task::ready(()) + }, } } diff --git a/crates/project_benchmarks/src/main.rs b/crates/project_benchmarks/src/main.rs index f93f8e00404..6ac14a6dc88 100644 --- a/crates/project_benchmarks/src/main.rs +++ b/crates/project_benchmarks/src/main.rs @@ -160,7 +160,10 @@ fn main() -> Result<(), anyhow::Error> { registry, fs, Some(Default::default()), - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, )) }; diff --git a/crates/recent_projects/src/remote_connections.rs b/crates/recent_projects/src/remote_connections.rs index 7e1ddbd2edb..55997341251 100644 --- a/crates/recent_projects/src/remote_connections.rs +++ b/crates/recent_projects/src/remote_connections.rs @@ -659,7 +659,10 @@ pub async fn open_remote_project( app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ); cx.new(|cx| { diff --git a/crates/remote_server/src/headless_project.rs b/crates/remote_server/src/headless_project.rs index c309db06c82..10f09234add 100644 --- a/crates/remote_server/src/headless_project.rs +++ b/crates/remote_server/src/headless_project.rs @@ -195,6 +195,7 @@ impl HeadlessProject { fs.clone(), worktree_store.clone(), task_store.clone(), + true, cx, ); observer.shared(REMOTE_SERVER_PROJECT_ID, session.clone(), cx); diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 34f05f8f0bb..4ff55f4a1d9 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -1659,7 +1659,7 @@ impl Workspace { app_state.languages.clone(), app_state.fs.clone(), env, - true, + Default::default(), cx, ); diff --git a/crates/zed/src/visual_test_runner.rs b/crates/zed/src/visual_test_runner.rs index 8e1ac87705f..b9c535fa603 100644 --- a/crates/zed/src/visual_test_runner.rs +++ b/crates/zed/src/visual_test_runner.rs @@ -222,7 +222,10 @@ fn run_visual_tests(project_path: PathBuf, update_baseline: bool) -> Result<()> app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ) }); @@ -900,7 +903,10 @@ fn run_breakpoint_hover_visual_tests( app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ) }); @@ -1212,7 +1218,10 @@ import { AiPaneTabContext } from 'context'; app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ) }); @@ -1696,7 +1705,10 @@ fn run_subagent_visual_tests( app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ) }); @@ -2018,7 +2030,10 @@ fn run_agent_thread_view_test( app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ) }); diff --git a/crates/zed/src/zed/visual_tests.rs b/crates/zed/src/zed/visual_tests.rs index 83f425ce87f..58c4d54b9b2 100644 --- a/crates/zed/src/zed/visual_tests.rs +++ b/crates/zed/src/zed/visual_tests.rs @@ -82,7 +82,10 @@ pub async fn open_test_workspace( app_state.languages.clone(), app_state.fs.clone(), None, - false, + project::LocalProjectFlags { + init_worktree_trust: false, + ..Default::default() + }, cx, ) });