# HG changeset patch # User Steve Borho # Date 1293138744 21600 # Node ID 1f4721de2ca9744b3488bf050a11ed23e89889d6 # Parent 637d07d8e377321999734bcd70bab9b0003c3d82 match: support reading pattern lists from files diff -r 637d07d8e377 -r 1f4721de2ca9 mercurial/help/patterns.txt --- a/mercurial/help/patterns.txt Thu Dec 30 23:36:50 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 637d07d8e377 -r 1f4721de2ca9 mercurial/match.py --- a/mercurial/match.py Thu Dec 30 23:36:50 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