##// END OF EJS Templates
rhg: Abort based on config on share-safe mismatch...
rhg: Abort based on config on share-safe mismatch Differential Revision: https://phab.mercurial-scm.org/D9963

File last commit:

r47213:a6e4e465 default
r47214:f031fe1c default
Show More
error.rs
114 lines | 3.6 KiB | application/rls-services+xml | RustLexer
Simon Sapin
rhg: replace `map_*_error` functions with `From` impls...
r47165 use crate::ui::utf8_to_local;
Antoine Cezar
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`...
r45592 use crate::ui::UiError;
Simon Sapin
rust: Fold find_root and check_requirements into Repo::find...
r47175 use format_bytes::format_bytes;
Simon Sapin
rhg: Parse system and user configuration at program start...
r47213 use hg::config::{ConfigError, ConfigParseError};
Simon Sapin
rust: Fold find_root and check_requirements into Repo::find...
r47175 use hg::errors::HgError;
use hg::repo::RepoFindError;
Simon Sapin
rust: remove three enums that were identical to `RevlogError`...
r47166 use hg::revlog::revlog::RevlogError;
Simon Sapin
rust: Fold find_root and check_requirements into Repo::find...
r47175 use hg::utils::files::get_bytes_from_path;
Antoine Cezar
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`...
r45592 use std::convert::From;
/// The kind of command error
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 #[derive(Debug)]
Simon Sapin
rust: remove `FooError` structs with only `kind: FooErrorKind` enum field...
r47163 pub enum CommandError {
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 /// Exit with an error message and "standard" failure exit code.
Abort { message: Vec<u8> },
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 /// A mercurial capability as not been implemented.
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 ///
/// There is no error message printed in this case.
/// Instead, we exit with a specic status code and a wrapper script may
/// fallback to Python-based Mercurial.
Antoine Cezar
rhg: add a limited `rhg cat -r` subcommand...
r46113 Unimplemented,
Antoine Cezar
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`...
r45592 }
Simon Sapin
rust: remove `FooError` structs with only `kind: FooErrorKind` enum field...
r47163 impl CommandError {
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 pub fn abort(message: impl AsRef<str>) -> Self {
CommandError::Abort {
// TODO: bytes-based (instead of Unicode-based) formatting
// of error messages to handle non-UTF-8 filenames etc:
// https://www.mercurial-scm.org/wiki/EncodingStrategy#Mixing_output
message: utf8_to_local(message.as_ref()).into(),
Antoine Cezar
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`...
r45592 }
}
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 }
Antoine Cezar
rhg: ask the error message from `CommandError`...
r45920
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 impl From<HgError> for CommandError {
fn from(error: HgError) -> Self {
match error {
HgError::UnsupportedFeature(_) => CommandError::Unimplemented,
_ => CommandError::abort(error.to_string()),
Antoine Cezar
rhg: ask the error message from `CommandError`...
r45920 }
}
Antoine Cezar
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`...
r45592 }
impl From<UiError> for CommandError {
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 fn from(_error: UiError) -> Self {
// If we already failed writing to stdout or stderr,
// writing an error message to stderr about it would be likely to fail
// too.
CommandError::abort("")
Antoine Cezar
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`...
r45592 }
}
Antoine Cezar
rhg: simplify `FindRootError` handling...
r45922
Simon Sapin
rust: Fold find_root and check_requirements into Repo::find...
r47175 impl From<RepoFindError> for CommandError {
fn from(error: RepoFindError) -> Self {
match error {
RepoFindError::NotFoundInCurrentDirectoryOrAncestors {
current_directory,
} => CommandError::Abort {
message: format_bytes!(
b"no repository found in '{}' (.hg not found)!",
get_bytes_from_path(current_directory)
),
},
RepoFindError::Other(error) => error.into(),
Antoine Cezar
rhg: simplify `FindRootError` handling...
r45922 }
}
}
Simon Sapin
rhg: replace `map_*_error` functions with `From` impls...
r47165
Simon Sapin
rhg: Parse system and user configuration at program start...
r47213 impl From<ConfigError> for CommandError {
fn from(error: ConfigError) -> Self {
match error {
ConfigError::Parse(ConfigParseError {
origin,
line,
bytes,
}) => {
let line_message = if let Some(line_number) = line {
format_bytes!(
b" at line {}",
line_number.to_string().into_bytes()
)
} else {
Vec::new()
};
CommandError::Abort {
message: format_bytes!(
b"config parse error in {}{}: '{}'",
origin.to_bytes(),
line_message,
bytes
),
}
}
ConfigError::Other(error) => error.into(),
}
}
}
Simon Sapin
rust: remove three enums that were identical to `RevlogError`...
r47166 impl From<(RevlogError, &str)> for CommandError {
fn from((err, rev): (RevlogError, &str)) -> CommandError {
Simon Sapin
rhg: replace `map_*_error` functions with `From` impls...
r47165 match err {
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 RevlogError::InvalidRevision => CommandError::abort(format!(
"invalid revision identifier {}",
rev
Simon Sapin
rhg: replace `map_*_error` functions with `From` impls...
r47165 )),
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 RevlogError::AmbiguousPrefix => CommandError::abort(format!(
"ambiguous revision identifier {}",
rev
Simon Sapin
rhg: replace `map_*_error` functions with `From` impls...
r47165 )),
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 RevlogError::Other(error) => error.into(),
Simon Sapin
rhg: replace `map_*_error` functions with `From` impls...
r47165 }
}
}