D3313: scmutil: make shortesthexnodeidprefix() use unfiltered repo

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Fri Apr 13 18:00:40 UTC 2018


martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  Both callers were doing this, and resolvehexnodeidprefix() was also
  working on the unfiltered repo, so it makes more sense to have it all
  in one place.

REPOSITORY
  rHG Mercurial

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."""
-    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/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