Mercurial > hg-stable
diff mercurial/scmutil.py @ 38015:3ac950cd5978
shortest: move revnum-disambiguation out of revlog
I want to be able to change how we disambiguate and I think having
revlog.shortest() worry only about finding a prefix that's unambiguous
among nodeids makes more sense.
This slows down `hg log -T '{shortest(node,1)}\n'` from 4.0s to 4.1s.
Differential Revision: https://phab.mercurial-scm.org/D3502
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Thu, 03 May 2018 15:57:12 -0700 |
parents | 2f86f259aefa |
children | 5ac72e07692a |
line wrap: on
line diff
--- a/mercurial/scmutil.py Thu May 03 15:25:16 2018 -0700 +++ b/mercurial/scmutil.py Thu May 03 15:57:12 2018 -0700 @@ -449,8 +449,30 @@ # _partialmatch() of filtered changelog could take O(len(repo)) time, # which would be unacceptably slow. so we look for hash collision in # unfiltered space, which means some hashes may be slightly longer. + cl = repo.unfiltered().changelog + + def isrev(prefix): + try: + i = int(prefix) + # if we are a pure int, then starting with zero will not be + # confused as a rev; or, obviously, if the int is larger + # than the value of the tip rev + if prefix[0] == '0' or i > len(cl): + return False + return True + except ValueError: + return False + + def disambiguate(prefix): + """Disambiguate against revnums.""" + hexnode = hex(node) + for length in range(len(prefix), 41): + prefix = hexnode[:length] + if not isrev(prefix): + return prefix + try: - return repo.unfiltered().changelog.shortest(node, minlength) + return disambiguate(cl.shortest(node, minlength)) except error.LookupError: raise error.RepoLookupError()