rust: improve `InvalidRevision` error message
I encountered this when debugging earlier and felt like we were losing some
information along the way, which we were!
--- a/rust/hg-core/src/revlog/index.rs Mon Sep 30 17:19:35 2024 +0200
+++ b/rust/hg-core/src/revlog/index.rs Tue Oct 01 13:20:40 2024 +0200
@@ -829,7 +829,7 @@
}
let [mut p1, mut p2] = self
.parents(rev)
- .map_err(|_| RevlogError::InvalidRevision)?;
+ .map_err(|e| RevlogError::InvalidRevision(e.to_string()))?;
while let Some(p1_entry) = self.get_entry(p1) {
if p1_entry.compressed_len() != 0 || p1.0 == 0 {
break;
@@ -839,9 +839,9 @@
if parent_base.0 == p1.0 {
break;
}
- p1 = self
- .check_revision(parent_base)
- .ok_or(RevlogError::InvalidRevision)?;
+ p1 = self.check_revision(parent_base).ok_or(
+ RevlogError::InvalidRevision(parent_base.to_string()),
+ )?;
}
while let Some(p2_entry) = self.get_entry(p2) {
if p2_entry.compressed_len() != 0 || p2.0 == 0 {
@@ -852,16 +852,16 @@
if parent_base.0 == p2.0 {
break;
}
- p2 = self
- .check_revision(parent_base)
- .ok_or(RevlogError::InvalidRevision)?;
+ p2 = self.check_revision(parent_base).ok_or(
+ RevlogError::InvalidRevision(parent_base.to_string()),
+ )?;
}
if base == p1.0 || base == p2.0 {
return Ok(false);
}
rev = self
.check_revision(base.into())
- .ok_or(RevlogError::InvalidRevision)?;
+ .ok_or(RevlogError::InvalidRevision(base.to_string()))?;
}
Ok(rev == NULL_REVISION)
}
--- a/rust/hg-core/src/revlog/mod.rs Mon Sep 30 17:19:35 2024 +0200
+++ b/rust/hg-core/src/revlog/mod.rs Tue Oct 01 13:20:40 2024 +0200
@@ -139,6 +139,16 @@
ParentOutOfRange(Revision),
}
+impl std::fmt::Display for GraphError {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ GraphError::ParentOutOfRange(revision) => {
+ write!(f, "parent out of range ({})", revision)
+ }
+ }
+ }
+}
+
impl<T: Graph> Graph for &T {
fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> {
(*self).parents(rev)
@@ -193,7 +203,8 @@
#[derive(Debug, derive_more::From, derive_more::Display)]
pub enum RevlogError {
- InvalidRevision,
+ #[display(fmt = "invalid revision identifier: {}", "_0")]
+ InvalidRevision(String),
/// Working directory is not supported
WDirUnsupported,
/// Found more than one entry whose ID match the requested prefix
@@ -809,7 +820,7 @@
if let Some(nodemap) = &self.nodemap {
nodemap
.find_bin(&self.index, node)?
- .ok_or(RevlogError::InvalidRevision)
+ .ok_or(RevlogError::InvalidRevision(format!("{:x}", node)))
} else {
self.rev_from_node_no_persistent_nodemap(node)
}
@@ -851,7 +862,8 @@
found_by_prefix = Some(rev)
}
}
- found_by_prefix.ok_or(RevlogError::InvalidRevision)
+ found_by_prefix
+ .ok_or(RevlogError::InvalidRevision(format!("{:x}", node)))
}
/// Returns whether the given revision exists in this revlog.
@@ -960,7 +972,7 @@
let index_entry = self
.index
.get_entry(rev)
- .ok_or(RevlogError::InvalidRevision)?;
+ .ok_or(RevlogError::InvalidRevision(rev.to_string()))?;
let offset = index_entry.offset();
let start = if self.index.is_inline() {
offset + ((rev.0 as usize + 1) * INDEX_ENTRY_SIZE)
--- a/rust/hg-core/src/revset.rs Mon Sep 30 17:19:35 2024 +0200
+++ b/rust/hg-core/src/revset.rs Tue Oct 01 13:20:40 2024 +0200
@@ -28,9 +28,9 @@
}
match resolve_rev_number_or_hex_prefix(input, &changelog.revlog) {
- Err(RevlogError::InvalidRevision) => {
+ Err(RevlogError::InvalidRevision(revision)) => {
// TODO: support for the rest of the language here.
- let msg = format!("cannot parse revset '{}'", input);
+ let msg = format!("cannot parse revset '{}'", revision);
Err(HgError::unsupported(msg).into())
}
result => result,
@@ -67,5 +67,5 @@
}
return revlog.rev_from_node(prefix);
}
- Err(RevlogError::InvalidRevision)
+ Err(RevlogError::InvalidRevision(input.to_string()))
}
--- a/rust/rhg/src/error.rs Mon Sep 30 17:19:35 2024 +0200
+++ b/rust/rhg/src/error.rs Tue Oct 01 13:20:40 2024 +0200
@@ -207,9 +207,9 @@
RevlogError::WDirUnsupported => CommandError::abort(
"abort: working directory revision cannot be specified",
),
- RevlogError::InvalidRevision => CommandError::abort(format!(
+ RevlogError::InvalidRevision(r) => CommandError::abort(format!(
"abort: invalid revision identifier: {}",
- rev
+ r
)),
RevlogError::AmbiguousPrefix => CommandError::abort(format!(
"abort: ambiguous revision identifier: {}",
--- a/tests/test-rhg-sparse-narrow.t Mon Sep 30 17:19:35 2024 +0200
+++ b/tests/test-rhg-sparse-narrow.t Tue Oct 01 13:20:40 2024 +0200
@@ -70,7 +70,7 @@
TODO: bad error message
$ $NO_FALLBACK rhg cat -r "$tip" hide
- abort: invalid revision identifier: 6d714a4a2998cbfd0620db44da58b749f6565d63
+ abort: invalid revision identifier: 1406e74118627694268417491f018a4a883152f0
[255]
$ "$real_hg" cat -r "$tip" hide
[1]