revset: id() called with 40-byte strings should give the same results as for short strings
The patch solves two issues:
1. id(unknown_full_hash) aborts, but id(unknown_short_hash) doesn't
2. id(40byte_tag_or_bookmark) returns tagged/bookmarked revision,
but id(non-40byte_tag_or_bookmark) doesn't
After the patch:
1. id(unknown_full_hash) doesn't abort
2. id(40byte_tag_or_bookmark) returns empty set
--- a/mercurial/revset.py Sun May 03 17:33:14 2015 +0900
+++ b/mercurial/revset.py Mon Apr 20 10:52:20 2015 +0300
@@ -1294,7 +1294,10 @@
# i18n: "id" is a keyword
n = getstring(l[0], _("id requires a string"))
if len(n) == 40:
- rn = repo[n].rev()
+ try:
+ rn = repo.changelog.rev(node.bin(n))
+ except (LookupError, TypeError):
+ rn = None
else:
rn = None
pm = repo.changelog._partialmatch(n)
--- a/tests/test-revset.t Sun May 03 17:33:14 2015 +0900
+++ b/tests/test-revset.t Mon Apr 20 10:52:20 2015 +0300
@@ -87,6 +87,7 @@
$ hg ci -Aqm9
$ hg tag -r6 1.0
+ $ hg bookmark -r6 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ hg clone --quiet -U -r 7 . ../remote1
$ hg clone --quiet -U -r 8 . ../remote2
@@ -554,6 +555,23 @@
hg: parse error: rev expects a number
[255]
+Test hexadecimal revision
+ $ log 'id(2)'
+ abort: 00changelog.i@2: ambiguous identifier!
+ [255]
+ $ log 'id(23268)'
+ 4
+ $ log 'id(2785f51eece)'
+ 0
+ $ log 'id(d5d0dcbdc4d9ff5dbb2d336f32f0bb561c1a532c)'
+ 8
+ $ log 'id(d5d0dcbdc4a)'
+ $ log 'id(d5d0dcbdc4w)'
+ $ log 'id(d5d0dcbdc4d9ff5dbb2d336f32f0bb561c1a532d)'
+ $ log 'id(d5d0dcbdc4d9ff5dbb2d336f32f0bb561c1a532q)'
+ $ log 'id(1.0)'
+ $ log 'id(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)'
+
Test null revision
$ log '(null)'
-1