diff --git a/rust/hg-core/src/revlog/index.rs b/rust/hg-core/src/revlog/index.rs
index 0cd16b1d613fa2ac3aa14dd0d2fcca50e8703d8c_cnVzdC9oZy1jb3JlL3NyYy9yZXZsb2cvaW5kZXgucnM=..652149ed64f08ee73e8fd2f76aa480ea8820fe08_cnVzdC9oZy1jb3JlL3NyYy9yZXZsb2cvaW5kZXgucnM= 100644
--- a/rust/hg-core/src/revlog/index.rs
+++ b/rust/hg-core/src/revlog/index.rs
@@ -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,12 +852,12 @@
                 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())
@@ -858,10 +858,10 @@
             }
             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)
     }
diff --git a/rust/hg-core/src/revlog/mod.rs b/rust/hg-core/src/revlog/mod.rs
index 0cd16b1d613fa2ac3aa14dd0d2fcca50e8703d8c_cnVzdC9oZy1jb3JlL3NyYy9yZXZsb2cvbW9kLnJz..652149ed64f08ee73e8fd2f76aa480ea8820fe08_cnVzdC9oZy1jb3JlL3NyYy9yZXZsb2cvbW9kLnJz 100644
--- a/rust/hg-core/src/revlog/mod.rs
+++ b/rust/hg-core/src/revlog/mod.rs
@@ -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)
diff --git a/rust/hg-core/src/revset.rs b/rust/hg-core/src/revset.rs
index 0cd16b1d613fa2ac3aa14dd0d2fcca50e8703d8c_cnVzdC9oZy1jb3JlL3NyYy9yZXZzZXQucnM=..652149ed64f08ee73e8fd2f76aa480ea8820fe08_cnVzdC9oZy1jb3JlL3NyYy9yZXZzZXQucnM= 100644
--- a/rust/hg-core/src/revset.rs
+++ b/rust/hg-core/src/revset.rs
@@ -28,5 +28,5 @@
     }
 
     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.
@@ -32,5 +32,5 @@
             // 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()))
 }
diff --git a/rust/rhg/src/error.rs b/rust/rhg/src/error.rs
index 0cd16b1d613fa2ac3aa14dd0d2fcca50e8703d8c_cnVzdC9yaGcvc3JjL2Vycm9yLnJz..652149ed64f08ee73e8fd2f76aa480ea8820fe08_cnVzdC9yaGcvc3JjL2Vycm9yLnJz 100644
--- a/rust/rhg/src/error.rs
+++ b/rust/rhg/src/error.rs
@@ -207,5 +207,5 @@
             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: {}",
@@ -211,5 +211,5 @@
                 "abort: invalid revision identifier: {}",
-                rev
+                r
             )),
             RevlogError::AmbiguousPrefix => CommandError::abort(format!(
                 "abort: ambiguous revision identifier: {}",
diff --git a/tests/test-rhg-sparse-narrow.t b/tests/test-rhg-sparse-narrow.t
index 0cd16b1d613fa2ac3aa14dd0d2fcca50e8703d8c_dGVzdHMvdGVzdC1yaGctc3BhcnNlLW5hcnJvdy50..652149ed64f08ee73e8fd2f76aa480ea8820fe08_dGVzdHMvdGVzdC1yaGctc3BhcnNlLW5hcnJvdy50 100644
--- a/tests/test-rhg-sparse-narrow.t
+++ b/tests/test-rhg-sparse-narrow.t
@@ -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]