scmutil: make shortest() respect disambiguation revset
The previous patch would let you use a shorter prefix if the prefix is
unique within a configured revset. However, that's not very useful if
there's no simple way of knowing what that shorter prefix is. This
patch adapts the shortest() template function to use the shorter
prefixes for nodes in the configured revset.
This is currently extremely slow, because it calculates the revset for
each call to shortest(). To make this faster, the next patch will
start caching the revset instance. Ideally we'd cache a prefix tree
instance instead.
Differential Revision: https://phab.mercurial-scm.org/D4038
--- a/mercurial/scmutil.py Wed Mar 28 09:36:02 2018 -0700
+++ b/mercurial/scmutil.py Fri Apr 13 23:23:47 2018 -0700
@@ -489,6 +489,21 @@
if not isrev(prefix):
return prefix
+ revset = repo.ui.config('experimental', 'revisions.disambiguatewithin')
+ if revset:
+ revs = repo.anyrevs([revset], user=True)
+ if cl.rev(node) in revs:
+ hexnode = hex(node)
+ for length in range(minlength, len(hexnode) + 1):
+ matches = []
+ prefix = hexnode[:length]
+ for rev in revs:
+ otherhexnode = repo[rev].hex()
+ if prefix == otherhexnode[:length]:
+ matches.append(otherhexnode)
+ if len(matches) == 1:
+ return disambiguate(prefix)
+
try:
return disambiguate(cl.shortest(node, minlength))
except error.LookupError:
--- a/tests/test-revisions.t Wed Mar 28 09:36:02 2018 -0700
+++ b/tests/test-revisions.t Fri Apr 13 23:23:47 2018 -0700
@@ -23,6 +23,12 @@
> [experimental]
> revisions.disambiguatewithin=:3
> EOF
+ $ hg l
+ 4:7ba5d
+ 3:7b
+ 2:72
+ 1:9
+ 0:b
9 was unambiguous and still is
$ hg l -r 9
1:9
@@ -32,6 +38,6 @@
[255]
7b is no longer ambiguous
$ hg l -r 7b
- 3:7ba57
+ 3:7b
$ cd ..