Skip to content

Commit 82e929a

Browse files
authored
Merge pull request libgit2#4239 from roblg/toplevel-dir-ignore-fix
Fix issue with directory glob ignore in subdirectories
2 parents 04de614 + c3b8e8b commit 82e929a

File tree

3 files changed

+96
-2
lines changed

3 files changed

+96
-2
lines changed

src/attr_file.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,9 +395,13 @@ bool git_attr_fnmatch__match(
395395
if ((match->flags & GIT_ATTR_FNMATCH_DIRECTORY) && !path->is_dir) {
396396
bool samename;
397397

398-
/* for attribute checks or root ignore checks, fail match */
398+
/*
399+
* for attribute checks or checks at the root of this match's
400+
* containing_dir (or root of the repository if no containing_dir),
401+
* do not match.
402+
*/
399403
if (!(match->flags & GIT_ATTR_FNMATCH_IGNORE) ||
400-
path->basename == path->path)
404+
path->basename == relpath)
401405
return false;
402406

403407
flags |= FNM_LEADING_DIR;

tests/attr/ignore.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,3 +291,15 @@ void test_attr_ignore__symlink_to_outside(void)
291291
assert_is_ignored(true, "symlink");
292292
assert_is_ignored(true, "lala/../symlink");
293293
}
294+
295+
void test_attr_ignore__test(void)
296+
{
297+
cl_git_rewritefile("attr/.gitignore",
298+
"/*/\n"
299+
"!/src\n");
300+
assert_is_ignored(false, "src/foo.c");
301+
assert_is_ignored(false, "src/foo/foo.c");
302+
assert_is_ignored(false, "README.md");
303+
assert_is_ignored(true, "dist/foo.o");
304+
assert_is_ignored(true, "bin/foo");
305+
}

tests/status/ignore.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,3 +1077,81 @@ void test_status_ignore__negate_starstar(void)
10771077
cl_git_pass(git_ignore_path_is_ignored(&ignored, g_repo, "code/projects/foo/bar/packages/repositories.config"));
10781078
cl_assert_equal_i(0, ignored);
10791079
}
1080+
1081+
void test_status_ignore__ignore_all_toplevel_dirs_include_files(void)
1082+
{
1083+
static const char *test_files[] = {
1084+
"empty_standard_repo/README.md",
1085+
"empty_standard_repo/src/main.c",
1086+
"empty_standard_repo/src/foo/foo.c",
1087+
"empty_standard_repo/dist/foo.o",
1088+
"empty_standard_repo/dist/main.o",
1089+
NULL
1090+
};
1091+
1092+
make_test_data("empty_standard_repo", test_files);
1093+
cl_git_mkfile(
1094+
"empty_standard_repo/.gitignore",
1095+
"/*/\n"
1096+
"!/src\n");
1097+
1098+
assert_is_ignored("dist/foo.o");
1099+
assert_is_ignored("dist/main.o");
1100+
1101+
refute_is_ignored("README.md");
1102+
refute_is_ignored("src/foo.c");
1103+
refute_is_ignored("src/foo/foo.c");
1104+
}
1105+
1106+
void test_status_ignore__subdir_ignore_all_toplevel_dirs_include_files(void)
1107+
{
1108+
static const char *test_files[] = {
1109+
"empty_standard_repo/project/README.md",
1110+
"empty_standard_repo/project/src/main.c",
1111+
"empty_standard_repo/project/src/foo/foo.c",
1112+
"empty_standard_repo/project/dist/foo.o",
1113+
"empty_standard_repo/project/dist/main.o",
1114+
NULL
1115+
};
1116+
1117+
make_test_data("empty_standard_repo", test_files);
1118+
cl_git_mkfile(
1119+
"empty_standard_repo/project/.gitignore",
1120+
"/*/\n"
1121+
"!/src\n");
1122+
1123+
assert_is_ignored("project/dist/foo.o");
1124+
assert_is_ignored("project/dist/main.o");
1125+
1126+
refute_is_ignored("project/src/foo.c");
1127+
refute_is_ignored("project/src/foo/foo.c");
1128+
refute_is_ignored("project/README.md");
1129+
}
1130+
1131+
void test_status_ignore__subdir_ignore_everything_except_certain_files(void)
1132+
{
1133+
static const char *test_files[] = {
1134+
"empty_standard_repo/project/README.md",
1135+
"empty_standard_repo/project/some_file",
1136+
"empty_standard_repo/project/src/main.c",
1137+
"empty_standard_repo/project/src/foo/foo.c",
1138+
"empty_standard_repo/project/dist/foo.o",
1139+
"empty_standard_repo/project/dist/main.o",
1140+
NULL
1141+
};
1142+
1143+
make_test_data("empty_standard_repo", test_files);
1144+
cl_git_mkfile(
1145+
"empty_standard_repo/project/.gitignore",
1146+
"/*\n"
1147+
"!/src\n"
1148+
"!README.md\n");
1149+
1150+
assert_is_ignored("project/some_file");
1151+
assert_is_ignored("project/dist/foo.o");
1152+
assert_is_ignored("project/dist/main.o");
1153+
1154+
refute_is_ignored("project/README.md");
1155+
refute_is_ignored("project/src/foo.c");
1156+
refute_is_ignored("project/src/foo/foo.c");
1157+
}

0 commit comments

Comments
 (0)