Patchwork D3313: scmutil: make shortesthexnodeidprefix() use unfiltered repo

login
register
mail settings
Submitter phabricator
Date April 13, 2018, 6 p.m.
Message ID <differential-rev-PHID-DREV-ta7yftxgpgkgeqafndtm-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/30859/
State Superseded
Headers show

Comments

phabricator - April 13, 2018, 6 p.m.
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




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

Patch

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.