2021-11-29 13:42:00 +01:00
|
|
|
use std::{ffi::OsString, path::PathBuf};
|
|
|
|
|
2021-10-17 06:11:50 +02:00
|
|
|
use watchexec::{
|
|
|
|
error::RuntimeError,
|
2021-11-22 10:22:39 +01:00
|
|
|
event::{Event, FileType, Tag},
|
2021-10-17 06:11:50 +02:00
|
|
|
filter::{globset::GlobsetFilterer, Filterer},
|
|
|
|
};
|
|
|
|
|
|
|
|
trait Harness {
|
2021-11-22 10:22:39 +01:00
|
|
|
fn check_path(
|
|
|
|
&self,
|
2021-11-29 13:42:00 +01:00
|
|
|
path: PathBuf,
|
2021-11-22 10:22:39 +01:00
|
|
|
file_type: Option<FileType>,
|
|
|
|
) -> std::result::Result<bool, RuntimeError>;
|
2021-10-17 06:11:50 +02:00
|
|
|
|
2021-11-22 10:22:39 +01:00
|
|
|
fn path_pass(&self, path: &str, file_type: Option<FileType>, pass: bool) {
|
2021-11-29 13:42:00 +01:00
|
|
|
let origin = dunce::canonicalize(".").unwrap();
|
|
|
|
let full_path = if let Some(suf) = path.strip_prefix("/test/") {
|
|
|
|
origin.join(suf)
|
|
|
|
} else {
|
|
|
|
origin.join(path)
|
|
|
|
};
|
|
|
|
|
2021-11-22 10:22:39 +01:00
|
|
|
assert_eq!(
|
2021-11-29 13:42:00 +01:00
|
|
|
self.check_path(full_path, file_type).unwrap(),
|
2021-11-22 10:22:39 +01:00
|
|
|
pass,
|
|
|
|
"{} {:?} (expected {})",
|
|
|
|
match file_type {
|
|
|
|
Some(FileType::File) => "file",
|
|
|
|
Some(FileType::Dir) => "dir",
|
|
|
|
Some(FileType::Symlink) => "symlink",
|
|
|
|
Some(FileType::Other) => "other",
|
|
|
|
None => "path",
|
|
|
|
},
|
|
|
|
path,
|
|
|
|
if pass { "pass" } else { "fail" }
|
2021-10-17 06:11:50 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2021-11-22 10:22:39 +01:00
|
|
|
fn file_does_pass(&self, path: &str) {
|
|
|
|
self.path_pass(path, Some(FileType::File), true);
|
|
|
|
}
|
|
|
|
|
2021-10-19 13:47:22 +02:00
|
|
|
fn file_doesnt_pass(&self, path: &str) {
|
2021-11-22 10:22:39 +01:00
|
|
|
self.path_pass(path, Some(FileType::File), false);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn dir_does_pass(&self, path: &str) {
|
|
|
|
self.path_pass(path, Some(FileType::Dir), true);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn dir_doesnt_pass(&self, path: &str) {
|
|
|
|
self.path_pass(path, Some(FileType::Dir), false);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn unk_does_pass(&self, path: &str) {
|
|
|
|
self.path_pass(path, None, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn unk_doesnt_pass(&self, path: &str) {
|
|
|
|
self.path_pass(path, None, false);
|
2021-10-17 06:11:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Harness for GlobsetFilterer {
|
2021-11-22 10:22:39 +01:00
|
|
|
fn check_path(
|
|
|
|
&self,
|
2021-11-29 13:42:00 +01:00
|
|
|
path: PathBuf,
|
2021-11-22 10:22:39 +01:00
|
|
|
file_type: Option<FileType>,
|
|
|
|
) -> std::result::Result<bool, RuntimeError> {
|
2021-10-17 06:11:50 +02:00
|
|
|
let event = Event {
|
2021-11-29 13:42:00 +01:00
|
|
|
tags: vec![Tag::Path { path, file_type }],
|
2021-10-17 06:11:50 +02:00
|
|
|
metadata: Default::default(),
|
|
|
|
};
|
|
|
|
|
|
|
|
self.check_event(&event)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-29 13:42:00 +01:00
|
|
|
fn filt(filters: &[&str], ignores: &[&str], extensions: &[&str]) -> GlobsetFilterer {
|
|
|
|
let origin = dunce::canonicalize(".").unwrap();
|
|
|
|
GlobsetFilterer::new(
|
|
|
|
origin,
|
|
|
|
filters.iter().map(|s| (s.to_string(), None)),
|
|
|
|
ignores.iter().map(|s| (s.to_string(), None)),
|
|
|
|
extensions.iter().map(OsString::from),
|
|
|
|
)
|
|
|
|
.expect("making filterer")
|
|
|
|
}
|
|
|
|
|
2021-11-22 10:22:39 +01:00
|
|
|
#[test]
|
|
|
|
fn empty_filter_passes_everything() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &[], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("Cargo.toml");
|
|
|
|
filterer.file_does_pass("Cargo.json");
|
|
|
|
filterer.file_does_pass("Gemfile.toml");
|
|
|
|
filterer.file_does_pass("FINAL-FINAL.docx");
|
|
|
|
filterer.dir_does_pass("/test/Cargo.toml");
|
|
|
|
filterer.dir_does_pass("/a/folder");
|
|
|
|
filterer.file_does_pass("apples/carrots/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("apples/carrots/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.dir_does_pass("apples/oranges/bananas");
|
|
|
|
}
|
|
|
|
|
2021-10-17 06:11:50 +02:00
|
|
|
#[test]
|
|
|
|
fn exact_filename() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["Cargo.toml"], &[], &[]);
|
2021-10-17 06:11:50 +02:00
|
|
|
|
2021-10-19 13:47:22 +02:00
|
|
|
filterer.file_does_pass("Cargo.toml");
|
2021-11-22 10:22:39 +01:00
|
|
|
filterer.file_does_pass("/test/foo/bar/Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("Cargo.json");
|
|
|
|
filterer.file_doesnt_pass("Gemfile.toml");
|
|
|
|
filterer.file_doesnt_pass("FINAL-FINAL.docx");
|
|
|
|
filterer.dir_doesnt_pass("/a/folder");
|
|
|
|
filterer.dir_does_pass("/test/Cargo.toml");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn exact_filenames_multiple() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["Cargo.toml", "package.json"], &[], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("Cargo.toml");
|
|
|
|
filterer.file_does_pass("/test/foo/bar/Cargo.toml");
|
|
|
|
filterer.file_does_pass("package.json");
|
|
|
|
filterer.file_does_pass("/test/foo/bar/package.json");
|
2021-10-19 13:47:22 +02:00
|
|
|
filterer.file_doesnt_pass("Cargo.json");
|
2021-11-22 10:22:39 +01:00
|
|
|
filterer.file_doesnt_pass("package.toml");
|
2021-10-19 13:47:22 +02:00
|
|
|
filterer.file_doesnt_pass("Gemfile.toml");
|
|
|
|
filterer.file_doesnt_pass("FINAL-FINAL.docx");
|
2021-11-22 10:22:39 +01:00
|
|
|
filterer.dir_doesnt_pass("/a/folder");
|
|
|
|
filterer.dir_does_pass("/test/Cargo.toml");
|
|
|
|
filterer.dir_does_pass("/test/package.json");
|
2021-10-19 13:47:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2021-11-22 10:22:39 +01:00
|
|
|
fn glob_single_final_ext_star() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["Cargo.*"], &[], &[]);
|
2021-10-19 13:47:22 +02:00
|
|
|
|
|
|
|
filterer.file_does_pass("Cargo.toml");
|
|
|
|
filterer.file_does_pass("Cargo.json");
|
|
|
|
filterer.file_doesnt_pass("Gemfile.toml");
|
|
|
|
filterer.file_doesnt_pass("FINAL-FINAL.docx");
|
2021-11-22 10:22:39 +01:00
|
|
|
filterer.dir_doesnt_pass("/a/folder");
|
|
|
|
filterer.dir_does_pass("Cargo.toml");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn glob_star_trailing_slash() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["Cargo.*/"], &[], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("Cargo.json");
|
|
|
|
filterer.file_doesnt_pass("Gemfile.toml");
|
|
|
|
filterer.file_doesnt_pass("FINAL-FINAL.docx");
|
|
|
|
filterer.dir_doesnt_pass("/a/folder");
|
|
|
|
filterer.dir_does_pass("Cargo.toml");
|
|
|
|
filterer.unk_doesnt_pass("Cargo.toml");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn glob_star_leading_slash() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["/Cargo.*"], &[], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("Cargo.toml");
|
|
|
|
filterer.file_does_pass("Cargo.json");
|
|
|
|
filterer.dir_does_pass("Cargo.toml");
|
|
|
|
filterer.unk_does_pass("Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("foo/Cargo.toml");
|
|
|
|
filterer.dir_doesnt_pass("foo/Cargo.toml");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn glob_leading_double_star() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["**/possum"], &[], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("possum");
|
|
|
|
filterer.file_does_pass("foo/bar/possum");
|
|
|
|
filterer.file_does_pass("/foo/bar/possum");
|
|
|
|
filterer.dir_does_pass("possum");
|
|
|
|
filterer.dir_does_pass("foo/bar/possum");
|
|
|
|
filterer.dir_does_pass("/foo/bar/possum");
|
|
|
|
filterer.file_doesnt_pass("rat");
|
|
|
|
filterer.file_doesnt_pass("foo/bar/rat");
|
|
|
|
filterer.file_doesnt_pass("/foo/bar/rat");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn glob_trailing_double_star() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["possum/**"], &[], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
2021-11-29 13:42:00 +01:00
|
|
|
// these do work by expectation and in v1
|
2021-11-22 10:22:39 +01:00
|
|
|
filterer.file_does_pass("/test/possum/foo/bar");
|
|
|
|
filterer.dir_doesnt_pass("possum");
|
|
|
|
filterer.dir_doesnt_pass("foo/bar/possum");
|
|
|
|
filterer.dir_does_pass("possum/foo/bar");
|
|
|
|
filterer.file_doesnt_pass("rat");
|
|
|
|
filterer.file_doesnt_pass("foo/bar/rat");
|
|
|
|
filterer.file_doesnt_pass("/foo/bar/rat");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn glob_middle_double_star() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["apples/**/oranges"], &[], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.dir_doesnt_pass("/a/folder");
|
|
|
|
filterer.file_does_pass("apples/carrots/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_doesnt_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("apples/carrots/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.dir_doesnt_pass("apples/oranges/bananas");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn glob_double_star_trailing_slash() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["apples/**/oranges/"], &[], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.dir_doesnt_pass("/a/folder");
|
|
|
|
filterer.file_doesnt_pass("apples/carrots/oranges");
|
|
|
|
filterer.file_doesnt_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_doesnt_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_doesnt_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("apples/carrots/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.dir_doesnt_pass("apples/oranges/bananas");
|
|
|
|
filterer.unk_doesnt_pass("apples/carrots/oranges");
|
|
|
|
filterer.unk_doesnt_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.unk_doesnt_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_exact_filename() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["Cargo.toml"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("/test/foo/bar/Cargo.toml");
|
|
|
|
filterer.file_does_pass("Cargo.json");
|
|
|
|
filterer.file_does_pass("Gemfile.toml");
|
|
|
|
filterer.file_does_pass("FINAL-FINAL.docx");
|
|
|
|
filterer.dir_does_pass("/a/folder");
|
|
|
|
filterer.dir_doesnt_pass("/test/Cargo.toml");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_exact_filenames_multiple() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["Cargo.toml", "package.json"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("/test/foo/bar/Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("package.json");
|
|
|
|
filterer.file_doesnt_pass("/test/foo/bar/package.json");
|
|
|
|
filterer.file_does_pass("Cargo.json");
|
|
|
|
filterer.file_does_pass("package.toml");
|
|
|
|
filterer.file_does_pass("Gemfile.toml");
|
|
|
|
filterer.file_does_pass("FINAL-FINAL.docx");
|
|
|
|
filterer.dir_does_pass("/a/folder");
|
|
|
|
filterer.dir_doesnt_pass("/test/Cargo.toml");
|
|
|
|
filterer.dir_doesnt_pass("/test/package.json");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_glob_single_final_ext_star() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["Cargo.*"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("Cargo.json");
|
|
|
|
filterer.file_does_pass("Gemfile.toml");
|
|
|
|
filterer.file_does_pass("FINAL-FINAL.docx");
|
|
|
|
filterer.dir_does_pass("/a/folder");
|
|
|
|
filterer.dir_doesnt_pass("Cargo.toml");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_glob_star_trailing_slash() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["Cargo.*/"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("Cargo.toml");
|
|
|
|
filterer.file_does_pass("Cargo.json");
|
|
|
|
filterer.file_does_pass("Gemfile.toml");
|
|
|
|
filterer.file_does_pass("FINAL-FINAL.docx");
|
|
|
|
filterer.dir_does_pass("/a/folder");
|
|
|
|
filterer.dir_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.unk_does_pass("Cargo.toml");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_glob_star_leading_slash() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["/Cargo.*"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("Cargo.json");
|
|
|
|
filterer.dir_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.unk_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.file_does_pass("foo/Cargo.toml");
|
|
|
|
filterer.dir_does_pass("foo/Cargo.toml");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_glob_leading_double_star() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["**/possum"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_doesnt_pass("possum");
|
|
|
|
filterer.file_doesnt_pass("foo/bar/possum");
|
|
|
|
filterer.file_doesnt_pass("/foo/bar/possum");
|
|
|
|
filterer.dir_doesnt_pass("possum");
|
|
|
|
filterer.dir_doesnt_pass("foo/bar/possum");
|
|
|
|
filterer.dir_doesnt_pass("/foo/bar/possum");
|
|
|
|
filterer.file_does_pass("rat");
|
|
|
|
filterer.file_does_pass("foo/bar/rat");
|
|
|
|
filterer.file_does_pass("/foo/bar/rat");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_glob_trailing_double_star() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["possum/**"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("possum");
|
|
|
|
filterer.file_doesnt_pass("possum/foo/bar");
|
|
|
|
filterer.file_does_pass("/possum/foo/bar");
|
|
|
|
filterer.file_doesnt_pass("/test/possum/foo/bar");
|
|
|
|
filterer.dir_does_pass("possum");
|
|
|
|
filterer.dir_does_pass("foo/bar/possum");
|
|
|
|
filterer.dir_does_pass("/foo/bar/possum");
|
|
|
|
filterer.dir_doesnt_pass("possum/foo/bar");
|
|
|
|
filterer.dir_does_pass("/possum/foo/bar");
|
|
|
|
filterer.dir_doesnt_pass("/test/possum/foo/bar");
|
|
|
|
filterer.file_does_pass("rat");
|
|
|
|
filterer.file_does_pass("foo/bar/rat");
|
|
|
|
filterer.file_does_pass("/foo/bar/rat");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_glob_middle_double_star() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["apples/**/oranges"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.dir_does_pass("/a/folder");
|
|
|
|
filterer.file_doesnt_pass("apples/carrots/oranges");
|
|
|
|
filterer.file_doesnt_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_doesnt_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_doesnt_pass("apples/carrots/oranges");
|
|
|
|
filterer.dir_doesnt_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_doesnt_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.dir_does_pass("apples/oranges/bananas");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_glob_double_star_trailing_slash() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["apples/**/oranges/"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.dir_does_pass("/a/folder");
|
|
|
|
filterer.file_does_pass("apples/carrots/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_doesnt_pass("apples/carrots/oranges");
|
|
|
|
filterer.dir_doesnt_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_doesnt_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.dir_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.unk_does_pass("apples/carrots/oranges");
|
|
|
|
filterer.unk_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.unk_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignores_take_precedence() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&["*.docx", "*.toml", "*.json"], &["*.toml", "*.json"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_doesnt_pass("Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("/test/foo/bar/Cargo.toml");
|
|
|
|
filterer.file_doesnt_pass("package.json");
|
|
|
|
filterer.file_doesnt_pass("/test/foo/bar/package.json");
|
|
|
|
filterer.dir_doesnt_pass("/test/Cargo.toml");
|
|
|
|
filterer.dir_doesnt_pass("/test/package.json");
|
|
|
|
filterer.file_does_pass("FINAL-FINAL.docx");
|
|
|
|
}
|
|
|
|
|
|
|
|
// The following tests replicate the "buggy"/"confusing" watchexec v1 behaviour.
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_folder_incorrectly_with_bare_match() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["prunes"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("apples");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("apples");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_does_pass("raw-prunes");
|
|
|
|
filterer.dir_does_pass("raw-prunes");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_doesnt_pass("prunes");
|
|
|
|
filterer.dir_doesnt_pass("prunes");
|
|
|
|
|
|
|
|
// buggy behaviour (should be doesnt):
|
|
|
|
filterer.file_does_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("prunes/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_folder_incorrectly_with_bare_and_leading_slash() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["/prunes"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("apples");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("apples");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_does_pass("raw-prunes");
|
|
|
|
filterer.dir_does_pass("raw-prunes");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_doesnt_pass("prunes");
|
|
|
|
filterer.dir_doesnt_pass("prunes");
|
|
|
|
|
|
|
|
// buggy behaviour (should be doesnt):
|
|
|
|
filterer.file_does_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("prunes/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_folder_incorrectly_with_bare_and_trailing_slash() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["prunes/"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("apples");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("apples");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_does_pass("raw-prunes");
|
|
|
|
filterer.dir_does_pass("raw-prunes");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.dir_doesnt_pass("prunes");
|
|
|
|
|
|
|
|
// buggy behaviour (should be doesnt):
|
|
|
|
filterer.file_does_pass("prunes");
|
|
|
|
filterer.file_does_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("prunes/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_folder_incorrectly_with_only_double_double_glob() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["**/prunes/**"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("apples");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("apples");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_does_pass("raw-prunes");
|
|
|
|
filterer.dir_does_pass("raw-prunes");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_doesnt_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_doesnt_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_doesnt_pass("prunes/oranges/bananas");
|
|
|
|
filterer.dir_doesnt_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_doesnt_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
// buggy behaviour (should be doesnt):
|
|
|
|
filterer.file_does_pass("prunes");
|
|
|
|
filterer.dir_does_pass("prunes");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ignore_folder_correctly_with_double_and_double_double_globs() {
|
2021-11-29 13:42:00 +01:00
|
|
|
let filterer = filt(&[], &["**/prunes", "**/prunes/**"], &[]);
|
2021-11-22 10:22:39 +01:00
|
|
|
|
|
|
|
filterer.file_does_pass("apples");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("apples/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("apples");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("apples/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_does_pass("raw-prunes");
|
|
|
|
filterer.dir_does_pass("raw-prunes");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_does_pass("raw-prunes/oranges/bananas");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_does_pass("raw-prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
|
|
|
|
filterer.file_doesnt_pass("prunes");
|
|
|
|
filterer.file_doesnt_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.file_doesnt_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
|
|
|
filterer.file_doesnt_pass("prunes/oranges/bananas");
|
|
|
|
filterer.dir_doesnt_pass("prunes");
|
|
|
|
filterer.dir_doesnt_pass("prunes/carrots/cauliflowers/oranges");
|
|
|
|
filterer.dir_doesnt_pass("prunes/carrots/cauliflowers/artichokes/oranges");
|
2021-10-17 06:11:50 +02:00
|
|
|
}
|