D724: templater: extract shortest() logic from template function
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Fri Sep 15 19:37:20 EDT 2017
martinvonz updated this revision to Diff 1860.
martinvonz edited the summary of this revision.
Herald added a reviewer: indygreg.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D724?vs=1859&id=1860
REVISION DETAIL
https://phab.mercurial-scm.org/D724
AFFECTED FILES
mercurial/revlog.py
mercurial/templater.py
CHANGE DETAILS
diff --git a/mercurial/templater.py b/mercurial/templater.py
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -1023,41 +1023,7 @@
# which would be unacceptably slow. so we look for hash collision in
# unfiltered space, which means some hashes may be slightly longer.
cl = mapping['ctx']._repo.unfiltered().changelog
- def isvalid(test):
- try:
- if cl._partialmatch(test) is None:
- return False
-
- try:
- i = int(test)
- # if we are a pure int, then starting with zero will not be
- # confused as a rev; or, obviously, if the int is larger than
- # the value of the tip rev
- if test[0] == '0' or i > len(cl):
- return True
- return False
- except ValueError:
- return True
- except error.RevlogError:
- return False
- except error.WdirUnsupported:
- # single 'ff...' match
- return True
-
- shortest = node
- startlength = max(6, minlength)
- length = startlength
- while True:
- test = node[:length]
- if isvalid(test):
- shortest = test
- if length == minlength or length > startlength:
- return shortest
- length -= 1
- else:
- length += 1
- if len(shortest) <= length:
- return shortest
+ return cl.shortest(node, minlength)
@templatefunc('strip(text[, chars])')
def strip(context, mapping, args):
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -1128,6 +1128,44 @@
raise LookupError(id, self.indexfile, _('no match found'))
+ def shortest(self, hexnode, minlength=1):
+ """Find the shortest unambiguous prefix that matches hexnode."""
+ def isvalid(test):
+ try:
+ if self._partialmatch(test) is None:
+ return False
+
+ try:
+ i = int(test)
+ # if we are a pure int, then starting with zero will not be
+ # confused as a rev; or, obviously, if the int is larger
+ # than the value of the tip rev
+ if test[0] == '0' or i > len(self):
+ return True
+ return False
+ except ValueError:
+ return True
+ except error.RevlogError:
+ return False
+ except error.WdirUnsupported:
+ # single 'ff...' match
+ return True
+
+ shortest = hexnode
+ startlength = max(6, minlength)
+ length = startlength
+ while True:
+ test = hexnode[:length]
+ if isvalid(test):
+ shortest = test
+ if length == minlength or length > startlength:
+ return shortest
+ length -= 1
+ else:
+ length += 1
+ if len(shortest) <= length:
+ return shortest
+
def cmp(self, node, text):
"""compare text with a given file revision
To: martinvonz, #hg-reviewers, quark, indygreg
Cc: quark, mercurial-devel
More information about the Mercurial-devel
mailing list