[PATCH 1 of 4 v3] revset: extract a parsefollowlinespattern helper function
Denis Laxalde
denis at laxalde.org
Tue Oct 10 15:37:24 UTC 2017
# HG changeset patch
# User Denis Laxalde <denis.laxalde at logilab.fr>
# Date 1507123663 -7200
# Wed Oct 04 15:27:43 2017 +0200
# Node ID ed448196d36e77587bf8471405dc46df39320e2e
# Parent e41138bb56bcde3db4d5277b31eca03007119ead
# Available At http://hg.logilab.org/users/dlaxalde/hg
# hg pull http://hg.logilab.org/users/dlaxalde/hg -r ed448196d36e
# EXP-Topic followlines-cli/v2
revset: extract a parsefollowlinespattern helper function
We'll need the same logic in forthcoming changeset to handle --line-range
option in 'hg log' command.
The function lives in scmutil.py (rather than util.py) as it uses match and
pathutil modules.
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -981,16 +981,9 @@ def followlines(repo, subset, x):
rev = revs.last()
pat = getstring(args['file'], _("followlines requires a pattern"))
- if not matchmod.patkind(pat):
- fname = pathutil.canonpath(repo.root, repo.getcwd(), pat)
- else:
- m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=repo[rev])
- files = [f for f in repo[rev] if m(f)]
- if len(files) != 1:
- # i18n: "followlines" is a keyword
- raise error.ParseError(_("followlines expects exactly one file"))
- fname = files[0]
-
+ # i18n: "followlines" is a keyword
+ msg = _("followlines expects exactly one file")
+ fname = scmutil.parsefollowlinespattern(repo, rev, pat, msg)
# i18n: "followlines" is a keyword
lr = getrange(args['lines'][0], _("followlines expects a line range"))
fromline, toline = [getinteger(a, _("line range bounds must be integers"))
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -567,6 +567,20 @@ def matchfiles(repo, files, badfn=None):
'''Return a matcher that will efficiently match exactly these files.'''
return matchmod.exact(repo.root, repo.getcwd(), files, badfn=badfn)
+def parsefollowlinespattern(repo, rev, pat, msg):
+ """Return a file name from `pat` pattern suitable for usage in followlines
+ logic.
+ """
+ if not matchmod.patkind(pat):
+ return pathutil.canonpath(repo.root, repo.getcwd(), pat)
+ else:
+ ctx = repo[rev]
+ m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=ctx)
+ files = [f for f in ctx if m(f)]
+ if len(files) != 1:
+ raise error.ParseError(msg)
+ return files[0]
+
def origpath(ui, repo, filepath):
'''customize where .orig files are created
More information about the Mercurial-devel
mailing list