diff --git a/crates/collab/src/tests/test_server.rs b/crates/collab/src/tests/test_server.rs index 0f5c86fdfd332b92a303988dcf125a34f4867d8c..1f0204c1d57f8479319d1cf77ae3e95fda86f2ba 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 3de3e34e583be45ffc379c6a8876923147bf78e2..6f2235e88a62be37f0aaadceea042c45dd2133be 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 287123cbfc3cf8f1a2813786935c50585a1e29db..2635c11f61172960bd6a5ce231c280a64f21c35f 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 5b8d5ba4f6a96540072dcfed36c5f75cf14828c2..311066c121a7c6e8f0acc933aa7dbabd2f154fd1 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 83eb11f4728c6ed96e60b1cf79ae3f4c894e1b5a..17b5adfc4aa9621ac4638f873c30e62ab6244107 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 a82d27b6d015bef97b50983e05f3e2096a1ef8c7..8be2db69e5be251f823c42c898b02fbd4139d20b 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 fb37b0faee9aa41fc627d4b3e215b4b064fb5bcd..f9b45a0d98282edee3013b4db4550bb8eea8e004 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 c279d3d89f8825be83fb6f0ea79c5b0591869948..452a436e79c1ba93f0b6a64e12d3a07a0f751fb8 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 6c514bf56fb934b836070d073ef1b6371fffdb1b..d40e5002e9fefe7361b7da51aa08991f7f25f925 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 f93f8e00404d53f06425b2ffe4fe18136f19330f..6ac14a6dc88f45832ed41d54f66b34f7dc853f24 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 7e1ddbd2edb3f309ea9eeb3ddd3379245ab991ca..559973412514b9bc13bdeeac2ac884e5c109f278 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 c309db06c82e672d2799de45a8e0d9f3f3136476..10f09234add018330d984ee8f4c501d0829d5d3a 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 34f05f8f0bbf3206e260478cc7431a0c07a598cd..4ff55f4a1d9958bed60addea34fede7306afddfa 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 8e1ac87705fbba1eee64c1806a9b169aed4767fc..b9c535fa603b763decc12f3ef3bfd94b0eb3e279 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 83f425ce87f724c63dd19e9a3d7321d84333acba..58c4d54b9b2de02bd6c00e278020c0494a14a1de 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, ) });