aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2025-11-08 10:33:18 -0800
committerJunio C Hamano <gitster@pobox.com>2025-11-08 10:33:18 -0800
commit1d210232cd120b48b8c70e9fd4bc700be130fc03 (patch)
tree401ba29dc8083d4cc71eabdf7b87980486184c34
parentMerge branch 'ps/ref-peeled-tags-fixes' into jch (diff)
parentdir.c: do not be fooled by :(exclude) pathspec elements (diff)
downloadgit-1d210232cd120b48b8c70e9fd4bc700be130fc03.tar.gz
git-1d210232cd120b48b8c70e9fd4bc700be130fc03.zip
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
-rw-r--r--dir.c14
-rwxr-xr-xt/t2204-add-ignored.sh17
2 files changed, 29 insertions, 2 deletions
diff --git a/dir.c b/dir.c
index b00821f294..2d145a9f61 100644
--- a/dir.c
+++ b/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;
}
diff --git a/t/t2204-add-ignored.sh b/t/t2204-add-ignored.sh
index 31eb233df5..aa55b219ab 100755
--- a/t/t2204-add-ignored.sh
+++ b/t/t2204-add-ignored.sh
@@ -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