Merge branch 'jc/exclude-with-gitignore' into seen

"git add ':(exclude)foo.o'" is clearly a request not to add 'foo.o',
but the command complained about listing an ignored path foo.o on
the command line, which has been corrected.

Comments?

* jc/exclude-with-gitignore:
  dir.c: do not be fooled by :(exclude) pathspec elements
This commit is contained in:
Junio C Hamano
2025-12-12 22:11:51 +09:00
2 changed files with 29 additions and 2 deletions

14
dir.c
View File

@@ -2263,6 +2263,8 @@ static int exclude_matches_pathspec(const char *path, int pathlen,
const struct pathspec *pathspec)
{
int i;
int matches_exclude_magic = 0;
int matches_pathspec_elem = 0;
if (!pathspec || !pathspec->nr)
return 0;
@@ -2279,15 +2281,23 @@ static int exclude_matches_pathspec(const char *path, int pathlen,
for (i = 0; i < pathspec->nr; i++) {
const struct pathspec_item *item = &pathspec->items[i];
int len = item->nowildcard_len;
int *matches;
if (item->magic & PATHSPEC_EXCLUDE)
matches = &matches_exclude_magic;
else
matches = &matches_pathspec_elem;
if (len == pathlen &&
!ps_strncmp(item, item->match, path, pathlen))
return 1;
*matches = 1;
if (len > pathlen &&
item->match[pathlen] == '/' &&
!ps_strncmp(item, item->match, path, pathlen))
return 1;
*matches = 1;
}
if (matches_pathspec_elem && !matches_exclude_magic)
return 1;
return 0;
}

View File

@@ -89,4 +89,21 @@ do
'
done
test_expect_success "exclude magic would not interfere with .gitignore" '
test_write_lines dir file sub ign err out "*.o" >.gitignore &&
>foo.o &&
>foo.c &&
test_must_fail git add foo.o 2>err &&
test_grep "are ignored by one" err &&
test_grep "hint: Use -f" err &&
git add ":(exclude)foo.o" &&
git ls-files >actual &&
cat >expect <<-\EOF &&
.gitignore
foo.c
EOF
test_cmp expect actual
'
test_done