template: fix shortest(node) function in pure mercurial

Pure mercurial (i.e. without c extensions) does not support partialmatch() on
the revlog index, so we must fall back to use revlog._partialmatch() to handle
that case for us. The tests caught this.

We don't use revlog._partialmatch() for the normal case because it performs a
very expensive index iteration when the string being tested fails to find a
unique result via index.partialmatch(). It does this in order to filter
out hidden revs in hopes of the string being unique amongst non-hidden revs.
For the shortest(node) case, we'd prefer performance over worrying about
hidden revs.
This commit is contained in:
Durham Goode 2014-02-05 20:22:28 -08:00
parent fe9653ca83
commit 41c61c62a7

View File

@ -368,7 +368,14 @@ def shortest(context, mapping, args):
cl = mapping['ctx']._repo.changelog
def isvalid(test):
try:
cl.index.partialmatch(test)
try:
cl.index.partialmatch(test)
except AttributeError:
# Pure mercurial doesn't support partialmatch on the index.
# Fallback to the slow way.
if cl._partialmatch(test) is None:
return False
try:
int(test)
return False