# HG changeset patch # User Simon Sapin # Date 2021-09-13 15:23:42 # Node ID 8c29af0f6d6e7122c6e6769dc8991dd4c39edfc6 # Parent 4d2a5ca060e3e831cfb4d1fc1f3c055581b559e2 rhg: Align with Python on some revset parsing corner cases In particular: * A string of ASCII digits can be either an integer on a hex prefix * The NULL node ID should convert to the NULL revision number Differential Revision: https://phab.mercurial-scm.org/D11409 diff --git a/rust/hg-core/src/revlog/revlog.rs b/rust/hg-core/src/revlog/revlog.rs --- a/rust/hg-core/src/revlog/revlog.rs +++ b/rust/hg-core/src/revlog/revlog.rs @@ -18,6 +18,7 @@ use super::patch; use crate::errors::HgError; use crate::repo::Repo; use crate::revlog::Revision; +use crate::NULL_REVISION; #[derive(derive_more::From)] pub enum RevlogError { @@ -124,6 +125,10 @@ impl Revlog { &self, node: NodePrefix, ) -> Result { + if node.is_prefix_of(&NULL_NODE) { + return Ok(NULL_REVISION); + } + if let Some(nodemap) = &self.nodemap { return nodemap .find_bin(&self.index, node)? diff --git a/rust/hg-core/src/revset.rs b/rust/hg-core/src/revset.rs --- a/rust/hg-core/src/revset.rs +++ b/rust/hg-core/src/revset.rs @@ -45,8 +45,14 @@ pub fn resolve_rev_number_or_hex_prefix( input: &str, revlog: &Revlog, ) -> Result { + // The Python equivalent of this is part of `revsymbol` in + // `mercurial/scmutil.py` + if let Ok(integer) = input.parse::() { - if integer >= 0 && revlog.has_rev(integer) { + if integer.to_string() == input + && integer >= 0 + && revlog.has_rev(integer) + { return Ok(integer); } } diff --git a/tests/test-rhg.t b/tests/test-rhg.t --- a/tests/test-rhg.t +++ b/tests/test-rhg.t @@ -126,6 +126,9 @@ Specifying revisions by changeset ID [255] $ $NO_FALLBACK rhg cat -r d file-2 2 + $ $NO_FALLBACK rhg cat -r 0000 file-2 + abort: invalid revision identifier: 0000 + [255] Cat files $ cd $TESTTMP