changeset 20371:6f3fb6a974e0

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.
author Durham Goode <durham@fb.com>
date Wed, 05 Feb 2014 20:22:28 -0800
parents aa51392da507
children 45562379ce4e
files mercurial/templater.py
diffstat 1 files changed, 8 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/templater.py	Fri Jan 17 00:16:48 2014 -0800
+++ b/mercurial/templater.py	Wed Feb 05 20:22:28 2014 -0800
@@ -368,7 +368,14 @@
     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