From e8fc390ed722faf90af0b129272af79ab754c655 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 13 Mar 2023 14:18:09 -0500 Subject: [PATCH 1/8] feat(stream): Support NO_COLOR --- crates/anstyle-stream/src/auto.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/anstyle-stream/src/auto.rs b/crates/anstyle-stream/src/auto.rs index 84dabd15..2bf8644d 100644 --- a/crates/anstyle-stream/src/auto.rs +++ b/crates/anstyle-stream/src/auto.rs @@ -30,7 +30,7 @@ where pub fn new(raw: S, choice: ColorChoice) -> Self { match choice { ColorChoice::Auto => { - if raw.is_terminal() { + if raw.is_terminal() && !concolor_query::no_color() { Self::always(raw) } else { Self::never(raw) From da85f2ae9642c629cdaaeee97aec986386e206da Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 13 Mar 2023 14:48:49 -0500 Subject: [PATCH 2/8] feat(stream): Support TERM detection --- crates/anstyle-stream/src/auto.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/anstyle-stream/src/auto.rs b/crates/anstyle-stream/src/auto.rs index 2bf8644d..0e736f27 100644 --- a/crates/anstyle-stream/src/auto.rs +++ b/crates/anstyle-stream/src/auto.rs @@ -30,7 +30,10 @@ where pub fn new(raw: S, choice: ColorChoice) -> Self { match choice { ColorChoice::Auto => { - if raw.is_terminal() && !concolor_query::no_color() { + if raw.is_terminal() + && !concolor_query::no_color() + && concolor_query::term_supports_color() + { Self::always(raw) } else { Self::never(raw) From 3d2e1076ac54049aedb245121a93f5959b785ce2 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 13 Mar 2023 14:54:49 -0500 Subject: [PATCH 3/8] feat(stream): Support CLICOLOR override --- crates/anstyle-stream/src/auto.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/anstyle-stream/src/auto.rs b/crates/anstyle-stream/src/auto.rs index 0e736f27..e32bf909 100644 --- a/crates/anstyle-stream/src/auto.rs +++ b/crates/anstyle-stream/src/auto.rs @@ -33,6 +33,7 @@ where if raw.is_terminal() && !concolor_query::no_color() && concolor_query::term_supports_color() + && concolor_query::clicolor() { Self::always(raw) } else { From 2a29b93b30834d2b88ed91371e9883f8ce39d3ff Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 13 Mar 2023 14:59:38 -0500 Subject: [PATCH 4/8] feat(stream): Support CLICOLOR_FORCE override --- crates/anstyle-stream/src/auto.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/anstyle-stream/src/auto.rs b/crates/anstyle-stream/src/auto.rs index e32bf909..f8ac68af 100644 --- a/crates/anstyle-stream/src/auto.rs +++ b/crates/anstyle-stream/src/auto.rs @@ -34,6 +34,7 @@ where && !concolor_query::no_color() && concolor_query::term_supports_color() && concolor_query::clicolor() + || concolor_query::clicolor_force() { Self::always(raw) } else { From 47e7a2c21b8e64843cee1dff15fe9871cc482c19 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 13 Mar 2023 15:13:10 -0500 Subject: [PATCH 5/8] fix(stream): Build with wincon and not auto --- crates/anstyle-stream/src/auto.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/anstyle-stream/src/auto.rs b/crates/anstyle-stream/src/auto.rs index f8ac68af..6db78b03 100644 --- a/crates/anstyle-stream/src/auto.rs +++ b/crates/anstyle-stream/src/auto.rs @@ -78,7 +78,12 @@ where pub fn always(raw: S) -> Self { #[cfg(feature = "wincon")] { - if raw.is_terminal() && !concolor_query::windows::enable_ansi_colors().unwrap_or(true) { + #[cfg(feature = "auto")] + let use_wincon = + raw.is_terminal() && !concolor_query::windows::enable_ansi_colors().unwrap_or(true); + #[cfg(not(feature = "auto"))] + let use_wincon = cfg!(windows); + if use_wincon { Self::wincon(raw).unwrap_or_else(|raw| Self::always_ansi_(raw)) } else { Self::always_ansi_(raw) From f2448efadb8bc87af4a9bd2f271fa8a41cabb95e Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 13 Mar 2023 15:17:24 -0500 Subject: [PATCH 6/8] refactor(stream): Clean up 'AutoStream::always' --- crates/anstyle-stream/src/auto.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/crates/anstyle-stream/src/auto.rs b/crates/anstyle-stream/src/auto.rs index 6db78b03..39f790ef 100644 --- a/crates/anstyle-stream/src/auto.rs +++ b/crates/anstyle-stream/src/auto.rs @@ -76,21 +76,20 @@ where /// Force color, no matter what the inner `Write` supports. #[inline] pub fn always(raw: S) -> Self { - #[cfg(feature = "wincon")] - { + if cfg!(windows) { #[cfg(feature = "auto")] let use_wincon = raw.is_terminal() && !concolor_query::windows::enable_ansi_colors().unwrap_or(true); #[cfg(not(feature = "auto"))] - let use_wincon = cfg!(windows); + let use_wincon = true; if use_wincon { Self::wincon(raw).unwrap_or_else(|raw| Self::always_ansi_(raw)) } else { Self::always_ansi_(raw) } + } else { + Self::always_ansi(raw) } - #[cfg(not(feature = "wincon"))] - Self::always_ansi(raw) } /// Only pass printable data to the inner `Write`. @@ -101,7 +100,6 @@ where } #[inline] - #[cfg(feature = "wincon")] fn wincon(raw: S) -> Result { #[cfg(feature = "wincon")] { From 102e8ac80bc781ac2b2c6d6a5aeec8386b5383dc Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 13 Mar 2023 15:23:22 -0500 Subject: [PATCH 7/8] feat(stream): Check for TERM for ANSI on Windows --- crates/anstyle-stream/src/auto.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/anstyle-stream/src/auto.rs b/crates/anstyle-stream/src/auto.rs index 39f790ef..0cadcec7 100644 --- a/crates/anstyle-stream/src/auto.rs +++ b/crates/anstyle-stream/src/auto.rs @@ -78,8 +78,9 @@ where pub fn always(raw: S) -> Self { if cfg!(windows) { #[cfg(feature = "auto")] - let use_wincon = - raw.is_terminal() && !concolor_query::windows::enable_ansi_colors().unwrap_or(true); + let use_wincon = raw.is_terminal() + && !concolor_query::windows::enable_ansi_colors().unwrap_or(true) + && !concolor_query::term_supports_ansi_color(); #[cfg(not(feature = "auto"))] let use_wincon = true; if use_wincon { From 310aa0d1ecfab394f61526903f683ac895344e05 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 13 Mar 2023 16:03:55 -0500 Subject: [PATCH 8/8] fix(stream): Correctly handle both CLICOLOR cases --- Cargo.lock | 6 +++--- crates/anstyle-stream/Cargo.toml | 2 +- crates/anstyle-stream/src/auto.rs | 7 +++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9d69fa63..401f768c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -101,7 +101,7 @@ dependencies = [ "anstyle-parse", "anstyle-wincon", "concolor-override", - "concolor-query 0.2.0", + "concolor-query 0.3.0", "criterion", "is-terminal", "owo-colors", @@ -313,9 +313,9 @@ checksum = "82a90734b3d5dcf656e7624cca6bce9c3a90ee11f900e80141a7427ccfb3d317" [[package]] name = "concolor-query" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71cd70b9f86dd588a4a08471ebbd5847cb25f0116aaddeace95470cce096ff7d" +checksum = "534eb40da54945b820debad8620cdcf0b2be6f174f139d34f373a29ab688a1d3" dependencies = [ "windows-sys 0.45.0", ] diff --git a/crates/anstyle-stream/Cargo.toml b/crates/anstyle-stream/Cargo.toml index 09cbfc0b..f068191a 100644 --- a/crates/anstyle-stream/Cargo.toml +++ b/crates/anstyle-stream/Cargo.toml @@ -34,7 +34,7 @@ anstyle = { version = "0.3.0", path = "../anstyle" } anstyle-parse = { version = "0.1.0", path = "../anstyle-parse" } anstyle-wincon = { version = "0.1.0", path = "../anstyle-wincon", optional = true } concolor-override = { version = "1.0.0", optional = true } -concolor-query = { version = "0.2.0", optional = true } +concolor-query = { version = "0.3.0", optional = true } is-terminal = { version = "0.4.4", optional = true } utf8parse = "0.2.1" diff --git a/crates/anstyle-stream/src/auto.rs b/crates/anstyle-stream/src/auto.rs index 0cadcec7..88129c9e 100644 --- a/crates/anstyle-stream/src/auto.rs +++ b/crates/anstyle-stream/src/auto.rs @@ -30,10 +30,13 @@ where pub fn new(raw: S, choice: ColorChoice) -> Self { match choice { ColorChoice::Auto => { + let clicolor = concolor_query::clicolor(); + let clicolor_enabled = clicolor.unwrap_or(false); + let clicolor_disabled = !clicolor.unwrap_or(true); if raw.is_terminal() && !concolor_query::no_color() - && concolor_query::term_supports_color() - && concolor_query::clicolor() + && !clicolor_disabled + && (concolor_query::term_supports_color() || clicolor_enabled) || concolor_query::clicolor_force() { Self::always(raw)