# HG changeset patch # User Martin von Zweigbergk # Date 1523687027 25200 # Node ID 6f7c9527030b1d8ee96d05f48e068d93c5871365 # Parent 503f936489dd43423ad8124326beb99f0f57d0a5 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 diff -r 503f936489dd -r 6f7c9527030b mercurial/scmutil.py --- 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: diff -r 503f936489dd -r 6f7c9527030b tests/test-revisions.t --- 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 ..