diff options
author | Vicent Marti <vicent@github.com> | 2014-04-07 11:22:23 +0200 |
---|---|---|
committer | Vicent Marti <vicent@github.com> | 2014-04-07 11:22:23 +0200 |
commit | 6720eef938d7614cd7a9fd2138a27da3667d62cf (patch) | |
tree | e022c239b0d39b860af0622a738ea629db304cac /src | |
parent | 52056db9c1d6cccf30fc2e22d9b391017bef5eea (diff) | |
parent | c7d9606066d3a9b75a87c4ca5dd3420a66d0b54f (diff) | |
download | libgit2-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.c | 13 |
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)) |