diff options
| author | Patrick Steinhardt <ps@pks.im> | 2019-04-05 10:22:46 +0200 |
|---|---|---|
| committer | Patrick Steinhardt <ps@pks.im> | 2019-04-05 10:22:46 +0200 |
| commit | 9d117e20119ffa1814253d822598d33721d04ece (patch) | |
| tree | 0a71134bad7eafcfd24c677b38bbcc8e3198ac6d /tests/attr | |
| parent | aeea1c463941806a0176859c06c0e2e9716efcb0 (diff) | |
| download | libgit2-9d117e20119ffa1814253d822598d33721d04ece.tar.gz | |
ignore: treat paths with trailing "/" as directories
The function `git_ignore_path_is_ignored` is there to test the
ignore status of paths that need not necessarily exist inside of
a repository. This has the implication that for a given path, we
cannot always decide whether it references a directory or a file,
and we need to distinguish those cases because ignore rules may
treat those differently. E.g. given the following gitignore file:
*
!/**/
we'd only want to unignore directories, while keeping files
ignored. But still, calling `git_ignore_path_is_ignored("dir/")`
will say that this directory is ignored because it treats "dir/"
as a file path.
As said, the `is_ignored` function cannot always decide whether
the given path is a file or directory, and thus it may produce
wrong results in some cases. While this is unfixable in the
general case, we can do better when we are being passed a path
name with a trailing path separator (e.g. "dir/") and always
treat them as directories.
Diffstat (limited to 'tests/attr')
| -rw-r--r-- | tests/attr/ignore.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/tests/attr/ignore.c b/tests/attr/ignore.c index 110304a81..1bf06fc1f 100644 --- a/tests/attr/ignore.c +++ b/tests/attr/ignore.c @@ -397,3 +397,19 @@ void test_attr_ignore__ignored_subdirfiles_with_negations(void) assert_is_ignored(true, "dir/sub1/c.test"); } +void test_attr_ignore__negative_directory_rules_only_match_directories(void) +{ + cl_git_rewritefile( + "attr/.gitignore", + "*\n" + "!/**/\n" + "!*.keep\n" + "!.gitignore\n" + ); + + assert_is_ignored(true, "src"); + assert_is_ignored(true, "src/A"); + assert_is_ignored(false, "src/"); + assert_is_ignored(false, "src/A.keep"); + assert_is_ignored(false, ".gitignore"); +} |
