Mercurial > public > mercurial-scm > hg
comparison mercurial/scmutil.py @ 37971: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 |
comparison
equal
deleted
inserted
replaced
37970:76e933e0ccc9 | 37971:3ac950cd5978 |
---|---|
447 def shortesthexnodeidprefix(repo, node, minlength=1): | 447 def shortesthexnodeidprefix(repo, node, minlength=1): |
448 """Find the shortest unambiguous prefix that matches hexnode.""" | 448 """Find the shortest unambiguous prefix that matches hexnode.""" |
449 # _partialmatch() of filtered changelog could take O(len(repo)) time, | 449 # _partialmatch() of filtered changelog could take O(len(repo)) time, |
450 # which would be unacceptably slow. so we look for hash collision in | 450 # which would be unacceptably slow. so we look for hash collision in |
451 # unfiltered space, which means some hashes may be slightly longer. | 451 # unfiltered space, which means some hashes may be slightly longer. |
452 cl = repo.unfiltered().changelog | |
453 | |
454 def isrev(prefix): | |
455 try: | |
456 i = int(prefix) | |
457 # if we are a pure int, then starting with zero will not be | |
458 # confused as a rev; or, obviously, if the int is larger | |
459 # than the value of the tip rev | |
460 if prefix[0] == '0' or i > len(cl): | |
461 return False | |
462 return True | |
463 except ValueError: | |
464 return False | |
465 | |
466 def disambiguate(prefix): | |
467 """Disambiguate against revnums.""" | |
468 hexnode = hex(node) | |
469 for length in range(len(prefix), 41): | |
470 prefix = hexnode[:length] | |
471 if not isrev(prefix): | |
472 return prefix | |
473 | |
452 try: | 474 try: |
453 return repo.unfiltered().changelog.shortest(node, minlength) | 475 return disambiguate(cl.shortest(node, minlength)) |
454 except error.LookupError: | 476 except error.LookupError: |
455 raise error.RepoLookupError() | 477 raise error.RepoLookupError() |
456 | 478 |
457 def isrevsymbol(repo, symbol): | 479 def isrevsymbol(repo, symbol): |
458 """Checks if a symbol exists in the repo. | 480 """Checks if a symbol exists in the repo. |