From 205c758e4e5d8c5ef67794023ce61d6ef663d2b1 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 16 Jun 2023 09:42:13 -0700 Subject: [PATCH] Wait for ignored directory to be expanded in descendant entries test --- crates/project/src/project.rs | 10 ++-------- crates/project/src/worktree.rs | 13 ++++++++----- crates/project/src/worktree_tests.rs | 11 +++++++++++ 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 79f3e743bd845b35dd6d64d8095394af0a297862..a360e5dd7256273905b890b5107a6ee43f3f12af 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -5413,10 +5413,7 @@ impl Project { if self.is_local() { let worktree = self.worktree_for_id(worktree_id, cx)?; worktree.update(cx, |worktree, cx| { - worktree - .as_local_mut() - .unwrap() - .mark_entry_expanded(entry_id, cx); + worktree.as_local_mut().unwrap().expand_dir(entry_id, cx); }); } else if let Some(project_id) = self.remote_id() { cx.background() @@ -5742,10 +5739,7 @@ impl Project { .read_with(&cx, |this, cx| this.worktree_for_entry(entry_id, cx)) .ok_or_else(|| anyhow!("invalid request"))?; worktree.update(&mut cx, |worktree, cx| { - worktree - .as_local_mut() - .unwrap() - .mark_entry_expanded(entry_id, cx) + worktree.as_local_mut().unwrap().expand_dir(entry_id, cx) }); Ok(proto::Ack {}) } diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 4e5a828165159e1a984693c63f91ce2ed3d774ad..04804615563ede969ee813f19c9e038a7c4f54de 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -91,6 +91,7 @@ enum ScanRequest { }, ExpandDir { entry_id: ProjectEntryId, + done: barrier::Sender, }, } @@ -1149,14 +1150,16 @@ impl LocalWorktree { })) } - pub fn mark_entry_expanded( + pub fn expand_dir( &mut self, entry_id: ProjectEntryId, _cx: &mut ModelContext, - ) { + ) -> barrier::Receiver { + let (tx, rx) = barrier::channel(); self.scan_requests_tx - .try_send(ScanRequest::ExpandDir { entry_id }) + .try_send(ScanRequest::ExpandDir { entry_id, done: tx }) .ok(); + rx } fn refresh_entry( @@ -2963,7 +2966,7 @@ impl BackgroundScanner { self.reload_entries_for_paths(paths, None).await; self.send_status_update(false, Some(done)) } - ScanRequest::ExpandDir { entry_id } => { + ScanRequest::ExpandDir { entry_id, done } => { let path = { let mut state = self.state.lock(); state.expanded_dirs.insert(entry_id); @@ -2978,7 +2981,7 @@ impl BackgroundScanner { .await; if let Some(job) = scan_job_rx.next().await { self.scan_dir(&job).await.log_err(); - self.send_status_update(false, None); + self.send_status_update(false, Some(done)); } } true diff --git a/crates/project/src/worktree_tests.rs b/crates/project/src/worktree_tests.rs index 6468ac9a166052ffb11038e80f3c9ee0076a6782..00697d04a23fa03eab9535debb887fe084408234 100644 --- a/crates/project/src/worktree_tests.rs +++ b/crates/project/src/worktree_tests.rs @@ -8,6 +8,7 @@ use fs::{repository::GitFileStatus, FakeFs, Fs, RealFs, RemoveOptions}; use git::GITIGNORE; use gpui::{executor::Deterministic, ModelContext, Task, TestAppContext}; use parking_lot::Mutex; +use postage::stream::Stream; use pretty_assertions::assert_eq; use rand::prelude::*; use serde_json::json; @@ -154,7 +155,17 @@ async fn test_descendent_entries(cx: &mut TestAppContext) { .collect::>(), vec![Path::new("g"), Path::new("g/h"),] ); + }); + // Expand gitignored directory. + tree.update(cx, |tree, cx| { + let tree = tree.as_local_mut().unwrap(); + tree.expand_dir(tree.entry_for_path("i/j").unwrap().id, cx) + }) + .recv() + .await; + + tree.read_with(cx, |tree, _| { assert_eq!( tree.descendent_entries(false, false, Path::new("i")) .map(|entry| entry.path.as_ref())