# HG changeset patch # User Denis Laxalde # Date 1507123663 -7200 # Node ID 39b094e4ae2c9bc6af062712c486e0514277ecd8 # Parent 962f7df21a73f044d171fee9c237d0c5062ae317 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 -r 962f7df21a73 -r 39b094e4ae2c mercurial/revset.py --- a/mercurial/revset.py Fri Oct 06 17:53:36 2017 +0200 +++ b/mercurial/revset.py Wed Oct 04 15:27:43 2017 +0200 @@ -981,16 +981,9 @@ 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 -r 962f7df21a73 -r 39b094e4ae2c mercurial/scmutil.py --- a/mercurial/scmutil.py Fri Oct 06 17:53:36 2017 +0200 +++ b/mercurial/scmutil.py Wed Oct 04 15:27:43 2017 +0200 @@ -567,6 +567,20 @@ '''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