Skip to content
Snippets Groups Projects
Commit a4b67bf1f0a5 authored by Siddharth Agarwal's avatar Siddharth Agarwal
Browse files

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.
parent b2dc026a9bd2
No related branches found
No related tags found
No related merge requests found
......@@ -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 == '?':
......
......@@ -134,3 +134,17 @@
? a.c
? a.o
? syntax
Check recursive glob pattern matches no directories (dir/**/c.o matches dir/c.o)
$ echo "syntax: glob" > .hgignore
$ echo "dir/**/c.o" >> .hgignore
$ touch dir/c.o
$ mkdir dir/subdir
$ touch dir/subdir/c.o
$ hg status
A dir/b.o
? .hgignore
? a.c
? a.o
? syntax
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment