[PATCH] match: support reading pattern lists from files
Steve Borho
steve at borho.org
Wed Dec 29 17:03:06 CST 2010
# HG changeset patch
# User Steve Borho <steve at borho.org>
# Date 1293138744 21600
# Node ID 12b820bde1d30effdb879bad8c0346a93bbcd97e
# Parent d85d8ad88de938f4a6a5a0e3818eab70fc0c2ec0
match: support reading pattern lists from files
diff -r d85d8ad88de9 -r 12b820bde1d3 mercurial/help/patterns.txt
--- a/mercurial/help/patterns.txt Wed Dec 29 15:31:25 2010 -0600
+++ b/mercurial/help/patterns.txt Thu Dec 23 15:12:24 2010 -0600
@@ -20,6 +20,11 @@
To use a Perl/Python regular expression, start a name with ``re:``.
Regexp pattern matching is anchored at the root of the repository.
+To read name patterns from a file, use ``listfile:`` or ``listfile0:``.
+The latter expects null delimited patterns while the former expects line
+feeds. Each string read from the file is itself treated as a file
+pattern.
+
Plain examples::
path:foo/bar a name bar in a directory named foo in the root
@@ -39,3 +44,8 @@
Regexp examples::
re:.*\.c$ any name ending in ".c", anywhere in the repository
+
+File examples::
+
+ listfile:list.txt read list from list.txt with one file pattern per line
+ listfile0:list.txt read list from list.txt with null byte delimiters
diff -r d85d8ad88de9 -r 12b820bde1d3 mercurial/match.py
--- a/mercurial/match.py Wed Dec 29 15:31:25 2010 -0600
+++ b/mercurial/match.py Thu Dec 23 15:12:24 2010 -0600
@@ -161,7 +161,8 @@
actual pattern."""
if ':' in pat:
kind, val = pat.split(':', 1)
- if kind in ('re', 'glob', 'path', 'relglob', 'relpath', 'relre'):
+ if kind in ('re', 'glob', 'path', 'relglob', 'relpath', 'relre',
+ 'listfile', 'listfile0'):
return kind, val
return default, pat
@@ -270,6 +271,15 @@
name = util.canonpath(root, cwd, name, auditor)
elif kind in ('relglob', 'path'):
name = util.normpath(name)
+ elif kind in ('listfile', 'listfile0'):
+ delimiter = kind == 'listfile0' and '\0' or '\n'
+ try:
+ files = open(name, 'r').read().split(delimiter)
+ files = [f for f in files if f]
+ except EnvironmentError:
+ raise util.Abort(_("unable to read file list (%s)") % name)
+ pats += _normalize(files, default, root, cwd, auditor)
+ continue
pats.append((kind, name))
return pats
More information about the Mercurial-devel
mailing list