summaryrefslogtreecommitdiff
path: root/tests/diff/iterator.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2014-05-06 12:41:26 -0700
committerRussell Belfer <rb@github.com>2014-05-06 12:41:26 -0700
commitf554611a274aafd702bd899f4663c16eb76ae8f0 (patch)
treeec8a997094d70bb4a5dad0471d6fc38721d900a9 /tests/diff/iterator.c
parentd2c16e9ac4921e94eb5db972e6b8452d71a623fc (diff)
downloadlibgit2-f554611a274aafd702bd899f4663c16eb76ae8f0.tar.gz
Improve checks for ignore containmentrb/how-broken-can-ignores-be
The diff code was using an "ignored_prefix" directory to track if a parent directory was ignored that contained untracked files alongside tracked files. Unfortunately, when negative ignore rules were used for directories inside ignored parents, the wrong rules were applied to untracked files inside the negatively ignored child directories. This commit moves the logic for ignore containment into the workdir iterator (which is a better place for it), so the ignored-ness of a directory is contained in the frame stack during traversal. This allows a child directory to override with a negative ignore and yet still restore the ignored state of the parent when we traverse out of the child. Along with this, there are some problems with "directory only" ignore rules on container directories. Given "a/*" and "!a/b/c/" (where the second rule is a directory rule but the first rule is just a generic prefix rule), then the directory only constraint was having "a/b/c/d/file" match the first rule and not the second. This was fixed by having ignore directory-only rules test a rule against the prefix of a file with LEADINGDIR enabled. Lastly, spot checks for ignores using `git_ignore_path_is_ignored` were tested from the top directory down to the bottom to deal with the containment problem, but this is wrong. We have to test bottom to top so that negative subdirectory rules will be checked before parent ignore rules. This does change the behavior of some existing tests, but it seems only to bring us more in line with core Git, so I think those changes are acceptable.
Diffstat (limited to 'tests/diff/iterator.c')
-rw-r--r--tests/diff/iterator.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/tests/diff/iterator.c b/tests/diff/iterator.c
index cdc64eb1d..a2df1c7a7 100644
--- a/tests/diff/iterator.c
+++ b/tests/diff/iterator.c
@@ -647,7 +647,7 @@ static void workdir_iterator_test(
void test_diff_iterator__workdir_0(void)
{
- workdir_iterator_test("attr", NULL, NULL, 27, 1, NULL, "ign");
+ workdir_iterator_test("attr", NULL, NULL, 23, 5, NULL, "ign");
}
static const char *status_paths[] = {