diff --git a/rust/Cargo.lock b/rust/Cargo.lock --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -256,7 +256,7 @@ [[package]] name = "format-bytes" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "format-bytes-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -317,7 +317,7 @@ "crossbeam-channel 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.11 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", - "format-bytes 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "format-bytes 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "home 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "im-rc 15.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -740,7 +740,7 @@ "clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.99.11 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "format-bytes 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "format-bytes 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "hg-core 0.1.0", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1000,7 +1000,7 @@ "checksum either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" "checksum flate2 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)" = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129" -"checksum format-bytes 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8030ff4b04f0ca1c612d6fe49f2fc18caf56fb01497cb370b41cfd36d89b3b06" +"checksum format-bytes 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c4e89040c7fd7b4e6ba2820ac705a45def8a0c098ec78d170ae88f1ef1d5762" "checksum format-bytes-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b05089e341a0460449e2210c3bf7b61597860b07f0deae58da38dbed0a4c6b6d" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" diff --git a/rust/hg-core/Cargo.toml b/rust/hg-core/Cargo.toml --- a/rust/hg-core/Cargo.toml +++ b/rust/hg-core/Cargo.toml @@ -28,7 +28,7 @@ memmap = "0.7.0" zstd = "0.5.3" rust-crypto = "0.2.36" -format-bytes = "0.2.0" +format-bytes = "0.2.2" # We don't use the `miniz-oxide` backend to not change rhg benchmarks and until # we have a clearer view of which backend is the fastest. diff --git a/rust/hg-core/src/config/layer.rs b/rust/hg-core/src/config/layer.rs --- a/rust/hg-core/src/config/layer.rs +++ b/rust/hg-core/src/config/layer.rs @@ -7,7 +7,7 @@ // This software may be used and distributed according to the terms of the // GNU General Public License version 2 or any later version. -use crate::errors::{HgError, IoResultExt}; +use crate::errors::HgError; use crate::utils::files::{get_bytes_from_path, get_path_from_bytes}; use format_bytes::{format_bytes, write_bytes, DisplayBytes}; use lazy_static::lazy_static; @@ -74,7 +74,7 @@ layer.add(section, item, value, None); } else { Err(HgError::abort(format!( - "malformed --config option: '{}' \ + "abort: malformed --config option: '{}' \ (use --config section.name=value)", String::from_utf8_lossy(arg), )))? @@ -147,6 +147,7 @@ let mut section = b"".to_vec(); while let Some((index, bytes)) = lines_iter.next() { + let line = Some(index + 1); if let Some(m) = INCLUDE_RE.captures(&bytes) { let filename_bytes = &m[1]; // `Path::parent` only fails for the root directory, @@ -158,8 +159,17 @@ // `Path::join` with an absolute argument correctly ignores the // base path let filename = dir.join(&get_path_from_bytes(&filename_bytes)); - let data = - std::fs::read(&filename).when_reading_file(&filename)?; + let data = std::fs::read(&filename).map_err(|io_error| { + ConfigParseError { + origin: ConfigOrigin::File(src.to_owned()), + line, + message: format_bytes!( + b"cannot include {} ({})", + filename_bytes, + format_bytes::Utf8(io_error) + ), + } + })?; layers.push(current_layer); layers.extend(Self::parse(&filename, &data)?); current_layer = Self::new(ConfigOrigin::File(src.to_owned())); @@ -184,12 +194,7 @@ }; lines_iter.next(); } - current_layer.add( - section.clone(), - item, - value, - Some(index + 1), - ); + current_layer.add(section.clone(), item, value, line); } else if let Some(m) = UNSET_RE.captures(&bytes) { if let Some(map) = current_layer.sections.get_mut(§ion) { map.remove(&m[1]); @@ -202,7 +207,7 @@ }; return Err(ConfigParseError { origin: ConfigOrigin::File(src.to_owned()), - line: Some(index + 1), + line, message, } .into()); diff --git a/rust/hg-core/src/errors.rs b/rust/hg-core/src/errors.rs --- a/rust/hg-core/src/errors.rs +++ b/rust/hg-core/src/errors.rs @@ -81,7 +81,7 @@ write!(f, "abort: {}: {}", context, error) } HgError::CorruptedRepository(explanation) => { - write!(f, "abort: corrupted repository: {}", explanation) + write!(f, "abort: {}", explanation) } HgError::UnsupportedFeature(explanation) => { write!(f, "unsupported feature: {}", explanation) diff --git a/rust/hg-core/src/repo.rs b/rust/hg-core/src/repo.rs --- a/rust/hg-core/src/repo.rs +++ b/rust/hg-core/src/repo.rs @@ -141,20 +141,22 @@ if share_safe && !source_is_share_safe { return Err(match config - .get(b"safe-mismatch", b"source-not-safe") + .get(b"share", b"safe-mismatch.source-not-safe") { Some(b"abort") | None => HgError::abort( - "share source does not support share-safe requirement", + "abort: share source does not support share-safe requirement\n\ + (see `hg help config.format.use-share-safe` for more information)", ), _ => HgError::unsupported("share-safe downgrade"), } .into()); } else if source_is_share_safe && !share_safe { return Err( - match config.get(b"safe-mismatch", b"source-safe") { + match config.get(b"share", b"safe-mismatch.source-safe") { Some(b"abort") | None => HgError::abort( - "version mismatch: source uses share-safe \ - functionality while the current share does not", + "abort: version mismatch: source uses share-safe \ + functionality while the current share does not\n\ + (see `hg help config.format.use-share-safe` for more information)", ), _ => HgError::unsupported("share-safe upgrade"), } diff --git a/rust/rhg/src/error.rs b/rust/rhg/src/error.rs --- a/rust/rhg/src/error.rs +++ b/rust/rhg/src/error.rs @@ -72,7 +72,7 @@ match error { RepoError::NotFound { at } => CommandError::Abort { message: format_bytes!( - b"repository {} not found", + b"abort: repository {} not found", get_bytes_from_path(at) ), }, diff --git a/tests/test-rhg.t b/tests/test-rhg.t --- a/tests/test-rhg.t +++ b/tests/test-rhg.t @@ -187,7 +187,7 @@ $ echo -e '\xFF' >> .hg/requires $ rhg $NO_FALLBACK debugrequirements - abort: corrupted repository: parse error in 'requires' file + abort: parse error in 'requires' file [255] Persistent nodemap