Mercurial > hg
changeset 48731:f591b377375f
rhg: Make Ui::new falliable, add Ui::new_infallible
This allows propagating color configuration errors
Differential Revision: https://phab.mercurial-scm.org/D12165
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Thu, 10 Feb 2022 12:52:25 +0100 |
parents | 1aaf11e35aec |
children | d4a5c2197208 |
files | rust/rhg/src/main.rs rust/rhg/src/ui.rs |
diffstat | 2 files changed, 28 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/rhg/src/main.rs Thu Feb 10 12:12:56 2022 +0100 +++ b/rust/rhg/src/main.rs Thu Feb 10 12:52:25 2022 +0100 @@ -150,7 +150,7 @@ .unwrap_or_else(|error| { exit( &None, - &Ui::new(&Config::empty()), + &Ui::new_infallible(&Config::empty()), OnUnsupported::Abort, Err(CommandError::abort(format!( "abort: {}: '{}'", @@ -171,7 +171,7 @@ exit( &initial_current_dir, - &Ui::new(&Config::empty()), + &Ui::new_infallible(&Config::empty()), on_unsupported, Err(error.into()), false, @@ -183,7 +183,7 @@ .unwrap_or_else(|error| { exit( &initial_current_dir, - &Ui::new(&non_repo_config), + &Ui::new_infallible(&non_repo_config), OnUnsupported::from_config(&non_repo_config), Err(error.into()), non_repo_config @@ -201,7 +201,7 @@ if SCHEME_RE.is_match(&repo_path_bytes) { exit( &initial_current_dir, - &Ui::new(&non_repo_config), + &Ui::new_infallible(&non_repo_config), OnUnsupported::from_config(&non_repo_config), Err(CommandError::UnsupportedFeature { message: format_bytes!( @@ -291,7 +291,7 @@ } Err(error) => exit( &initial_current_dir, - &Ui::new(&non_repo_config), + &Ui::new_infallible(&non_repo_config), OnUnsupported::from_config(&non_repo_config), Err(error.into()), // TODO: show a warning or combine with original error if @@ -307,7 +307,17 @@ } else { &non_repo_config }; - let ui = Ui::new(&config); + let ui = Ui::new(&config).unwrap_or_else(|error| { + exit( + &initial_current_dir, + &Ui::new_infallible(&config), + OnUnsupported::from_config(&config), + Err(error.into()), + config + .get_bool(b"ui", b"detailed-exit-code") + .unwrap_or(false), + ) + }); let on_unsupported = OnUnsupported::from_config(config); let result = main_with_result(
--- a/rust/rhg/src/ui.rs Thu Feb 10 12:12:56 2022 +0100 +++ b/rust/rhg/src/ui.rs Thu Feb 10 12:52:25 2022 +0100 @@ -1,5 +1,6 @@ use format_bytes::format_bytes; use hg::config::Config; +use hg::errors::HgError; use hg::utils::files::get_bytes_from_os_string; use std::borrow::Cow; use std::env; @@ -22,7 +23,17 @@ /// The commandline user interface impl Ui { - pub fn new(_config: &Config) -> Self { + pub fn new(_config: &Config) -> Result<Self, HgError> { + Ok(Ui { + stdout: std::io::stdout(), + stderr: std::io::stderr(), + }) + } + + /// Default to no color if color configuration errors. + /// + /// Useful when we’re already handling another error. + pub fn new_infallible(_config: &Config) -> Self { Ui { stdout: std::io::stdout(), stderr: std::io::stderr(),