From e228fee479b7213e003002625bbc22b8091e9b4d Mon Sep 17 00:00:00 2001 From: Sven-Hendrik Haase Date: Wed, 5 Jul 2023 23:56:16 +0200 Subject: [PATCH] Fix ANSI color codes are printed when not a tty Fixes #1095. --- CHANGELOG.md | 1 + Cargo.lock | 54 ++++++++++++++++++++++++++++------------------------ Cargo.toml | 4 ++-- src/main.rs | 26 +++++++++++++------------ 4 files changed, 46 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cf312adc..36caca799 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] - ReleaseDate +- Fix ANSI color codes are printed when not a tty [#1095](https://github.com/svenstaro/miniserve/pull/1095) - Allow parameters to be provided via environment variables [#1160](https://github.com/svenstaro/miniserve/pull/1160) ## [0.23.2] - 2023-04-28 diff --git a/Cargo.lock b/Cargo.lock index f3e1f3cec..ae09ebfcb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -539,13 +539,12 @@ dependencies = [ [[package]] name = "bstr" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", - "once_cell", - "regex-automata 0.1.10", + "regex-automata", "serde", ] @@ -623,9 +622,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.10" +version = "4.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384e169cc618c613d5e3ca6404dda77a8685a63e08660dcc64abaf7da7cb0c7a" +checksum = "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d" dependencies = [ "clap_builder", "clap_derive", @@ -634,9 +633,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.10" +version = "4.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef137bbe35aab78bdb468ccfba75a5f4d8321ae011d34063770780545176af2d" +checksum = "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b" dependencies = [ "anstream", "anstyle", @@ -648,9 +647,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6b5c519bab3ea61843a7923d074b04245624bb84a64a8c150f5deb014e388b" +checksum = "5fc443334c81a804575546c5a8a79b4913b50e28d69232903604cada1de817ce" dependencies = [ "clap", ] @@ -695,6 +694,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "colored" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +dependencies = [ + "is-terminal", + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "comrak" version = "0.18.0" @@ -1251,7 +1261,7 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.2", + "rustls 0.21.3", "tokio", "tokio-rustls 0.24.1", ] @@ -1583,6 +1593,7 @@ dependencies = [ "clap", "clap_complete", "clap_mangen", + "colored", "comrak", "fake-tty", "fast_qr", @@ -1615,7 +1626,6 @@ dependencies = [ "tar", "thiserror", "url", - "yansi", "zip", ] @@ -1985,16 +1995,10 @@ checksum = "89089e897c013b3deb627116ae56a6955a72b8bed395c9526af31c9fe528b484" dependencies = [ "aho-corasick 1.0.2", "memchr", - "regex-automata 0.3.0", + "regex-automata", "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-automata" version = "0.3.0" @@ -2042,7 +2046,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.2", + "rustls 0.21.3", "rustls-pemfile", "serde", "serde_json", @@ -2170,9 +2174,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32ca28af694bc1bbf399c33a516dbdf1c90090b8ab23c2bc24f834aa2247f5f" +checksum = "b19faa85ecb5197342b54f987b142fb3e30d0c90da40f80ef4fa9a726e6676ed" dependencies = [ "log", "ring", @@ -2191,9 +2195,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.100.1" +version = "0.101.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +checksum = "89efed4bd0af2a8de0feb22ba38030244c93db56112b8aa67d27022286852b1c" dependencies = [ "ring", "untrusted", @@ -2652,7 +2656,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.2", + "rustls 0.21.3", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index d79600b54..46776b83c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,13 +31,14 @@ chrono-humanize = "0.2" clap = { version = "4", features = ["derive", "cargo", "wrap_help", "deprecated", "env"] } clap_complete = "4" clap_mangen = "0.2" +colored = "2" comrak = { version = "0.18", default-features = false } fast_qr = { version = "0.9", features = ["svg"] } futures = "0.3" -if-addrs = "0.10" hex = "0.4" http = "0.2" httparse = "1" +if-addrs = "0.10" libflate = "1" log = "0.4" maud = "0.25" @@ -55,7 +56,6 @@ socket2 = "0.5" strum = { version = "0.25", features = ["derive"] } tar = "0.4" thiserror = "1" -yansi = "0.5" zip = { version = "0.6.5", default-features = false } [features] diff --git a/src/main.rs b/src/main.rs index 47d430309..2f81baaa7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,9 +10,9 @@ use actix_web::{ use actix_web_httpauth::middleware::HttpAuthentication; use anyhow::Result; use clap::{crate_version, CommandFactory, Parser}; +use colored::*; use fast_qr::QRBuilder; use log::{error, warn}; -use yansi::{Color, Paint}; mod archive; mod args; @@ -57,10 +57,6 @@ fn main() -> Result<()> { #[actix_web::main(miniserve)] async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { - if cfg!(windows) && !Paint::enable_windows_ascii() { - Paint::disable(); - } - let log_level = if miniserve_config.verbose { simplelog::LevelFilter::Info } else { @@ -69,9 +65,15 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { simplelog::TermLogger::init( log_level, - simplelog::Config::default(), + simplelog::ConfigBuilder::new() + .set_time_format_rfc2822() + .build(), simplelog::TerminalMode::Mixed, - simplelog::ColorChoice::Auto, + if io::stdout().is_terminal() { + simplelog::ColorChoice::Auto + } else { + simplelog::ColorChoice::Never + }, ) .or_else(|_| simplelog::SimpleLogger::init(log_level, simplelog::Config::default())) .expect("Couldn't initialize logger"); @@ -102,7 +104,7 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { println!( "{name} v{version}", - name = Paint::new("miniserve").bold(), + name = "miniserve".bold(), version = crate_version!() ); if !miniserve_config.path_explicitly_chosen { @@ -176,7 +178,7 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { let display_sockets = socket_addresses .iter() - .map(|sock| Color::Green.paint(sock.to_string()).bold().to_string()) + .map(|sock| sock.to_string().green().bold().to_string()) .collect::>(); let srv = actix_web::HttpServer::new(move || { @@ -220,13 +222,13 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { println!("Bound to {}", display_sockets.join(", ")); - println!("Serving path {}", Color::Yellow.paint(path_string).bold()); + println!("Serving path {}", path_string.yellow().bold()); println!( "Available at (non-exhaustive list):\n {}\n", display_urls .iter() - .map(|url| Color::Green.paint(url).bold().to_string()) + .map(|url| url.green().bold().to_string()) .collect::>() .join("\n "), ); @@ -239,7 +241,7 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { { match QRBuilder::new(url.clone()).ecl(consts::QR_EC_LEVEL).build() { Ok(qr) => { - println!("QR code for {}:", Color::Green.paint(url).bold()); + println!("QR code for {}:", url.green().bold()); qr.print(); } Err(e) => {