From be14ab217ce29542a8b2c84282e822adcc69646c Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 22 Jan 2019 18:38:34 +0100 Subject: better test, avoid duplicated events --- crates/ra_vfs/src/io.rs | 7 ++++++- crates/ra_vfs/src/io/watcher.rs | 22 ++++++++++++---------- crates/ra_vfs/tests/vfs.rs | 23 ++++++++++++----------- 3 files changed, 30 insertions(+), 22 deletions(-) (limited to 'crates') diff --git a/crates/ra_vfs/src/io.rs b/crates/ra_vfs/src/io.rs index 3ab52ac3d..335f4f2e1 100644 --- a/crates/ra_vfs/src/io.rs +++ b/crates/ra_vfs/src/io.rs @@ -55,7 +55,12 @@ pub enum TaskResult { impl fmt::Debug for TaskResult { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("TaskResult { ... }") + match self { + TaskResult::AddRoot(..) => f.write_str("TaskResult::AddRoot(..)"), + TaskResult::HandleChange(c) => write!(f, "TaskResult::HandleChange({:?})", c), + TaskResult::LoadChange(c) => write!(f, "TaskResult::LoadChange({:?})", c), + TaskResult::NoOp => f.write_str("TaskResult::NoOp"), + } } } diff --git a/crates/ra_vfs/src/io/watcher.rs b/crates/ra_vfs/src/io/watcher.rs index b370c5fbc..68bb6b692 100644 --- a/crates/ra_vfs/src/io/watcher.rs +++ b/crates/ra_vfs/src/io/watcher.rs @@ -100,16 +100,18 @@ impl Watcher { log::warn!("could not watch \"{}\": {}", entry.path().display(), e) } } - } - if emit_for_contents && entry.depth() > 0 { - // emit as create because we haven't seen it yet - if let Err(e) = - self.sender - .send(io::Task::HandleChange(WatcherChange::Create( - entry.path().to_path_buf(), - ))) - { - log::warn!("watcher error: {}", e) + } else { + if emit_for_contents && entry.depth() > 0 { + // emit only for files otherwise we will cause watch_recursive to be called again with a dir that we are already watching + // emit as create because we haven't seen it yet + if let Err(e) = + self.sender + .send(io::Task::HandleChange(WatcherChange::Create( + entry.path().to_path_buf(), + ))) + { + log::warn!("watcher error: {}", e) + } } } } diff --git a/crates/ra_vfs/tests/vfs.rs b/crates/ra_vfs/tests/vfs.rs index b18ea74a3..d3271570a 100644 --- a/crates/ra_vfs/tests/vfs.rs +++ b/crates/ra_vfs/tests/vfs.rs @@ -1,12 +1,13 @@ use std::{collections::HashSet, fs}; -// use flexi_logger::Logger; +use flexi_logger::Logger; use ra_vfs::{Vfs, VfsChange}; use tempfile::tempdir; fn process_tasks(vfs: &mut Vfs, num_tasks: u32) { for _ in 0..num_tasks { let task = vfs.task_receiver().recv().unwrap(); + log::debug!("{:?}", task); vfs.handle_task(task); } } @@ -25,7 +26,7 @@ macro_rules! assert_match { #[test] fn test_vfs_works() -> std::io::Result<()> { - // Logger::with_str("vfs=debug,ra_vfs=debug").start().unwrap(); + Logger::with_str("vfs=debug,ra_vfs=debug").start().unwrap(); let files = [ ("a/foo.rs", "hello"), @@ -114,21 +115,21 @@ fn test_vfs_works() -> std::io::Result<()> { assert_eq!(path, "spam.rs") ); - fs::create_dir_all(dir.path().join("a/c")).unwrap(); - fs::write(dir.path().join("a/c/new.rs"), "new hello").unwrap(); + fs::create_dir_all(dir.path().join("a/sub1/sub2")).unwrap(); + fs::write(dir.path().join("a/sub1/sub2/new.rs"), "new hello").unwrap(); process_tasks(&mut vfs, 4); assert_match!( vfs.commit_changes().as_slice(), [VfsChange::AddFile { text, path, .. }], { assert_eq!(text.as_str(), "new hello"); - assert_eq!(path, "c/new.rs"); + assert_eq!(path, "sub1/sub2/new.rs"); } ); fs::rename( - &dir.path().join("a/c/new.rs"), - &dir.path().join("a/c/new1.rs"), + &dir.path().join("a/sub1/sub2/new.rs"), + &dir.path().join("a/sub1/sub2/new1.rs"), ) .unwrap(); process_tasks(&mut vfs, 4); @@ -142,18 +143,18 @@ fn test_vfs_works() -> std::io::Result<()> { .. }], { - assert_eq!(removed_path, "c/new.rs"); - assert_eq!(added_path, "c/new1.rs"); + assert_eq!(removed_path, "sub1/sub2/new.rs"); + assert_eq!(added_path, "sub1/sub2/new1.rs"); assert_eq!(text.as_str(), "new hello"); } ); - fs::remove_file(&dir.path().join("a/c/new1.rs")).unwrap(); + fs::remove_file(&dir.path().join("a/sub1/sub2/new1.rs")).unwrap(); process_tasks(&mut vfs, 2); assert_match!( vfs.commit_changes().as_slice(), [VfsChange::RemoveFile { path, .. }], - assert_eq!(path, "c/new1.rs") + assert_eq!(path, "sub1/sub2/new1.rs") ); fs::create_dir_all(dir.path().join("a/target")).unwrap(); -- cgit v1.2.3