##// END OF EJS Templates
revset: handle wdir() in `sort(..., -topo)`...
revset: handle wdir() in `sort(..., -topo)` The last apparent usage of `repo.changelog.parentrevs` in revsets is in `children()`, but since the sets being operated on never include wdir(), it's never called with `wdirrev` and the wdir() arg on the command line is effectively ignored instead of aborting there. I'm not sure how to fix that. Before (on a clone of hg): $ python3.8 hg perf::revset --config extensions.perf=contrib/perf.py 'sort(all(), -topo)' ! wall 0.123663 comb 0.130000 user 0.130000 sys 0.000000 (best of 76) After: $ python3.8 hg perf::revset --config extensions.perf=contrib/perf.py 'sort(all(), -topo)' ! wall 0.123838 comb 0.130000 user 0.130000 sys 0.000000 (best of 75)

File last commit:

r50383:7c93e38a default
r50406:117dcc4a default
Show More
error.rs
290 lines | 9.1 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
rhg: Move `Repo` object creation into `main()`...
r47335 use crate::NoRepoInCwdError;
Simon Sapin
rust: Fold find_root and check_requirements into Repo::find...
r47175 use format_bytes::format_bytes;
Simon Sapin
rhg: Add more conversions between error types...
r47555 use hg::config::{ConfigError, ConfigParseError, ConfigValueParseError};
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474 use hg::dirstate_tree::on_disk::DirstateV2ParseError;
Simon Sapin
rust: Fold find_root and check_requirements into Repo::find...
r47175 use hg::errors::HgError;
Pulkit Goyal
rhg: add exit code to HgError::Abort()...
r48199 use hg::exit_codes;
Simon Sapin
rhg: Parse per-repository configuration...
r47215 use hg::repo::RepoError;
Simon Sapin
rust: remove three enums that were identical to `RevlogError`...
r47166 use hg::revlog::revlog::RevlogError;
Raphaël Gomès
rhg: add sparse support
r50380 use hg::sparse::SparseConfigError;
Simon Sapin
rust: Fold find_root and check_requirements into Repo::find...
r47175 use hg::utils::files::get_bytes_from_path;
Simon Sapin
rhg: Add more conversions between error types...
r47555 use hg::{DirstateError, DirstateMapError, StatusError};
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.
Pulkit Goyal
rhg: add support for detailed exit code for ConfigParseError...
r47576 Abort {
message: Vec<u8>,
Pulkit Goyal
rhg: add exit code to HgError::Abort()...
r48199 detailed_exit_code: exit_codes::ExitCode,
Raphaël Gomès
rust: add support for hints in error messages...
r50382 hint: Option<Vec<u8>>,
Pulkit Goyal
rhg: add support for detailed exit code for ConfigParseError...
r47576 },
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174
Simon Sapin
rhg: `cat` command: print error messages for missing files...
r47478 /// Exit with a failure exit code but no message.
Unsuccessful,
Simon Sapin
rhg: Add a `rhg.on-unsupported` configuration key...
r47424 /// Encountered something (such as a CLI argument, repository layout, …)
/// not supported by this version of `rhg`. Depending on configuration
/// `rhg` may attempt to silently fall back to Python-based `hg`, which
/// may or may not support this feature.
UnsupportedFeature { message: Vec<u8> },
Raphaël Gomès
rhg: use `Command::exec` instead of `Command::status`...
r50043 /// The fallback executable does not exist (or has some other problem if
/// we end up being more precise about broken fallbacks).
InvalidFallback { path: Vec<u8>, err: String },
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 {
Pulkit Goyal
rhg: add exit code to HgError::Abort()...
r48199 CommandError::abort_with_exit_code(message, exit_codes::ABORT)
Pulkit Goyal
rhg: add support for detailed exit code for ConfigParseError...
r47576 }
pub fn abort_with_exit_code(
message: impl AsRef<str>,
Pulkit Goyal
rhg: add exit code to HgError::Abort()...
r48199 detailed_exit_code: exit_codes::ExitCode,
Pulkit Goyal
rhg: add support for detailed exit code for ConfigParseError...
r47576 ) -> Self {
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 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(),
Pulkit Goyal
rhg: add support for detailed exit code for ConfigParseError...
r47576 detailed_exit_code: detailed_exit_code,
Raphaël Gomès
rust: add support for hints in error messages...
r50382 hint: None,
}
}
pub fn abort_with_exit_code_and_hint(
message: impl AsRef<str>,
detailed_exit_code: exit_codes::ExitCode,
hint: Option<impl AsRef<str>>,
) -> Self {
CommandError::Abort {
message: utf8_to_local(message.as_ref()).into(),
detailed_exit_code,
hint: hint.map(|h| utf8_to_local(h.as_ref()).into()),
Antoine Cezar
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`...
r45592 }
}
Simon Sapin
rhg: Add a `rhg.on-unsupported` configuration key...
r47424
Raphaël Gomès
rhg: add sparse support
r50380 pub fn abort_with_exit_code_bytes(
message: impl AsRef<[u8]>,
detailed_exit_code: exit_codes::ExitCode,
) -> Self {
// TODO: use this everywhere it makes sense instead of the string
// version.
CommandError::Abort {
message: message.as_ref().into(),
detailed_exit_code,
Raphaël Gomès
rust: add support for hints in error messages...
r50382 hint: None,
Raphaël Gomès
rhg: add sparse support
r50380 }
}
Simon Sapin
rhg: Add a `rhg.on-unsupported` configuration key...
r47424 pub fn unsupported(message: impl AsRef<str>) -> Self {
CommandError::UnsupportedFeature {
message: utf8_to_local(message.as_ref()).into(),
}
}
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 }
Antoine Cezar
rhg: ask the error message from `CommandError`...
r45920
Simon Sapin
rhg: Remove error message on unsupported CLI arguments...
r47333 /// For now we don’t differenciate between invalid CLI args and valid for `hg`
/// but not supported yet by `rhg`.
impl From<clap::Error> for CommandError {
Simon Sapin
rhg: Add a `rhg.on-unsupported` configuration key...
r47424 fn from(error: clap::Error) -> Self {
CommandError::unsupported(error.to_string())
Simon Sapin
rhg: Remove error message on unsupported CLI arguments...
r47333 }
}
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 impl From<HgError> for CommandError {
fn from(error: HgError) -> Self {
match error {
Simon Sapin
rhg: Add a `rhg.on-unsupported` configuration key...
r47424 HgError::UnsupportedFeature(message) => {
CommandError::unsupported(message)
}
Arseniy Alekseyev
censor: make rhg fall back to python when encountering a censored node...
r50069 HgError::CensoredNodeError => {
CommandError::unsupported("Encountered a censored node")
}
Pulkit Goyal
rhg: propogate error coming from HgError::Abort to CommandError...
r48200 HgError::Abort {
message,
detailed_exit_code,
Raphaël Gomès
rust: add support for hints in error messages...
r50382 hint,
} => CommandError::abort_with_exit_code_and_hint(
message,
detailed_exit_code,
hint,
),
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 _ => 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 }
Simon Sapin
rhg: Add more conversions between error types...
r47555 impl From<ConfigValueParseError> for CommandError {
fn from(error: ConfigValueParseError) -> Self {
Pulkit Goyal
rhg: add support for detailed exit code for ConfigParseError...
r47576 CommandError::abort_with_exit_code(
error.to_string(),
Pulkit Goyal
rhg: add exit code to HgError::Abort()...
r48199 exit_codes::CONFIG_ERROR_ABORT,
Pulkit Goyal
rhg: add support for detailed exit code for ConfigParseError...
r47576 )
Simon Sapin
rhg: Add more conversions between error types...
r47555 }
}
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
rhg: Parse per-repository configuration...
r47215 impl From<RepoError> for CommandError {
fn from(error: RepoError) -> Self {
Simon Sapin
rust: Fold find_root and check_requirements into Repo::find...
r47175 match error {
Raphaël Gomès
rust: add support for hints in error messages...
r50382 RepoError::NotFound { at } => {
CommandError::abort_with_exit_code_bytes(
format_bytes!(
b"abort: repository {} not found",
get_bytes_from_path(at)
),
exit_codes::ABORT,
)
}
Simon Sapin
rhg: Parse per-repository configuration...
r47215 RepoError::ConfigParseError(error) => error.into(),
RepoError::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: Move `Repo` object creation into `main()`...
r47335 impl<'a> From<&'a NoRepoInCwdError> for CommandError {
fn from(error: &'a NoRepoInCwdError) -> Self {
let NoRepoInCwdError { cwd } = error;
Raphaël Gomès
rust: add support for hints in error messages...
r50382 CommandError::abort_with_exit_code_bytes(
format_bytes!(
Simon Sapin
rhg: Align config file parse error formatting with Python...
r47465 b"abort: no repository found in '{}' (.hg not found)!",
Simon Sapin
rhg: Move `Repo` object creation into `main()`...
r47335 get_bytes_from_path(cwd)
),
Raphaël Gomès
rust: add support for hints in error messages...
r50382 exit_codes::ABORT,
)
Simon Sapin
rhg: Move `Repo` object creation into `main()`...
r47335 }
}
Simon Sapin
rhg: Parse system and user configuration at program start...
r47213 impl From<ConfigError> for CommandError {
fn from(error: ConfigError) -> Self {
match error {
Simon Sapin
rhg: Parse per-repository configuration...
r47215 ConfigError::Parse(error) => error.into(),
Simon Sapin
rhg: Parse system and user configuration at program start...
r47213 ConfigError::Other(error) => error.into(),
}
}
}
Simon Sapin
rhg: Parse per-repository configuration...
r47215 impl From<ConfigParseError> for CommandError {
fn from(error: ConfigParseError) -> Self {
let ConfigParseError {
origin,
line,
Simon Sapin
rhg: Align config file parse error formatting with Python...
r47465 message,
Simon Sapin
rhg: Parse per-repository configuration...
r47215 } = error;
let line_message = if let Some(line_number) = line {
Simon Sapin
rhg: Align config file parse error formatting with Python...
r47465 format_bytes!(b":{}", line_number.to_string().into_bytes())
Simon Sapin
rhg: Parse per-repository configuration...
r47215 } else {
Vec::new()
};
Raphaël Gomès
rust: add support for hints in error messages...
r50382 CommandError::abort_with_exit_code_bytes(
format_bytes!(
Simon Sapin
rhg: Align config file parse error formatting with Python...
r47465 b"config error at {}{}: {}",
Simon Sapin
rust: Use the DisplayBytes trait in config printing...
r47249 origin,
Simon Sapin
rhg: Parse per-repository configuration...
r47215 line_message,
Simon Sapin
rhg: Align config file parse error formatting with Python...
r47465 message
Simon Sapin
rhg: Parse per-repository configuration...
r47215 ),
Raphaël Gomès
rust: add support for hints in error messages...
r50382 exit_codes::CONFIG_ERROR_ABORT,
)
Simon Sapin
rhg: Parse per-repository configuration...
r47215 }
}
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 {
Pulkit Goyal
rhg: raise wdir specific error for `hg debugdata`...
r47577 RevlogError::WDirUnsupported => CommandError::abort(
"abort: working directory revision cannot be specified",
),
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 RevlogError::InvalidRevision => CommandError::abort(format!(
Simon Sapin
rhg: Align config file parse error formatting with Python...
r47465 "abort: invalid revision identifier: {}",
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 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!(
Simon Sapin
rhg: Align config file parse error formatting with Python...
r47465 "abort: ambiguous revision identifier: {}",
Simon Sapin
rhg: Simplify CommandError based on its use...
r47174 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 }
}
}
Simon Sapin
rhg: Add more conversions between error types...
r47555
impl From<StatusError> for CommandError {
fn from(error: StatusError) -> Self {
CommandError::abort(format!("{}", error))
}
}
impl From<DirstateMapError> for CommandError {
fn from(error: DirstateMapError) -> Self {
CommandError::abort(format!("{}", error))
}
}
impl From<DirstateError> for CommandError {
fn from(error: DirstateError) -> Self {
match error {
DirstateError::Common(error) => error.into(),
DirstateError::Map(error) => error.into(),
}
}
}
Simon Sapin
dirstate-v2: Introduce a docket file...
r48474
impl From<DirstateV2ParseError> for CommandError {
fn from(error: DirstateV2ParseError) -> Self {
HgError::from(error).into()
}
}
Raphaël Gomès
rhg: add sparse support
r50380
impl From<SparseConfigError> for CommandError {
fn from(e: SparseConfigError) -> Self {
match e {
SparseConfigError::IncludesAfterExcludes { context } => {
Self::abort_with_exit_code_bytes(
format_bytes!(
b"{} config cannot have includes after excludes",
context
),
exit_codes::CONFIG_PARSE_ERROR_ABORT,
)
}
SparseConfigError::EntryOutsideSection { context, line } => {
Self::abort_with_exit_code_bytes(
format_bytes!(
b"{} config entry outside of section: {}",
context,
&line,
),
exit_codes::CONFIG_PARSE_ERROR_ABORT,
)
}
Raphaël Gomès
rhg-status: add support for narrow clones
r50383 SparseConfigError::InvalidNarrowPrefix(prefix) => {
Self::abort_with_exit_code_bytes(
format_bytes!(
b"invalid prefix on narrow pattern: {}",
&prefix
),
exit_codes::ABORT,
)
}
SparseConfigError::IncludesInNarrow => Self::abort(
"including other spec files using '%include' \
is not supported in narrowspec",
),
Raphaël Gomès
rhg: add sparse support
r50380 SparseConfigError::HgError(e) => Self::from(e),
SparseConfigError::PatternError(e) => {
Self::unsupported(format!("{}", e))
}
}
}
}