rhg: Align with Python on some revset parsing corner cases
authorSimon Sapin <simon.sapin@octobus.net>
Mon, 13 Sep 2021 17:23:42 +0200
changeset 47962 8c29af0f6d6e
parent 47961 4d2a5ca060e3
child 47963 001d747c2baf
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
rust/hg-core/src/revlog/revlog.rs
rust/hg-core/src/revset.rs
tests/test-rhg.t
--- 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