diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -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 --git a/tests/test-revisions.t b/tests/test-revisions.t --- a/tests/test-revisions.t +++ b/tests/test-revisions.t @@ -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 ..