2022-04-13 12:59:43 +02:00
|
|
|
#![deny(rust_2018_idioms)]
|
|
|
|
|
2022-06-17 00:55:25 +02:00
|
|
|
use std::{env::var, fs::File, sync::Mutex};
|
2020-06-24 16:17:59 +02:00
|
|
|
|
2021-10-09 07:43:51 +02:00
|
|
|
use miette::{IntoDiagnostic, Result};
|
2022-03-15 12:00:19 +01:00
|
|
|
use tracing::debug;
|
2022-06-11 08:43:11 +02:00
|
|
|
use tracing_log::LogTracer;
|
|
|
|
use watchexec::{
|
|
|
|
event::{Event, Priority},
|
|
|
|
Watchexec,
|
|
|
|
};
|
2021-05-10 12:44:35 +02:00
|
|
|
|
2021-04-10 15:33:40 +02:00
|
|
|
mod args;
|
2021-08-24 10:23:37 +02:00
|
|
|
mod config;
|
2021-12-23 15:37:51 +01:00
|
|
|
mod filterer;
|
2016-09-14 15:30:59 +02:00
|
|
|
|
2021-10-15 03:27:32 +02:00
|
|
|
#[cfg(target_env = "musl")]
|
|
|
|
#[global_allocator]
|
|
|
|
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
|
|
|
|
|
2021-08-24 10:23:37 +02:00
|
|
|
#[tokio::main]
|
|
|
|
async fn main() -> Result<()> {
|
2022-06-07 14:15:17 +02:00
|
|
|
LogTracer::init().into_diagnostic()?;
|
|
|
|
|
2021-09-28 14:47:18 +02:00
|
|
|
#[cfg(feature = "dev-console")]
|
|
|
|
console_subscriber::init();
|
|
|
|
|
|
|
|
if var("RUST_LOG").is_ok() && cfg!(not(feature = "dev-console")) {
|
2021-08-24 10:23:37 +02:00
|
|
|
tracing_subscriber::fmt::init();
|
|
|
|
}
|
2021-05-10 12:44:35 +02:00
|
|
|
|
2021-12-23 15:56:03 +01:00
|
|
|
let tagged_filterer = var("WATCHEXEC_FILTERER")
|
|
|
|
.map(|v| v == "tagged")
|
|
|
|
.unwrap_or(false);
|
|
|
|
|
|
|
|
let args = args::get_args(tagged_filterer)?;
|
2021-08-24 10:23:37 +02:00
|
|
|
|
2022-01-15 03:14:25 +01:00
|
|
|
{
|
|
|
|
let verbosity = args.occurrences_of("verbose");
|
2022-06-16 17:56:59 +02:00
|
|
|
let log_file = if let Some(file) = args.value_of("log-file") {
|
|
|
|
Some(File::create(file).into_diagnostic()?)
|
2022-06-17 00:55:25 +02:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
};
|
2022-06-16 17:56:59 +02:00
|
|
|
|
2022-01-15 03:14:25 +01:00
|
|
|
let mut builder = tracing_subscriber::fmt().with_env_filter(match verbosity {
|
2021-10-13 13:38:56 +02:00
|
|
|
0 => "watchexec-cli=warn",
|
|
|
|
1 => "watchexec=debug,watchexec-cli=debug",
|
|
|
|
2 => "watchexec=trace,watchexec-cli=trace",
|
|
|
|
_ => "trace",
|
2022-01-15 03:14:25 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
if verbosity > 2 {
|
2022-01-15 04:40:01 +01:00
|
|
|
use tracing_subscriber::fmt::format::FmtSpan;
|
|
|
|
builder = builder.with_span_events(FmtSpan::NEW | FmtSpan::CLOSE);
|
2022-01-15 03:14:25 +01:00
|
|
|
}
|
|
|
|
|
2022-06-16 17:56:59 +02:00
|
|
|
if let Some(writer) = log_file {
|
2022-06-17 00:55:25 +02:00
|
|
|
builder
|
|
|
|
.json()
|
|
|
|
.with_writer(Mutex::new(writer))
|
|
|
|
.try_init()
|
|
|
|
.ok();
|
2022-06-16 17:56:59 +02:00
|
|
|
} else if verbosity > 3 {
|
2022-01-15 03:14:25 +01:00
|
|
|
builder.pretty().try_init().ok();
|
|
|
|
} else {
|
|
|
|
builder.try_init().ok();
|
|
|
|
}
|
|
|
|
}
|
2021-10-13 13:38:56 +02:00
|
|
|
|
2022-06-17 00:55:25 +02:00
|
|
|
debug!(version=%env!("CARGO_PKG_VERSION"), ?args, "constructing Watchexec from CLI");
|
2022-03-15 12:00:19 +01:00
|
|
|
|
2021-12-23 15:37:51 +01:00
|
|
|
let init = config::init(&args)?;
|
|
|
|
let mut runtime = config::runtime(&args)?;
|
2021-12-23 15:56:03 +01:00
|
|
|
runtime.filterer(if tagged_filterer {
|
|
|
|
eprintln!("!!! EXPERIMENTAL: using tagged filterer !!!");
|
|
|
|
filterer::tagged(&args).await?
|
|
|
|
} else {
|
|
|
|
filterer::globset(&args).await?
|
|
|
|
});
|
2021-10-13 13:38:56 +02:00
|
|
|
|
2021-08-24 10:23:37 +02:00
|
|
|
let wx = Watchexec::new(init, runtime)?;
|
|
|
|
|
2021-08-24 12:45:31 +02:00
|
|
|
if !args.is_present("postpone") {
|
2022-06-11 08:43:11 +02:00
|
|
|
wx.send_event(Event::default(), Priority::Urgent).await?;
|
2021-08-24 12:45:31 +02:00
|
|
|
}
|
|
|
|
|
2021-10-09 07:43:51 +02:00
|
|
|
wx.main().await.into_diagnostic()??;
|
2021-08-24 10:23:37 +02:00
|
|
|
|
|
|
|
Ok(())
|
2020-06-24 16:17:59 +02:00
|
|
|
}
|