Mercurial > public > mercurial-scm > hg
diff rust/rhg/src/main.rs @ 46445:ca3f73cc3cf4
rhg: Simplify CommandError based on its use
Differential Revision: https://phab.mercurial-scm.org/D9905
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Thu, 28 Jan 2021 19:13:55 +0100 |
parents | ead435aa5294 |
children | a6e4e4650bac |
line wrap: on
line diff
--- a/rust/rhg/src/main.rs Thu Jan 28 19:21:57 2021 +0100 +++ b/rust/rhg/src/main.rs Thu Jan 28 19:13:55 2021 +0100 @@ -5,6 +5,7 @@ use clap::ArgGroup; use clap::ArgMatches; use clap::SubCommand; +use format_bytes::format_bytes; use hg::operations::DebugDataKind; use std::convert::TryFrom; @@ -91,26 +92,31 @@ let matches = app.clone().get_matches_safe().unwrap_or_else(|err| { let _ = ui::Ui::new().writeln_stderr_str(&err.message); - std::process::exit(exitcode::UNIMPLEMENTED_COMMAND) + std::process::exit(exitcode::UNIMPLEMENTED) }); let ui = ui::Ui::new(); let command_result = match_subcommand(matches, &ui); - match command_result { - Ok(_) => std::process::exit(exitcode::OK), - Err(e) => { - let message = e.get_error_message_bytes(); - if let Some(msg) = message { - match ui.write_stderr(&msg) { - Ok(_) => (), - Err(_) => std::process::exit(exitcode::ABORT), - }; - }; - e.exit() + let exit_code = match command_result { + Ok(_) => exitcode::OK, + + // Exit with a specific code and no error message to let a potential + // wrapper script fallback to Python-based Mercurial. + Err(CommandError::Unimplemented) => exitcode::UNIMPLEMENTED, + + Err(CommandError::Abort { message }) => { + if !message.is_empty() { + // Ignore errors when writing to stderr, we’re already exiting + // with failure code so there’s not much more we can do. + let _ = + ui.write_stderr(&format_bytes!(b"abort: {}\n", message)); + } + exitcode::ABORT } - } + }; + std::process::exit(exit_code) } fn match_subcommand(