2021-12-29 06:51:51 +01:00
|
|
|
use std::sync::Arc;
|
2021-12-23 15:37:51 +01:00
|
|
|
|
|
|
|
use clap::ArgMatches;
|
2021-12-29 06:39:31 +01:00
|
|
|
use futures::future::try_join_all;
|
2021-12-29 06:51:51 +01:00
|
|
|
use miette::{IntoDiagnostic, Result};
|
2022-01-16 04:11:17 +01:00
|
|
|
use tracing::{debug, trace, warn};
|
2021-12-29 06:39:31 +01:00
|
|
|
use watchexec::{
|
|
|
|
filter::tagged::{
|
|
|
|
files::{self, FilterFile},
|
2021-12-29 06:51:51 +01:00
|
|
|
Filter, Matcher, Op, Pattern, TaggedFilterer,
|
2021-12-29 06:39:31 +01:00
|
|
|
},
|
2022-01-15 03:12:32 +01:00
|
|
|
ignore::IgnoreFile,
|
2021-12-29 06:39:31 +01:00
|
|
|
};
|
2021-12-23 15:37:51 +01:00
|
|
|
|
|
|
|
pub async fn tagged(args: &ArgMatches<'static>) -> Result<Arc<TaggedFilterer>> {
|
|
|
|
let (project_origin, workdir) = super::common::dirs(args).await?;
|
2022-01-16 04:11:17 +01:00
|
|
|
let vcs_types = super::common::vcs_types(&project_origin).await;
|
2022-01-25 15:24:15 +01:00
|
|
|
let ignores = super::common::ignores(args, &vcs_types, &project_origin).await;
|
2021-12-23 15:37:51 +01:00
|
|
|
|
2021-12-29 06:51:51 +01:00
|
|
|
let filterer = TaggedFilterer::new(project_origin, workdir.clone())?;
|
2021-12-23 15:37:51 +01:00
|
|
|
|
|
|
|
for ignore in &ignores {
|
|
|
|
filterer.add_ignore_file(ignore).await?;
|
|
|
|
}
|
|
|
|
|
2021-12-29 06:39:31 +01:00
|
|
|
let mut filter_files = Vec::new();
|
|
|
|
for path in args.values_of_os("filter-file").unwrap_or_default() {
|
|
|
|
let file = FilterFile(IgnoreFile {
|
|
|
|
applies_in: None,
|
|
|
|
applies_to: None,
|
2021-12-29 06:51:51 +01:00
|
|
|
path: dunce::canonicalize(path).into_diagnostic()?,
|
2021-12-29 06:39:31 +01:00
|
|
|
});
|
|
|
|
filter_files.push(file);
|
|
|
|
}
|
2021-12-29 06:51:51 +01:00
|
|
|
debug!(?filter_files, "resolved command filter files");
|
2021-12-29 06:39:31 +01:00
|
|
|
|
|
|
|
if !args.is_present("no-global-filters") {
|
2022-01-16 04:11:17 +01:00
|
|
|
let (global_filter_files, errors) = files::from_environment().await;
|
|
|
|
for err in errors {
|
|
|
|
warn!("while discovering project-local filter files: {}", err);
|
|
|
|
}
|
2021-12-29 06:51:51 +01:00
|
|
|
debug!(?global_filter_files, "discovered global filter files");
|
2021-12-29 06:39:31 +01:00
|
|
|
filter_files.extend(global_filter_files);
|
|
|
|
}
|
|
|
|
|
2021-12-29 06:51:51 +01:00
|
|
|
let mut filters = try_join_all(
|
2021-12-29 06:39:31 +01:00
|
|
|
filter_files
|
|
|
|
.into_iter()
|
|
|
|
.map(|file| async move { file.load().await }),
|
|
|
|
)
|
|
|
|
.await?
|
|
|
|
.into_iter()
|
|
|
|
.flatten()
|
|
|
|
.collect::<Vec<_>>();
|
2021-12-29 06:51:51 +01:00
|
|
|
|
|
|
|
for filter in args.values_of("filter").unwrap_or_default() {
|
|
|
|
let mut filter: Filter = filter.parse()?;
|
|
|
|
filter.in_path = Some(workdir.clone());
|
|
|
|
filters.push(filter);
|
|
|
|
}
|
|
|
|
|
2021-12-29 08:14:29 +01:00
|
|
|
if !args.is_present("no-default-ignore") {
|
|
|
|
filters.extend([
|
|
|
|
Filter::from_glob_ignore(None, ".DS_Store/"),
|
|
|
|
Filter::from_glob_ignore(None, "*.py[co]"),
|
|
|
|
Filter::from_glob_ignore(None, "#*#"),
|
|
|
|
Filter::from_glob_ignore(None, ".#*"),
|
|
|
|
Filter::from_glob_ignore(None, ".*.kate-swp"),
|
|
|
|
Filter::from_glob_ignore(None, ".*.sw?"),
|
|
|
|
Filter::from_glob_ignore(None, ".*.sw?x"),
|
2022-02-07 04:55:11 +01:00
|
|
|
Filter::from_glob_ignore(None, ".bzr"),
|
|
|
|
Filter::from_glob_ignore(None, "_darcs"),
|
|
|
|
Filter::from_glob_ignore(None, ".fossil-settings"),
|
|
|
|
Filter::from_glob_ignore(None, ".git"),
|
|
|
|
Filter::from_glob_ignore(None, ".hg"),
|
|
|
|
Filter::from_glob_ignore(None, ".pijul"),
|
|
|
|
Filter::from_glob_ignore(None, ".svn"),
|
2021-12-29 08:14:29 +01:00
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2021-12-29 06:51:51 +01:00
|
|
|
if args.is_present("no-meta") {
|
|
|
|
filters.push(Filter {
|
|
|
|
in_path: Some(workdir.clone()),
|
|
|
|
on: Matcher::FileEventKind,
|
|
|
|
op: Op::NotGlob,
|
|
|
|
pat: Pattern::Glob("Modify(Metadata(*))".to_string()),
|
|
|
|
negate: false,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-12-29 08:14:29 +01:00
|
|
|
debug!(filters=%filters.len(), "parsed filters");
|
|
|
|
trace!(?filters, "all filters");
|
2021-12-29 06:39:31 +01:00
|
|
|
filterer.add_filters(&filters).await?;
|
2021-12-23 15:37:51 +01:00
|
|
|
|
|
|
|
Ok(filterer)
|
|
|
|
}
|