D3313: scmutil: make shortesthexnodeidprefix() use unfiltered repo

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Sat Apr 14 02:16:49 EDT 2018


martinvonz updated this revision to Diff 8250.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D3313?vs=8119&id=8250

REVISION DETAIL
  https://phab.mercurial-scm.org/D3313

AFFECTED FILES
  hgext/show.py
  mercurial/scmutil.py
  mercurial/templatefuncs.py

CHANGE DETAILS

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):
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -436,16 +436,19 @@
 
 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
     repo.changelog.rev(node)  # make sure node isn't filtered
     return node
 
 def shortesthexnodeidprefix(repo, hexnode, minlength=1):
     """Find the shortest unambiguous prefix that matches hexnode."""
-    return repo.changelog.shortest(hexnode)
+    # _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.
+    return repo.unfiltered().changelog.shortest(hexnode)
 
 def isrevsymbol(repo, symbol):
     """Checks if a symbol exists in the repo.
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.



To: martinvonz, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list