diff --git a/Cargo.lock b/Cargo.lock index 4d05512..7163181 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,18 +15,6 @@ version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cddc5f91628367664cc7c69714ff08deee8a3efc54623011c772544d7b2767" -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "atty" version = "0.2.14" @@ -44,29 +32,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - [[package]] name = "cfg-if" version = "0.1.10" @@ -107,12 +78,6 @@ dependencies = [ "vec_map", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "crossbeam-channel" version = "0.5.0" @@ -158,27 +123,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" -dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", -] - [[package]] name = "either" version = "1.6.1" @@ -193,7 +137,7 @@ checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.5", + "redox_syscall", "winapi 0.3.9", ] @@ -204,8 +148,8 @@ dependencies = [ "anyhow", "chrono", "log", + "logsetup", "notify", - "simplelog", "structopt", ] @@ -216,11 +160,11 @@ dependencies = [ "anyhow", "humansize", "log", + "logsetup", "memmap", "rayon", "serde", "serde_derive", - "simplelog", "structopt", ] @@ -259,17 +203,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "heck" version = "0.3.2" @@ -366,6 +299,16 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "logsetup" +version = "0.1.0" +dependencies = [ + "anyhow", + "atty", + "simplelog", + "structopt", +] + [[package]] name = "memmap" version = "0.7.0" @@ -553,12 +496,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - [[package]] name = "redox_syscall" version = "0.2.5" @@ -568,29 +505,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "redox_users" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" -dependencies = [ - "getrandom", - "redox_syscall 0.1.57", - "rust-argon2", -] - -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", -] - [[package]] name = "ryu" version = "1.0.5" @@ -642,13 +556,12 @@ dependencies = [ [[package]] name = "simplelog" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf9a002ccce717d066b3ccdb8a28829436249867229291e91b25d99bd723f0d" +version = "0.10.0" +source = "git+https://github.com/mrkline/simplelog.rs?branch=optional-color#a17ca28ffad2e61cadfff27f85245509f99cfe95" dependencies = [ "chrono", "log", - "term", + "termcolor", ] [[package]] @@ -699,13 +612,12 @@ dependencies = [ ] [[package]] -name = "term" -version = "0.6.1" +name = "termcolor" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0863a3345e70f61d613eab32ee046ccd1bcc5f9105fe402c61fcd0c13eeb8b5" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" dependencies = [ - "dirs", - "winapi 0.3.9", + "winapi-util", ] [[package]] @@ -724,7 +636,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "wasi 0.10.0+wasi-snapshot-preview1", + "wasi", "winapi 0.3.9", ] @@ -764,10 +676,10 @@ version = "0.3.0" dependencies = [ "anyhow", "log", + "logsetup", "serde", "serde_derive", "serde_json", - "simplelog", "structopt", ] @@ -782,12 +694,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index f3ea7d8..f1bbb17 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["flt2vhs", "vhscat", "flt-mover"] +members = ["flt2vhs", "vhscat", "flt-mover", "logsetup"] resolver = "2" # Try new dependency resolver from Rust 1.51 [profile.dev] diff --git a/flt-mover/Cargo.toml b/flt-mover/Cargo.toml index 59b9e68..f929091 100644 --- a/flt-mover/Cargo.toml +++ b/flt-mover/Cargo.toml @@ -11,5 +11,5 @@ anyhow = "1.0" chrono = "0.4" notify = "4.0" log = "0.4" -simplelog = "0.7" +logsetup = { version = "0.1", path = "../logsetup" } structopt = "0.3.8" diff --git a/flt-mover/src/main.rs b/flt-mover/src/main.rs index ad71882..9821463 100644 --- a/flt-mover/src/main.rs +++ b/flt-mover/src/main.rs @@ -10,7 +10,6 @@ use anyhow::*; use chrono::prelude::*; use log::*; use notify::{raw_watcher, RecursiveMode, Watcher}; -use simplelog::*; use structopt::StructOpt; /// Monitors a directory and moves FLT files out from under BMS, @@ -22,6 +21,15 @@ struct Args { #[structopt(short, long, parse(from_occurrences))] verbose: u8, + #[structopt(short, long, case_insensitive = true, default_value = "auto")] + #[structopt(name = "always/auto/never")] + color: logsetup::Color, + + /// Prepend ISO-8601 timestamps to all messages + /// (from --verbose). Useful for benchmarking. + #[structopt(short, long, verbatim_doc_comment)] + timestamps: bool, + /// Switch to this working directory (e.g., BMS/User/Acmi) /// before doing anything else. #[structopt(short = "C", long, name = "path")] @@ -46,7 +54,7 @@ struct Args { fn main() -> Result<()> { let args = Args::from_args(); - init_logger(args.verbose)?; + logsetup::init_logger(args.verbose, args.timestamps, args.color)?; if let Some(change_to) = &args.directory { env::set_current_dir(change_to).with_context(|| { @@ -72,28 +80,6 @@ fn main() -> Result<()> { } } -/// Set up simplelog to spit messages to stderr. -fn init_logger(verbosity: u8) -> Result<()> { - let mut builder = ConfigBuilder::new(); - // Shut a bunch of stuff off - we're just spitting to stderr. - builder.set_location_level(LevelFilter::Trace); - builder.set_target_level(LevelFilter::Off); - builder.set_thread_level(LevelFilter::Off); - builder.set_time_level(LevelFilter::Off); - - let level = match verbosity { - 0 | 1 => LevelFilter::Info, - 2 => LevelFilter::Debug, - _ => LevelFilter::Trace, - }; - - let config = builder.build(); - - TermLogger::init(level, config.clone(), TerminalMode::Stderr) - .or_else(|_| SimpleLogger::init(level, config)) - .context("Couldn't init logger") -} - fn find_first_flt() -> Result> { for f in fs::read_dir(env::current_dir()?)? { let entry = f?; diff --git a/flt2vhs/Cargo.toml b/flt2vhs/Cargo.toml index 006c21e..55055be 100644 --- a/flt2vhs/Cargo.toml +++ b/flt2vhs/Cargo.toml @@ -10,12 +10,9 @@ edition = "2018" anyhow = "1.0" humansize = "1.0" log = "0.4" +logsetup = { version = "0.1", path = "../logsetup" } memmap = "0.7" rayon = "1.4" serde = "1.0" serde_derive = "1.0" structopt = "0.3.8" - -[dependencies.simplelog] -version = "0.7" -features = ["test"] diff --git a/flt2vhs/src/main.rs b/flt2vhs/src/main.rs index 42e2ff2..edd048b 100644 --- a/flt2vhs/src/main.rs +++ b/flt2vhs/src/main.rs @@ -5,7 +5,6 @@ use std::time::Instant; use anyhow::*; use humansize::{FileSize, file_size_opts as Sizes}; use log::*; -use simplelog::*; use structopt::StructOpt; mod flt; @@ -21,7 +20,11 @@ struct Args { #[structopt(short, long, parse(from_occurrences))] verbose: u8, - /// Prepend ISO-8601 timestamps to all trace messages + #[structopt(short, long, case_insensitive = true, default_value = "auto")] + #[structopt(name = "always/auto/never")] + color: logsetup::Color, + + /// Prepend ISO-8601 timestamps to all messages /// (from --verbose). Useful for benchmarking. #[structopt(short, long, verbatim_doc_comment)] timestamps: bool, @@ -43,7 +46,7 @@ fn main() -> Result<()> { let start_time = Instant::now(); let args = Args::from_args(); - init_logger(args.verbose, args.timestamps)?; + logsetup::init_logger(args.verbose, args.timestamps, args.color)?; let input = args.input; let output = args.output.ok_or(()).or_else(|_| default_output(&input))?; @@ -94,38 +97,6 @@ fn default_output(input: &Path) -> Result { )) } -/// Set up simplelog to spit messages to stderr. -fn init_logger(verbosity: u8, timestamps: bool) -> Result<()> { - let mut builder = ConfigBuilder::new(); - // Shut a bunch of stuff off - we're just spitting to stderr. - builder.set_location_level(LevelFilter::Trace); - builder.set_target_level(LevelFilter::Off); - builder.set_thread_level(LevelFilter::Off); - if timestamps { - builder.set_time_format_str("%+"); - builder.set_time_level(LevelFilter::Error); - } else { - builder.set_time_level(LevelFilter::Off); - } - - let level = match verbosity { - 0 => LevelFilter::Warn, - 1 => LevelFilter::Info, - 2 => LevelFilter::Debug, - _ => LevelFilter::Trace, - }; - - let config = builder.build(); - - if cfg!(test) { - TestLogger::init(level, config).context("Couldn't init test logger") - } else { - TermLogger::init(level, config.clone(), TerminalMode::Stderr) - .or_else(|_| SimpleLogger::init(level, config)) - .context("Couldn't init logger") - } -} - fn open_flt(f: &Path) -> Result { let fh = File::open(f).with_context(|| format!("Couldn't open {}", f.display()))?; let mapping = unsafe { memmap::Mmap::map(&fh) } diff --git a/logsetup/Cargo.toml b/logsetup/Cargo.toml new file mode 100644 index 0000000..e996689 --- /dev/null +++ b/logsetup/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "logsetup" +version = "0.1.0" +authors = ["Matt Kline "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0" +atty = "0.2" +structopt = "0.3.8" + +[dependencies.simplelog] +version = "0.10" +git = "https://github.com/mrkline/simplelog.rs" +branch = "optional-color" +features = ["test", "termcolor"] diff --git a/logsetup/src/lib.rs b/logsetup/src/lib.rs new file mode 100644 index 0000000..5d6da9f --- /dev/null +++ b/logsetup/src/lib.rs @@ -0,0 +1,56 @@ +use anyhow::*; +use structopt::clap::arg_enum; +use simplelog::*; + +arg_enum! { + #[derive(Debug, Copy, Clone)] + pub enum Color { + Auto, + Always, + Never + } +} + +/// Set up simplelog to spit messages to stderr. +pub fn init_logger(verbosity: u8, timestamps: bool, color: Color) -> Result<()> { + let mut builder = ConfigBuilder::new(); + // Shut a bunch of stuff off - we're just spitting to stderr. + builder.set_location_level(LevelFilter::Trace); + builder.set_target_level(LevelFilter::Off); + builder.set_thread_level(LevelFilter::Off); + if timestamps { + builder.set_time_format_str("%+"); + builder.set_time_level(LevelFilter::Error); + } else { + builder.set_time_level(LevelFilter::Off); + } + + let level = match verbosity { + 0 => LevelFilter::Warn, + 1 => LevelFilter::Info, + 2 => LevelFilter::Debug, + _ => LevelFilter::Trace, + }; + + let config = builder.build(); + + if cfg!(test) { + TestLogger::init(level, config).context("Couldn't init test logger") + } else { + let color = match color { + Color::Always => ColorChoice::AlwaysAnsi, + Color::Auto => { + if atty::is(atty::Stream::Stderr) { + ColorChoice::Auto + } else { + ColorChoice::Never + } + } + Color::Never => ColorChoice::Never, + }; + + TermLogger::init(level, config.clone(), TerminalMode::Stderr, color) + .or_else(|_| SimpleLogger::init(level, config)) + .context("Couldn't init logger") + } +} diff --git a/vhscat/Cargo.toml b/vhscat/Cargo.toml index d5e37a4..c46d447 100644 --- a/vhscat/Cargo.toml +++ b/vhscat/Cargo.toml @@ -9,11 +9,8 @@ edition = "2018" [dependencies] anyhow = "1.0" log = "0.4" +logsetup = { version = "0.1", path = "../logsetup" } serde = "1.0" serde_derive = "1.0" serde_json = "1.0" structopt = "0.3.8" - -[dependencies.simplelog] -version = "0.7" -features = ["test"] diff --git a/vhscat/src/main.rs b/vhscat/src/main.rs index 00fe765..28d5b05 100644 --- a/vhscat/src/main.rs +++ b/vhscat/src/main.rs @@ -5,7 +5,6 @@ use std::path::PathBuf; use anyhow::*; use log::*; -use simplelog::*; use structopt::StructOpt; mod acmitape; @@ -24,7 +23,11 @@ struct Args { #[structopt(short, long, parse(from_occurrences))] verbose: u8, - /// Prepend ISO-8601 timestamps to all trace messages + #[structopt(short, long, case_insensitive = true, default_value = "auto")] + #[structopt(name = "always/auto/never")] + color: logsetup::Color, + + /// Prepend ISO-8601 timestamps to all messages /// (from --verbose). Useful for benchmarking. #[structopt(short, long, verbatim_doc_comment)] timestamps: bool, @@ -36,7 +39,7 @@ struct Args { fn main() -> Result<()> { let args = Args::from_args(); - init_logger(args.verbose, args.timestamps)?; + logsetup::init_logger(args.verbose, args.timestamps, args.color)?; let stdin = io::stdin(); @@ -59,38 +62,6 @@ fn main() -> Result<()> { Ok(()) } -/// Set up simplelog to spit messages to stderr. -fn init_logger(verbosity: u8, timestamps: bool) -> Result<()> { - let mut builder = ConfigBuilder::new(); - // Shut a bunch of stuff off - we're just spitting to stderr. - builder.set_location_level(LevelFilter::Trace); - builder.set_target_level(LevelFilter::Off); - builder.set_thread_level(LevelFilter::Off); - if timestamps { - builder.set_time_format_str("%+"); - builder.set_time_level(LevelFilter::Error); - } else { - builder.set_time_level(LevelFilter::Off); - } - - let level = match verbosity { - 0 => LevelFilter::Warn, - 1 => LevelFilter::Info, - 2 => LevelFilter::Debug, - _ => LevelFilter::Trace, - }; - - let config = builder.build(); - - if cfg!(test) { - TestLogger::init(level, config).context("Couldn't init test logger") - } else { - TermLogger::init(level, config.clone(), TerminalMode::Stderr) - .or_else(|_| SimpleLogger::init(level, config)) - .context("Couldn't init logger") - } -} - struct CountedRead { inner: R, posit: u32, // Welcome to 1998, where files are always < 4 GB.