comparison mercurial/scmutil.py @ 37865:da083d9fafab

shortest: don't keep checking for longer prefix if node doesn't exist (API) If revlog.shortest() is called with an invalid nodeid, we keep checking if longer and longer prefixes are valid. We call revlog._partialmatch() for each prefix. That function will give us None if the node doesn't exist (and a RevlogError if it's ambiguous), so there's no need to keep checking. This patch instead makes revlog.shortest() raise a LookupError is the node does not exist, and updates the caller to handle it. Before this patch, revlog.shortest() would return the full hexnode for nonexistent nodeids. By the same reasoning as in 7b2955624777 (scmutil: make shortesthexnodeidprefix() take a full binary nodeid, 2018-04-14), it's not revlog.shortest() that should decide how to present nonexistent nodeids, so that's now moved to the template function. This should speed up cases where {shortest()} is applied to an invalid nodeid, but I couldn't think of a reasonable case where that would happen. Differential Revision: https://phab.mercurial-scm.org/D3461
author Martin von Zweigbergk <martinvonz@google.com>
date Sat, 05 May 2018 00:16:43 -0700
parents 44d1959acb3b
children 69de3c3de036
comparison
equal deleted inserted replaced
37864:890bdf0e33c8 37865:da083d9fafab
446 def shortesthexnodeidprefix(repo, node, minlength=1): 446 def shortesthexnodeidprefix(repo, node, minlength=1):
447 """Find the shortest unambiguous prefix that matches hexnode.""" 447 """Find the shortest unambiguous prefix that matches hexnode."""
448 # _partialmatch() of filtered changelog could take O(len(repo)) time, 448 # _partialmatch() of filtered changelog could take O(len(repo)) time,
449 # which would be unacceptably slow. so we look for hash collision in 449 # which would be unacceptably slow. so we look for hash collision in
450 # unfiltered space, which means some hashes may be slightly longer. 450 # unfiltered space, which means some hashes may be slightly longer.
451 return repo.unfiltered().changelog.shortest(node, minlength) 451 try:
452 return repo.unfiltered().changelog.shortest(node, minlength)
453 except error.LookupError:
454 raise error.RepoLookupError()
452 455
453 def isrevsymbol(repo, symbol): 456 def isrevsymbol(repo, symbol):
454 """Checks if a symbol exists in the repo. 457 """Checks if a symbol exists in the repo.
455 458
456 See revsymbol() for details. Raises error.LookupError if the symbol is an 459 See revsymbol() for details. Raises error.LookupError if the symbol is an