Add support for ** matches in ignores

This is an experimental addition to add ** support to fnmatch
pattern matching in libgit2.  It needs more testing.
This commit is contained in:
Russell Belfer 2014-04-04 17:02:12 -07:00
parent 923c84008d
commit 2b6b85f116
2 changed files with 21 additions and 3 deletions

View File

@ -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,13 @@ p_fnmatchx(const char *pattern, const char *string, int flags, size_t recurs)
break;
case '*':
c = *pattern;
/* Collapse multiple stars. */
while (c == '*')
/* Apply '**' to overwrite PATHNAME match */
if (c == '*') {
flags &= ~FNM_PATHNAME;
while (c == '*')
c = *++pattern;
}
if (*string == '.' && (flags & FNM_PERIOD) &&
(string == stringstart ||
@ -80,7 +85,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))

View File

@ -54,6 +54,19 @@ void test_attr_ignore__ignore_root(void)
assert_is_ignored(true, "NewFolder/NewFolder/File.txt");
}
void test_attr_ignore__full_paths(void)
{
cl_git_rewritefile("attr/.gitignore", "Folder/*/Contained");
assert_is_ignored(true, "Folder/Middle/Contained");
assert_is_ignored(false, "Folder/Middle/More/More/Contained");
cl_git_rewritefile("attr/.gitignore", "Folder/**/Contained");
assert_is_ignored(true, "Folder/Middle/Contained");
assert_is_ignored(true, "Folder/Middle/More/More/Contained");
}
void test_attr_ignore__skip_gitignore_directory(void)
{