Mercurial > hg
diff mercurial/match.py @ 21815:a4b67bf1f0a5 stable
match: make glob '**/' match the empty string
Previously, a glob pattern of the form 'foo/**/bar' would match 'foo/a/bar' but
not 'foo/bar'. That was because the '**' in 'foo/**/bar' would be translated to
'.*', making the final regex pattern 'foo/.*/bar'. That pattern doesn't match
the string 'foo/bar'.
This is a bug because the '**/' glob matches the empty string in standard Unix
shells like bash and zsh.
Fix that by making the ending '/' optional if an empty string can be matched.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Wed, 25 Jun 2014 14:50:48 -0700 |
parents | a2f4ea82d6d3 |
children | 335bb8b80443 |
line wrap: on
line diff
--- a/mercurial/match.py Wed Jun 18 19:46:18 2014 -0500 +++ b/mercurial/match.py Wed Jun 25 14:50:48 2014 -0700 @@ -233,6 +233,10 @@ [^/]* >>> print _globre(r'**') .* + >>> print _globre(r'**/a') + (?:.*/)?a + >>> print _globre(r'a/**/b') + a\/(?:.*/)?b >>> print _globre(r'[a*?!^][^b][!c]') [a*?!^][\^b][^c] >>> print _globre(r'{a,b}') @@ -254,7 +258,11 @@ elif c == '*': if peek() == '*': i += 1 - res += '.*' + if peek() == '/': + i += 1 + res += '(?:.*/)?' + else: + res += '.*' else: res += '[^/]*' elif c == '?':