mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
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:
14
dir.c
14
dir.c
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user