globset: allow multipath events through if any path passes the filter

This commit is contained in:
Félix Saparelli 2022-01-26 01:26:12 +13:00
parent 42d64d0a6d
commit 59d8388d7e
2 changed files with 39 additions and 8 deletions

View File

@ -110,7 +110,7 @@ impl Filterer for GlobsetFilterer {
}
}
for (path, file_type) in event.paths() {
Ok(event.paths().any(|(path, file_type)| {
let _span = trace_span!("path", ?path).entered();
let is_dir = file_type
.map(|t| matches!(t, FileType::Dir))
@ -118,35 +118,35 @@ impl Filterer for GlobsetFilterer {
if self.ignores.matched(path, is_dir).is_ignore() {
trace!("ignored by globset ignore");
return Ok(false);
return false;
}
if self.filters.num_ignores() > 0 && !self.filters.matched(path, is_dir).is_ignore() {
trace!("ignored by globset filters");
return Ok(false);
return false;
}
if !self.extensions.is_empty() {
if is_dir {
trace!("failed on extension check due to being a dir");
return Ok(false);
return false;
}
if let Some(ext) = path.extension() {
if !self.extensions.iter().any(|e| e == ext) {
trace!("ignored by extension filter");
return Ok(false);
return false;
}
} else {
trace!(
?path,
"failed on extension check due to having no extension"
);
return Ok(false);
return false;
}
}
}
Ok(true)
true
}))
}
}

View File

@ -316,6 +316,37 @@ async fn extensions_fail_extensionless() {
filterer.file_doesnt_pass("Cargo");
}
#[tokio::test]
async fn multipath_allow_on_any_one_pass() {
use watchexec::{
event::{Event, FileType, Tag},
filter::Filterer,
};
let filterer = filt(&[], &[], &["py"]).await;
let origin = dunce::canonicalize(".").unwrap();
let event = Event {
tags: vec![
Tag::Path {
path: origin.join("Cargo.py"),
file_type: Some(FileType::File),
},
Tag::Path {
path: origin.join("Cargo.toml"),
file_type: Some(FileType::File),
},
Tag::Path {
path: origin.join("Cargo.py"),
file_type: Some(FileType::Dir),
},
],
metadata: Default::default(),
};
assert!(filterer.check_event(&event).unwrap());
}
// The following tests replicate the "buggy"/"confusing" watchexec v1 behaviour.
#[tokio::test]