Commit 657afd35 by Carlos Martín Nieto

ignore: add test and adjust style and comment for dir with wildmatch

The previous commit left the comment referencing the earlier state of
the code, change it to explain the current logic. While here, change the
logic to avoid repeating the copy of the base pattern.
parent 6d0defe3
...@@ -89,18 +89,20 @@ static int does_negate_rule(int *out, git_vector *rules, git_attr_fnmatch *match ...@@ -89,18 +89,20 @@ static int does_negate_rule(int *out, git_vector *rules, git_attr_fnmatch *match
} }
/* /*
* If we're dealing with a directory (which we know via the * When dealing with a directory, we add '/<star>' so
* strchr() check) we want to use 'dirname/<star>' as the * p_fnmatch() honours FNM_PATHNAME. Checking for LEADINGDIR
* pattern so p_fnmatch() honours FNM_PATHNAME * alone isn't enough as that's also set for nagations, so we
* need to check that NEGATIVE is off.
*/ */
git_buf_clear(&buf); git_buf_clear(&buf);
if (rule->containing_dir) { if (rule->containing_dir) {
git_buf_puts(&buf, rule->containing_dir); git_buf_puts(&buf, rule->containing_dir);
} }
if (rule->flags & GIT_ATTR_FNMATCH_LEADINGDIR && !(rule->flags & GIT_ATTR_FNMATCH_NEGATIVE))
error = git_buf_printf(&buf, "%s/*", rule->pattern); error = git_buf_puts(&buf, rule->pattern);
else
error = git_buf_puts(&buf, rule->pattern); if ((rule->flags & (GIT_ATTR_FNMATCH_LEADINGDIR | GIT_ATTR_FNMATCH_NEGATIVE)) == GIT_ATTR_FNMATCH_LEADINGDIR)
error = git_buf_PUTS(&buf, "/*");
if (error < 0) if (error < 0)
goto out; goto out;
......
...@@ -1022,3 +1022,20 @@ void test_status_ignore__negate_exact_previous(void) ...@@ -1022,3 +1022,20 @@ void test_status_ignore__negate_exact_previous(void)
cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, ".buildpath")); cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, ".buildpath"));
cl_assert_equal_i(1, ignored); cl_assert_equal_i(1, ignored);
} }
void test_status_ignore__negate_starstar(void)
{
int ignored;
g_repo = cl_git_sandbox_init("empty_standard_repo");
cl_git_mkfile("empty_standard_repo/.gitignore",
"code/projects/**/packages/*\n"
"!code/projects/**/packages/repositories.config");
cl_git_pass(git_futils_mkdir_r("code/projects/foo/bar/packages", "empty_standard_repo", 0777));
cl_git_mkfile("empty_standard_repo/code/projects/foo/bar/packages/repositories.config", "");
cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "code/projects/foo/bar/packages/repositories.config"));
cl_assert_equal_i(0, ignored);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment