summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Marti <vicent@github.com>2014-04-07 11:22:23 +0200
committerVicent Marti <vicent@github.com>2014-04-07 11:22:23 +0200
commit6720eef938d7614cd7a9fd2138a27da3667d62cf (patch)
treee022c239b0d39b860af0622a738ea629db304cac /src
parent52056db9c1d6cccf30fc2e22d9b391017bef5eea (diff)
parentc7d9606066d3a9b75a87c4ca5dd3420a66d0b54f (diff)
downloadlibgit2-6720eef938d7614cd7a9fd2138a27da3667d62cf.tar.gz
Merge pull request #2249 from libgit2/rb/starstar-fnmatch
Add support for ** matches in ignores
Diffstat (limited to 'src')
-rw-r--r--src/fnmatch.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/fnmatch.c b/src/fnmatch.c
index e3e47f37b..3846bab3c 100644
--- a/src/fnmatch.c
+++ b/src/fnmatch.c
@@ -30,6 +30,7 @@ p_fnmatchx(const char *pattern, const char *string, int flags, size_t recurs)
const char *stringstart;
char *newp;
char c, test;
+ int recurs_flags = flags & ~FNM_PERIOD;
if (recurs-- == 0)
return FNM_NORES;
@@ -53,9 +54,15 @@ p_fnmatchx(const char *pattern, const char *string, int flags, size_t recurs)
break;
case '*':
c = *pattern;
- /* Collapse multiple stars. */
- while (c == '*')
+
+ /* Let '**' override PATHNAME match for this segment.
+ * It will be restored if/when we recurse below.
+ */
+ if (c == '*') {
+ flags &= ~FNM_PATHNAME;
+ while (c == '*')
c = *++pattern;
+ }
if (*string == '.' && (flags & FNM_PERIOD) &&
(string == stringstart ||
@@ -80,7 +87,7 @@ p_fnmatchx(const char *pattern, const char *string, int flags, size_t recurs)
while ((test = *string) != EOS) {
int e;
- e = p_fnmatchx(pattern, string, flags & ~FNM_PERIOD, recurs);
+ e = p_fnmatchx(pattern, string, recurs_flags, recurs);
if (e != FNM_NOMATCH)
return e;
if (test == '/' && (flags & FNM_PATHNAME))