diff --git a/Cargo.lock b/Cargo.lock index c6f698d..0c0ba8e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -761,9 +761,9 @@ dependencies = [ [[package]] name = "nix_rs" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640389ae56d34b0dd72b5345b82c548b4f544ba577b21abbafbf13f045438503" +checksum = "b5712ffd9aab86c07b33fea3945af83aab00d01679f385407b228b0bd7b6a850" dependencies = [ "cfg-if", "colored", diff --git a/Cargo.toml b/Cargo.toml index 6520421..ef35999 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ reqwest = { version = "0.11", features = ["blocking", "json"] } try-guard = "0.2.0" clap = { version = "4.4", features = ["derive"] } urlencoding = "2.1.3" -nix_rs = { version = "0.1.7", features = ["ssr"] } +nix_rs = { version = "0.1.8", features = ["ssr"] } tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } tracing = "0.1.37" diff --git a/src/lib.rs b/src/lib.rs index 8aeffb9..b04c1aa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,10 @@ pub mod cli; pub mod config; pub mod github; +pub mod logging; pub mod nix; -use std::{collections::HashSet, io}; +use std::collections::HashSet; use cli::CliArgs; use colored::Colorize; @@ -11,7 +12,7 @@ use nix::{ devour_flake::{DevourFlakeOutput, DrvOut}, url::FlakeUrl, }; -use tracing::{instrument, Level}; +use tracing::instrument; /// Run nixci on the given [CliArgs], returning the built outputs in sorted order. #[instrument(name = "nixci", skip(args))] @@ -51,21 +52,3 @@ async fn nixci_subflake( } Ok(outs) } - -pub fn setup_logging(verbose: bool) { - let env_filter = if verbose { - "nixci=debug,nix_rs=debug" - } else { - "nixci=info,nix_rs=info" - }; - let builder = tracing_subscriber::fmt() - .with_writer(io::stderr) - .with_max_level(Level::INFO) - .with_env_filter(env_filter) - .compact(); - if !verbose { - builder.without_time().init() - } else { - builder.init() - } -} diff --git a/src/logging.rs b/src/logging.rs new file mode 100644 index 0000000..b100b41 --- /dev/null +++ b/src/logging.rs @@ -0,0 +1,53 @@ +use std::fmt; +use std::io; + +use tracing::{Event, Level, Subscriber}; +use tracing_subscriber::fmt::format; +use tracing_subscriber::{ + fmt::{FmtContext, FormatEvent, FormatFields}, + registry::LookupSpan, +}; + +/// A [tracing_subscriber] event formatter that suppresses everything but the +/// log message. +/// +/// Level/target are displayed for non-INFO messages. +struct BareFormatter; + +impl FormatEvent for BareFormatter +where + S: Subscriber + for<'a> LookupSpan<'a>, + N: for<'a> FormatFields<'a> + 'static, +{ + fn format_event( + &self, + ctx: &FmtContext<'_, S, N>, + mut writer: format::Writer<'_>, + event: &Event<'_>, + ) -> fmt::Result { + let metadata = event.metadata(); + if metadata.level() != &Level::INFO { + write!(&mut writer, "{} {}: ", metadata.level(), metadata.target())?; + } + ctx.field_format().format_fields(writer.by_ref(), event)?; + writeln!(writer) + } +} + +pub fn setup_logging(verbose: bool) { + let env_filter = if verbose { + "nixci=debug,nix_rs=debug" + } else { + "nixci=info,nix_rs=info" + }; + let builder = tracing_subscriber::fmt() + .with_writer(io::stderr) + .with_max_level(Level::INFO) + .with_env_filter(env_filter); + + if !verbose { + builder.event_format(BareFormatter).init(); + } else { + builder.init() + } +} diff --git a/src/main.rs b/src/main.rs index daf9324..6118f09 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ use nixci::cli; #[tokio::main] async fn main() -> Result<()> { let args = cli::CliArgs::parse(); - nixci::setup_logging(args.verbose); + nixci::logging::setup_logging(args.verbose); let _outs = nixci::nixci(args).await?; Ok(()) } diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 5defc1b..9e4bf3e 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -10,7 +10,7 @@ mod integration_test { #[ctor::ctor] fn init() { - nixci::setup_logging(true); + nixci::logging::setup_logging(true); } #[tokio::test]