aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_vfs/src/io/watcher.rs6
-rw-r--r--crates/ra_vfs/src/lib.rs3
-rw-r--r--crates/ra_vfs/tests/vfs.rs18
3 files changed, 16 insertions, 11 deletions
diff --git a/crates/ra_vfs/src/io/watcher.rs b/crates/ra_vfs/src/io/watcher.rs
index 1d7ce2136..ff6775f59 100644
--- a/crates/ra_vfs/src/io/watcher.rs
+++ b/crates/ra_vfs/src/io/watcher.rs
@@ -65,7 +65,7 @@ impl Watcher {
65 { 65 {
66 match res { 66 match res {
67 Ok(entry) => { 67 Ok(entry) => {
68 if entry.path().is_dir() { 68 if entry.file_type().is_dir() {
69 watch_one(self.watcher.as_ref(), entry.path()); 69 watch_one(self.watcher.as_ref(), entry.path());
70 } 70 }
71 } 71 }
@@ -172,11 +172,11 @@ impl WatcherWorker {
172 let filter = &self.roots[root]; 172 let filter = &self.roots[root];
173 for res in WalkDir::new(dir) 173 for res in WalkDir::new(dir)
174 .into_iter() 174 .into_iter()
175 .filter_entry(|entry| filter.can_contain(entry.path()).is_some()) 175 .filter_entry(filter.entry_filter())
176 { 176 {
177 match res { 177 match res {
178 Ok(entry) => { 178 Ok(entry) => {
179 if entry.path().is_dir() { 179 if entry.file_type().is_dir() {
180 watch_one(self.watcher.as_ref(), entry.path()); 180 watch_one(self.watcher.as_ref(), entry.path());
181 } else { 181 } else {
182 // emit only for files otherwise we will cause watch_recursive to be called again with a dir that we are already watching 182 // emit only for files otherwise we will cause watch_recursive to be called again with a dir that we are already watching
diff --git a/crates/ra_vfs/src/lib.rs b/crates/ra_vfs/src/lib.rs
index 661892f8a..d1b0222e7 100644
--- a/crates/ra_vfs/src/lib.rs
+++ b/crates/ra_vfs/src/lib.rs
@@ -62,7 +62,8 @@ impl RootFilter {
62 62
63 pub(crate) fn entry_filter<'a>(&'a self) -> impl FnMut(&DirEntry) -> bool + 'a { 63 pub(crate) fn entry_filter<'a>(&'a self) -> impl FnMut(&DirEntry) -> bool + 'a {
64 move |entry: &DirEntry| { 64 move |entry: &DirEntry| {
65 if entry.path().is_dir() && self.excluded_dirs.iter().any(|it| it == entry.path()) { 65 if entry.file_type().is_dir() && self.excluded_dirs.iter().any(|it| it == entry.path())
66 {
66 // do not walk nested roots 67 // do not walk nested roots
67 false 68 false
68 } else { 69 } else {
diff --git a/crates/ra_vfs/tests/vfs.rs b/crates/ra_vfs/tests/vfs.rs
index 8562c56b9..357e1c775 100644
--- a/crates/ra_vfs/tests/vfs.rs
+++ b/crates/ra_vfs/tests/vfs.rs
@@ -1,12 +1,16 @@
1use std::{collections::HashSet, fs}; 1use std::{collections::HashSet, fs, time::Duration};
2 2
3use flexi_logger::Logger; 3// use flexi_logger::Logger;
4use crossbeam_channel::RecvTimeoutError;
4use ra_vfs::{Vfs, VfsChange}; 5use ra_vfs::{Vfs, VfsChange};
5use tempfile::tempdir; 6use tempfile::tempdir;
6 7
7fn process_tasks(vfs: &mut Vfs, num_tasks: u32) { 8fn process_tasks(vfs: &mut Vfs, num_tasks: u32) {
8 for _ in 0..num_tasks { 9 for _ in 0..num_tasks {
9 let task = vfs.task_receiver().recv().unwrap(); 10 let task = vfs
11 .task_receiver()
12 .recv_timeout(Duration::from_secs(3))
13 .unwrap();
10 log::debug!("{:?}", task); 14 log::debug!("{:?}", task);
11 vfs.handle_task(task); 15 vfs.handle_task(task);
12 } 16 }
@@ -14,7 +18,7 @@ fn process_tasks(vfs: &mut Vfs, num_tasks: u32) {
14 18
15macro_rules! assert_match { 19macro_rules! assert_match {
16 ($x:expr, $pat:pat) => { 20 ($x:expr, $pat:pat) => {
17 assert_match!($x, $pat, assert!(true)) 21 assert_match!($x, $pat, ())
18 }; 22 };
19 ($x:expr, $pat:pat, $assert:expr) => { 23 ($x:expr, $pat:pat, $assert:expr) => {
20 match $x { 24 match $x {
@@ -26,7 +30,7 @@ macro_rules! assert_match {
26 30
27#[test] 31#[test]
28fn test_vfs_works() -> std::io::Result<()> { 32fn test_vfs_works() -> std::io::Result<()> {
29 Logger::with_str("vfs=debug,ra_vfs=debug").start().unwrap(); 33 // Logger::with_str("vfs=debug,ra_vfs=debug").start().unwrap();
30 34
31 let files = [ 35 let files = [
32 ("a/foo.rs", "hello"), 36 ("a/foo.rs", "hello"),
@@ -166,8 +170,8 @@ fn test_vfs_works() -> std::io::Result<()> {
166 fs::write(&dir.path().join("a/target/new.rs"), "ignore me").unwrap(); 170 fs::write(&dir.path().join("a/target/new.rs"), "ignore me").unwrap();
167 171
168 assert_match!( 172 assert_match!(
169 vfs.task_receiver().try_recv(), 173 vfs.task_receiver().recv_timeout(Duration::from_millis(300)), // slightly more than watcher debounce delay
170 Err(crossbeam_channel::TryRecvError::Empty) 174 Err(RecvTimeoutError::Timeout)
171 ); 175 );
172 176
173 vfs.shutdown().unwrap(); 177 vfs.shutdown().unwrap();