globset: allow multipath events through if any path passes the filter
This commit is contained in:
parent
42d64d0a6d
commit
59d8388d7e
|
@ -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
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue