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
--- a/rust/hg-core/src/revlog/revlog.rs Mon Sep 13 15:42:39 2021 +0200
+++ b/rust/hg-core/src/revlog/revlog.rs Mon Sep 13 17:23:42 2021 +0200
@@ -18,6 +18,7 @@
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 @@
&self,
node: NodePrefix,
) -> Result<Revision, RevlogError> {
+ if node.is_prefix_of(&NULL_NODE) {
+ return Ok(NULL_REVISION);
+ }
+
if let Some(nodemap) = &self.nodemap {
return nodemap
.find_bin(&self.index, node)?
--- a/rust/hg-core/src/revset.rs Mon Sep 13 15:42:39 2021 +0200
+++ b/rust/hg-core/src/revset.rs Mon Sep 13 17:23:42 2021 +0200
@@ -45,8 +45,14 @@
input: &str,
revlog: &Revlog,
) -> Result<Revision, RevlogError> {
+ // The Python equivalent of this is part of `revsymbol` in
+ // `mercurial/scmutil.py`
+
if let Ok(integer) = input.parse::<i32>() {
- if integer >= 0 && revlog.has_rev(integer) {
+ if integer.to_string() == input
+ && integer >= 0
+ && revlog.has_rev(integer)
+ {
return Ok(integer);
}
}
--- a/tests/test-rhg.t Mon Sep 13 15:42:39 2021 +0200
+++ b/tests/test-rhg.t Mon Sep 13 17:23:42 2021 +0200
@@ -126,6 +126,9 @@
[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