# HG changeset patch # User Rodrigo Damazio Bovendorp <rdama...@google.com> # Date 1475944120 25200 # Sat Oct 08 09:28:40 2016 -0700 # Node ID 545efe5a72efdce925a6a3fd3774b350c90b5c55 # Parent dbcef8918bbdd8a64d9f79a37bcfa284a26f3a39 match: adding non-recursive directory matching
This allows one to match all files in a directory, without matching anything in subdirectories. It's implemented almost identically to path:, except for the regex termination, which doesn't allow more than one / after the directory name. diff --git a/mercurial/match.py b/mercurial/match.py --- a/mercurial/match.py +++ b/mercurial/match.py @@ -105,6 +105,9 @@ 'glob:<glob>' - a glob relative to cwd 're:<regexp>' - a regular expression 'path:<path>' - a path relative to repository root + 'files:<path>' - a path relative to repository root, which is matched + non-recursively (files inside the directory will match, + but subdirectories and files in them won't 'relglob:<glob>' - an unrooted glob (*.c matches C files in all dirs) 'relpath:<path>' - a path relative to cwd 'relre:<regexp>' - a regexp that needn't match the start of a name @@ -286,7 +289,7 @@ for kind, pat in [_patsplit(p, default) for p in patterns]: if kind in ('glob', 'relpath'): pat = pathutil.canonpath(root, cwd, pat, auditor) - elif kind in ('relglob', 'path'): + elif kind in ('relglob', 'path', 'files'): pat = util.normpath(pat) elif kind in ('listfile', 'listfile0'): try: @@ -447,7 +450,8 @@ if ':' in pattern: kind, pat = pattern.split(':', 1) if kind in ('re', 'glob', 'path', 'relglob', 'relpath', 'relre', - 'listfile', 'listfile0', 'set', 'include', 'subinclude'): + 'listfile', 'listfile0', 'set', 'include', 'subinclude', + 'files'): return kind, pat return default, pattern @@ -540,6 +544,19 @@ if pat == '.': return '' return '^' + util.re.escape(pat) + '(?:/|$)' + if kind == 'files': + # Match one of: + # For pat = 'some/dir': + # some/dir + # some/dir/ + # some/dir/filename + # For pat = '' or pat = '.': + # filename + if pat == '.': + escaped = '' + else: + escaped = util.re.escape(pat) + return '^' + escaped + '(?:^|/|$)[^/]*$' if kind == 'relglob': return '(?:|.*/)' + _globre(pat) + globsuffix if kind == 'relpath': @@ -628,7 +645,7 @@ break root.append(p) r.append('/'.join(root) or '.') - elif kind in ('relpath', 'path'): + elif kind in ('relpath', 'path', 'files'): r.append(pat or '.') else: # relglob, re, relre r.append('.') diff --git a/tests/test-locate.t b/tests/test-locate.t --- a/tests/test-locate.t +++ b/tests/test-locate.t @@ -52,6 +52,12 @@ t/b t/e.h t/x + $ hg locate files: + b + t.h + $ hg locate files:. + b + t.h $ hg locate -r 0 a a $ hg locate -r 0 NONEXISTENT @@ -119,6 +125,13 @@ ../t/e.h (glob) ../t/x (glob) + $ hg files files: + ../b (glob) + ../t.h (glob) + $ hg files files:. + ../b (glob) + ../t.h (glob) + $ hg locate b ../b (glob) ../t/b (glob) diff --git a/tests/test-walk.t b/tests/test-walk.t --- a/tests/test-walk.t +++ b/tests/test-walk.t @@ -112,6 +112,8 @@ f beans/navy ../beans/navy f beans/pinto ../beans/pinto f beans/turtle ../beans/turtle + $ hg debugwalk -I 'files:mammals' + f mammals/skunk skunk $ hg debugwalk . f mammals/Procyonidae/cacomistle Procyonidae/cacomistle f mammals/Procyonidae/coatimundi Procyonidae/coatimundi _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel