From a8f4ddbe0533cc17fba98cc7292a434ff2dc381c Mon Sep 17 00:00:00 2001 From: Pauan Date: Wed, 24 Jul 2019 07:26:55 +0200 Subject: [PATCH 1/6] Adding in --quiet flag to suppress warnings --- src/lib.rs | 6 +++++- src/main.rs | 6 ++++++ src/progressbar.rs | 45 ++++++++++++++++++++++++++++++++++----------- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index bfe7dd2..c1feefc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,7 +47,7 @@ pub mod wasm_opt; use progressbar::ProgressOutput; /// The global progress bar and user-facing message output. -pub static PBAR: ProgressOutput = ProgressOutput; +pub static PBAR: ProgressOutput = ProgressOutput::new(); /// 📦 ✨ pack and publish your wasm! #[derive(Debug, StructOpt)] @@ -59,4 +59,8 @@ pub struct Cli { /// Log verbosity is based off the number of v used #[structopt(long = "verbose", short = "v", parse(from_occurrences))] pub verbosity: u8, + + #[structopt(long = "quiet")] + /// Silences wasm-pack warnings. + pub quiet: bool, } diff --git a/src/main.rs b/src/main.rs index ad9b152..0eb8636 100644 --- a/src/main.rs +++ b/src/main.rs @@ -76,6 +76,12 @@ fn run() -> Result<(), failure::Error> { } let args = Cli::from_args(); + + if args.quiet { + PBAR.set_quiet(true); + log::set_max_level(log::LevelFilter::Error); + } + run_wasm_pack(args.cmd)?; if let Ok(wasm_pack_version) = wasm_pack_version.try_recv() { diff --git a/src/progressbar.rs b/src/progressbar.rs index 50eea02..9daa7f9 100644 --- a/src/progressbar.rs +++ b/src/progressbar.rs @@ -1,32 +1,55 @@ //! Fancy progress bar functionality. +use std::sync::atomic::{AtomicBool, Ordering}; use console::style; use emoji; /// Synchronized progress bar and status message printing. -pub struct ProgressOutput; +pub struct ProgressOutput { + quiet: AtomicBool, +} impl ProgressOutput { + /// Returns a new ProgressOutput + pub const fn new() -> Self { + Self { + quiet: AtomicBool::new(false), + } + } + /// Print the given message. fn message(&self, message: &str) { eprintln!("{}", message); } + fn quiet(&self) -> bool { + self.quiet.load(Ordering::SeqCst) + } + + /// Sets whether it should silence warnings or not + pub fn set_quiet(&self, quiet: bool) { + self.quiet.store(quiet, Ordering::SeqCst); + } + /// Add an informational message. pub fn info(&self, message: &str) { - let info = format!("{}: {}", style("[INFO]").bold().dim(), message,); - self.message(&info); + if !self.quiet() { + let info = format!("{}: {}", style("[INFO]").bold().dim(), message,); + self.message(&info); + } } /// Add a warning message. pub fn warn(&self, message: &str) { - let warn = format!( - "{} {}: {}", - emoji::WARN, - style("[WARN]").bold().dim(), - message - ); - self.message(&warn); + if !self.quiet() { + let warn = format!( + "{} {}: {}", + emoji::WARN, + style("[WARN]").bold().dim(), + message + ); + self.message(&warn); + } } /// Add an error message. @@ -43,6 +66,6 @@ impl ProgressOutput { impl Default for ProgressOutput { fn default() -> Self { - ProgressOutput + ProgressOutput::new() } } From a522ed6c420ee048565fedc30913b4191ac7c8d6 Mon Sep 17 00:00:00 2001 From: Pauan Date: Wed, 24 Jul 2019 07:28:00 +0200 Subject: [PATCH 2/6] Running cargo fmt --- src/progressbar.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/progressbar.rs b/src/progressbar.rs index 9daa7f9..f42a99c 100644 --- a/src/progressbar.rs +++ b/src/progressbar.rs @@ -1,8 +1,8 @@ //! Fancy progress bar functionality. -use std::sync::atomic::{AtomicBool, Ordering}; use console::style; use emoji; +use std::sync::atomic::{AtomicBool, Ordering}; /// Synchronized progress bar and status message printing. pub struct ProgressOutput { From fc57f09688b0c68fab3e3667e54634f440907bae Mon Sep 17 00:00:00 2001 From: Pauan Date: Thu, 25 Jul 2019 07:48:33 +0200 Subject: [PATCH 3/6] Adding in log-level flag; also changing quiet to silence all stdout --- src/build/mod.rs | 15 +++++++++++ src/install/mod.rs | 4 +++ src/lib.rs | 6 ++++- src/main.rs | 3 ++- src/progressbar.rs | 65 +++++++++++++++++++++++++++++++++++++--------- src/test/mod.rs | 10 +++++++ 6 files changed, 89 insertions(+), 14 deletions(-) diff --git a/src/build/mod.rs b/src/build/mod.rs index 4e5bb11..2fb75e1 100644 --- a/src/build/mod.rs +++ b/src/build/mod.rs @@ -85,8 +85,14 @@ pub fn cargo_build_wasm( ) -> Result<(), Error> { let msg = format!("{}Compiling to Wasm...", emoji::CYCLONE); PBAR.info(&msg); + let mut cmd = Command::new("cargo"); cmd.current_dir(path).arg("build").arg("--lib"); + + if PBAR.quiet() { + cmd.arg("--quiet"); + } + match profile { BuildProfile::Profiling => { // Once there are DWARF debug info consumers, force enable debug @@ -104,6 +110,7 @@ pub fn cargo_build_wasm( // debug info by default. } } + cmd.arg("--target").arg("wasm32-unknown-unknown"); cmd.args(extra_options); child::run(cmd, "cargo build").context("Compiling your crate to WebAssembly failed")?; @@ -116,11 +123,19 @@ pub fn cargo_build_wasm( /// wasm-bindgen-cli to use when running tests. pub fn cargo_build_wasm_tests(path: &Path, debug: bool) -> Result<(), Error> { let mut cmd = Command::new("cargo"); + cmd.current_dir(path).arg("build").arg("--tests"); + + if PBAR.quiet() { + cmd.arg("--quiet"); + } + if !debug { cmd.arg("--release"); } + cmd.arg("--target").arg("wasm32-unknown-unknown"); + child::run(cmd, "cargo build").context("Compilation of your program failed")?; Ok(()) } diff --git a/src/install/mod.rs b/src/install/mod.rs index 7009c28..7999916 100644 --- a/src/install/mod.rs +++ b/src/install/mod.rs @@ -210,6 +210,10 @@ pub fn cargo_install( .arg("--root") .arg(&tmp); + if PBAR.quiet() { + cmd.arg("--quiet"); + } + let context = format!("Installing {} with cargo", tool); child::run(cmd, "cargo install").context(context)?; diff --git a/src/lib.rs b/src/lib.rs index c1feefc..6a91f40 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,7 +44,7 @@ pub mod target; pub mod test; pub mod wasm_opt; -use progressbar::ProgressOutput; +use progressbar::{LogLevel, ProgressOutput}; /// The global progress bar and user-facing message output. pub static PBAR: ProgressOutput = ProgressOutput::new(); @@ -63,4 +63,8 @@ pub struct Cli { #[structopt(long = "quiet")] /// Silences wasm-pack warnings. pub quiet: bool, + + #[structopt(long = "log-level", default_value = "info")] + /// The maximum level of messages that should be logged by wasm-pack. [possible values: info, warn, error] + pub log_level: LogLevel, } diff --git a/src/main.rs b/src/main.rs index 0eb8636..e098c3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -77,9 +77,10 @@ fn run() -> Result<(), failure::Error> { let args = Cli::from_args(); + PBAR.set_log_level(args.log_level); + if args.quiet { PBAR.set_quiet(true); - log::set_max_level(log::LevelFilter::Error); } run_wasm_pack(args.cmd)?; diff --git a/src/progressbar.rs b/src/progressbar.rs index f42a99c..94ef6da 100644 --- a/src/progressbar.rs +++ b/src/progressbar.rs @@ -2,11 +2,38 @@ use console::style; use emoji; -use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::atomic::{AtomicBool, AtomicU8, Ordering}; + +#[repr(u8)] +#[derive(Debug, Clone, Copy)] +/// The maximum log level for wasm-pack +// The ordering is important: the least verbose must be at +// the top and the most verbose at the bottom +pub enum LogLevel { + /// Logs only error + Error, + /// Logs only warn and error + Warn, + /// Logs everything + Info, +} + +impl std::str::FromStr for LogLevel { + type Err = failure::Error; + fn from_str(s: &str) -> Result { + match s { + "error" => Ok(LogLevel::Error), + "warn" => Ok(LogLevel::Warn), + "info" => Ok(LogLevel::Info), + _ => bail!("Unknown log-level: {}", s), + } + } +} /// Synchronized progress bar and status message printing. pub struct ProgressOutput { quiet: AtomicBool, + log_level: AtomicU8, } impl ProgressOutput { @@ -14,6 +41,7 @@ impl ProgressOutput { pub const fn new() -> Self { Self { quiet: AtomicBool::new(false), + log_level: AtomicU8::new(LogLevel::Info as u8), } } @@ -22,18 +50,29 @@ impl ProgressOutput { eprintln!("{}", message); } - fn quiet(&self) -> bool { + /// Returns whether it should silence stdout or not + pub fn quiet(&self) -> bool { self.quiet.load(Ordering::SeqCst) } - /// Sets whether it should silence warnings or not + /// Causes it to silence stdout pub fn set_quiet(&self, quiet: bool) { self.quiet.store(quiet, Ordering::SeqCst); } + /// Returns whether the specified log level is enabled or not + pub fn is_log_enabled(&self, level: LogLevel) -> bool { + (level as u8) <= self.log_level.load(Ordering::SeqCst) + } + + /// Sets the log level for wasm-pack + pub fn set_log_level(&self, log_level: LogLevel) { + self.log_level.store(log_level as u8, Ordering::SeqCst); + } + /// Add an informational message. pub fn info(&self, message: &str) { - if !self.quiet() { + if !self.quiet() && self.is_log_enabled(LogLevel::Info) { let info = format!("{}: {}", style("[INFO]").bold().dim(), message,); self.message(&info); } @@ -41,7 +80,7 @@ impl ProgressOutput { /// Add a warning message. pub fn warn(&self, message: &str) { - if !self.quiet() { + if !self.quiet() && self.is_log_enabled(LogLevel::Warn) { let warn = format!( "{} {}: {}", emoji::WARN, @@ -54,13 +93,15 @@ impl ProgressOutput { /// Add an error message. pub fn error(&self, message: &str) { - let err = format!( - "{} {}: {}", - emoji::ERROR, - style("[ERR]").bold().dim(), - message - ); - self.message(&err); + if self.is_log_enabled(LogLevel::Error) { + let err = format!( + "{} {}: {}", + emoji::ERROR, + style("[ERR]").bold().dim(), + message + ); + self.message(&err); + } } } diff --git a/src/test/mod.rs b/src/test/mod.rs index 8edecf0..513e8fa 100644 --- a/src/test/mod.rs +++ b/src/test/mod.rs @@ -2,6 +2,7 @@ pub mod webdriver; +use crate::PBAR; use child; use failure::{self, ResultExt}; use std::ffi::OsStr; @@ -22,13 +23,22 @@ where V: AsRef, { let mut cmd = Command::new("cargo"); + cmd.envs(envs); cmd.current_dir(path).arg("test"); + + if PBAR.quiet() { + cmd.arg("--quiet"); + } + if release { cmd.arg("--release"); } + cmd.arg("--target").arg("wasm32-unknown-unknown"); + cmd.args(extra_options); + child::run(cmd, "cargo test").context("Running Wasm tests with wasm-bindgen-test failed")?; // NB: `child::run` took care of ensuring that test output gets printed. From bf04deee35c864dd15354f3e77bff3d24acd9ec6 Mon Sep 17 00:00:00 2001 From: Pauan Date: Fri, 26 Jul 2019 08:03:17 +0200 Subject: [PATCH 4/6] Adding in -q flag --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6a91f40..1518d36 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -60,8 +60,8 @@ pub struct Cli { #[structopt(long = "verbose", short = "v", parse(from_occurrences))] pub verbosity: u8, - #[structopt(long = "quiet")] - /// Silences wasm-pack warnings. + #[structopt(long = "quiet", short = "q")] + /// No output printed to stdout pub quiet: bool, #[structopt(long = "log-level", default_value = "info")] From a39129ebd08787cac156af849294e214f9599f0a Mon Sep 17 00:00:00 2001 From: Pauan Date: Fri, 26 Jul 2019 17:33:01 +0200 Subject: [PATCH 5/6] Adding in docs --- docs/src/commands/index.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/src/commands/index.md b/docs/src/commands/index.md index 2ad2d70..45a5a0e 100644 --- a/docs/src/commands/index.md +++ b/docs/src/commands/index.md @@ -14,3 +14,23 @@ a Rust-generated WebAssembly project. [build]: ./build.html [new]: ./new.html [pack-pub]: ./pack-and-publish.html + +### Log levels + +By default `wasm-pack` displays a lot of useful information. + +You can cause it to display even *more* information by using `--verbose`, or you can silence *all* stdout by using `--quiet`. + +You can also use `--log-level` to have fine-grained control over wasm-pack's log output: + +* `--log-level info` is the default, it causes all messages to be logged. +* `--log-level warn` causes warnings and errors to be displayed, but not info. +* `--log-level error` causes only errors to be displayed. + +These flags are global flags, so they can be used with every command, and they must come *before* the command: + +```sh +wasm-pack --log-level error build +wasm-pack --quiet build +wasm-pack --verbose build +``` From d04ee6c04c44926a57bf5f7b7f9f6435156886d4 Mon Sep 17 00:00:00 2001 From: Pauan Date: Fri, 26 Jul 2019 18:40:29 +0200 Subject: [PATCH 6/6] Adding in unit tests for --quiet and --log-level --- tests/all/log_level.rs | 91 ++++++++++++++++++++++++++++++++++++++++++ tests/all/main.rs | 1 + 2 files changed, 92 insertions(+) create mode 100644 tests/all/log_level.rs diff --git a/tests/all/log_level.rs b/tests/all/log_level.rs new file mode 100644 index 0000000..ea129a0 --- /dev/null +++ b/tests/all/log_level.rs @@ -0,0 +1,91 @@ +use assert_cmd::prelude::*; +use predicates::boolean::PredicateBooleanExt; +use predicates::prelude::predicate::str::contains; +use predicates::reflection::PredicateReflection; +use predicates::Predicate; +use utils; + +fn matches_info() -> impl Predicate + PredicateReflection { + contains("[INFO]: Checking for the Wasm target...") + .and(contains("[INFO]: Compiling to Wasm...")) + .and(contains("[INFO]: License key is set in Cargo.toml but no LICENSE file(s) were found; Please add the LICENSE file(s) to your project directory")) + .and(contains("[INFO]: Installing wasm-bindgen...")) + .and(contains("[INFO]: Optimizing wasm binaries with `wasm-opt`...")) + .and(contains("[INFO]: :-) Done in ")) + .and(contains("[INFO]: :-) Your wasm pkg is ready to publish at ")) +} + +fn matches_warn() -> impl Predicate + PredicateReflection { + contains(":-) [WARN]: origin crate has no README") +} + +fn matches_cargo() -> impl Predicate + PredicateReflection { + contains("Finished release [optimized] target(s) in ") +} + +#[test] +fn quiet() { + utils::fixture::Fixture::new() + .cargo_toml("js-hello-world") + .hello_world_src_lib() + .wasm_pack() + .arg("--quiet") + .arg("build") + .assert() + .success() + .stdout("") + .stderr(""); +} + +#[test] +fn log_level_info() { + utils::fixture::Fixture::new() + .cargo_toml("js-hello-world") + .hello_world_src_lib() + .wasm_pack() + .arg("--log-level") + .arg("info") + .arg("build") + .assert() + .success() + .stdout("") + .stderr(matches_cargo().and(matches_warn()).and(matches_info())); +} + +#[test] +fn log_level_warn() { + utils::fixture::Fixture::new() + .cargo_toml("js-hello-world") + .hello_world_src_lib() + .wasm_pack() + .arg("--log-level") + .arg("warn") + .arg("build") + .assert() + .success() + .stdout("") + .stderr( + matches_cargo() + .and(matches_warn()) + .and(matches_info().not()), + ); +} + +#[test] +fn log_level_error() { + utils::fixture::Fixture::new() + .cargo_toml("js-hello-world") + .hello_world_src_lib() + .wasm_pack() + .arg("--log-level") + .arg("error") + .arg("build") + .assert() + .success() + .stdout("") + .stderr( + matches_cargo() + .and(matches_warn().not()) + .and(matches_info().not()), + ); +} diff --git a/tests/all/main.rs b/tests/all/main.rs index 5abc58d..30ce2f9 100644 --- a/tests/all/main.rs +++ b/tests/all/main.rs @@ -16,6 +16,7 @@ mod download; mod generate; mod license; mod lockfile; +mod log_level; mod manifest; mod readme; mod test;