Fix the new test

Kirill Bulatov created

Change summary

crates/project/src/worktree.rs       | 47 ++++++++++++++++++++---------
crates/project/src/worktree_tests.rs |  7 +--
2 files changed, 35 insertions(+), 19 deletions(-)

Detailed changes

crates/project/src/worktree.rs 🔗

@@ -320,7 +320,7 @@ impl Worktree {
                     if new_scan_exclude_files != this.snapshot.scan_exclude_files {
                         this.snapshot.scan_exclude_files = new_scan_exclude_files;
                         log::info!(
-                            "Re-scanning due to new scan exclude files: {:?}",
+                            "Re-scanning directories, new scan exclude files: {:?}",
                             this.snapshot
                                 .scan_exclude_files
                                 .iter()
@@ -343,7 +343,6 @@ impl Worktree {
                             cx,
                         );
                         this.is_scanning = watch::channel_with(true);
-                        // TODO kb change more state? will this even work now?
                     }
                 }
             });
@@ -3489,18 +3488,26 @@ impl BackgroundScanner {
     }
 
     async fn scan_dir(&self, job: &ScanJob) -> Result<()> {
-        log::debug!("scan directory {:?}", job.path);
-
-        let mut ignore_stack = job.ignore_stack.clone();
-        let mut new_ignore = None;
-        let (root_abs_path, root_char_bag, next_entry_id) = {
-            let snapshot = &self.state.lock().snapshot;
-            (
-                snapshot.abs_path().clone(),
-                snapshot.root_char_bag,
-                self.next_entry_id.clone(),
-            )
-        };
+        let root_abs_path;
+        let mut ignore_stack;
+        let mut new_ignore;
+        let root_char_bag;
+        let next_entry_id;
+        {
+            let state = self.state.lock();
+            let snapshot = &state.snapshot;
+            root_abs_path = snapshot.abs_path().clone();
+            if snapshot.is_abs_path_excluded(&job.abs_path) {
+                log::error!("skipping excluded directory {:?}", job.path);
+                return Ok(());
+            }
+            log::debug!("scanning directory {:?}", job.path);
+            ignore_stack = job.ignore_stack.clone();
+            new_ignore = None;
+            root_char_bag = snapshot.root_char_bag;
+            next_entry_id = self.next_entry_id.clone();
+            drop(state);
+        }
 
         let mut dotgit_path = None;
         let mut root_canonical_path = None;
@@ -3515,8 +3522,18 @@ impl BackgroundScanner {
                     continue;
                 }
             };
-
             let child_name = child_abs_path.file_name().unwrap();
+            {
+                let mut state = self.state.lock();
+                if state.snapshot.is_abs_path_excluded(&child_abs_path) {
+                    let relative_path = job.path.join(child_name);
+                    log::debug!("skipping excluded child entry {relative_path:?}");
+                    state.remove_path(&relative_path);
+                    continue;
+                }
+                drop(state);
+            }
+
             let child_path: Arc<Path> = job.path.join(child_name).into();
             let child_metadata = match self.fs.metadata(&child_abs_path).await {
                 Ok(Some(metadata)) => metadata,

crates/project/src/worktree_tests.rs 🔗

@@ -935,10 +935,9 @@ async fn test_ignore_exclusions(cx: &mut TestAppContext) {
             &[
                 "src/foo/foo.rs",
                 "src/foo/another.rs",
-                // TODO kb
-                // "node_modules/.DS_Store",
-                // "src/.DS_Store",
-                // ".DS_Store",
+                "node_modules/.DS_Store",
+                "src/.DS_Store",
+                ".DS_Store",
             ],
             &["target/index", "node_modules/prettier/package.json"],
             &["src/lib.rs", "src/bar/bar.rs", ".gitignore"],