diff --git a/hgext/show.py b/hgext/show.py --- a/hgext/show.py +++ b/hgext/show.py @@ -447,10 +447,8 @@ """ if not revs: return minlen - # don't use filtered repo because it's slow. see templater.shortest(). cl = repo.changelog - return max(len(scmutil.shortesthexnodeidprefix(repo.unfiltered(), - hex(cl.node(r)), + return max(len(scmutil.shortesthexnodeidprefix(repo, hex(cl.node(r)), minlen)) for r in revs) # Adjust the docstring of the show command so it shows all registered views. diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -436,7 +436,7 @@ def resolvehexnodeidprefix(repo, prefix): # Uses unfiltered repo because it's faster when prefix is ambiguous/ - # This matches the "shortest" template function. + # This matches the shortesthexnodeidprefix() function below. node = repo.unfiltered().changelog._partialmatch(prefix) if node is None: return @@ -445,7 +445,10 @@ def shortesthexnodeidprefix(repo, hexnode, minlength=1): """Find the shortest unambiguous prefix that matches hexnode.""" - cl = repo.changelog + # _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 isvalid(test): try: if cl._partialmatch(test) is None: diff --git a/mercurial/templatefuncs.py b/mercurial/templatefuncs.py --- a/mercurial/templatefuncs.py +++ b/mercurial/templatefuncs.py @@ -587,11 +587,8 @@ # i18n: "shortest" is a keyword _("shortest() expects an integer minlength")) - # _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. repo = context.resource(mapping, 'ctx')._repo - return scmutil.shortesthexnodeidprefix(repo.unfiltered(), node, minlength) + return scmutil.shortesthexnodeidprefix(repo, node, minlength) @templatefunc('strip(text[, chars])') def strip(context, mapping, args):