diff --git a/rust/rhg/src/commands/status.rs b/rust/rhg/src/commands/status.rs --- a/rust/rhg/src/commands/status.rs +++ b/rust/rhg/src/commands/status.rs @@ -183,7 +183,7 @@ let config = invocation.config; let args = invocation.subcommand_args; - let verbose = !ui.plain() + let verbose = !ui.plain(None) && !args.is_present("print0") && (config.get_bool(b"ui", b"verbose")? || config.get_bool(b"commands", b"status.verbose")?); @@ -312,7 +312,7 @@ } } } - let relative_paths = (!ui.plain()) + let relative_paths = (!ui.plain(None)) && config .get_option(b"commands", b"status.relative")? .unwrap_or(config.get_bool(b"ui", b"relative-paths")?); diff --git a/rust/rhg/src/main.rs b/rust/rhg/src/main.rs --- a/rust/rhg/src/main.rs +++ b/rust/rhg/src/main.rs @@ -669,7 +669,9 @@ } if let Some(color) = config.get(b"ui", b"color") { - if (color == b"always" || color == b"debug") && !ui.plain() { + if (color == b"always" || color == b"debug") + && !ui.plain(Some("color")) + { Err(CommandError::unsupported("colored output"))? } } diff --git a/rust/rhg/src/ui.rs b/rust/rhg/src/ui.rs --- a/rust/rhg/src/ui.rs +++ b/rust/rhg/src/ui.rs @@ -1,4 +1,5 @@ use format_bytes::format_bytes; +use hg::utils::files::get_bytes_from_os_string; use std::borrow::Cow; use std::env; use std::io; @@ -65,8 +66,19 @@ /// - False if HGPLAIN is not set, or feature is in HGPLAINEXCEPT /// - False if feature is disabled by default and not included in HGPLAIN /// - True otherwise - pub fn plain(&self) -> bool { - // TODO: add support for HGPLAINEXCEPT + pub fn plain(&self, feature: Option<&str>) -> bool { + plain(feature) + } +} + +fn plain(opt_feature: Option<&str>) -> bool { + if let Some(except) = env::var_os("HGPLAINEXCEPT") { + opt_feature.map_or(true, |feature| { + get_bytes_from_os_string(except) + .split(|&byte| byte == b',') + .all(|exception| exception != feature.as_bytes()) + }) + } else { env::var_os("HGPLAIN").is_some() } }