git check-ignore returns 0 for negated masks
diff mbox series

Message ID 20191119140135.GA7389@seldon.slonopotamus.org
State New
Headers show
Series
  • git check-ignore returns 0 for negated masks
Related show

Commit Message

marat@seldon.slonopotamus.org Nov. 19, 2019, 2:01 p.m. UTC
Way to reproduce:

$ git --version
git version 2.24.0
$ mkdir /tmp/checkignore
$ cd /tmp/checkignore
$ git init
Initialized empty Git repository in /tmp/checkignore/.git/
$ echo '!*.txt' > .gitignore
$ git check-ignore 1.txt
1.txt
$ echo $?
0

I believe this is a bug because it contradicts check-ignore documentation:

  0 - One or more of the provided paths is ignored.
  1 - None of the provided paths are ignored.

This bug isn't hard to fix, however:

1. That causes several tests to fail because they test for exit code that I concider to be wrong.
2. I'm not sure how to handle negated masks when check-ignore prints matching patterns.
   Printing what pattern caused file to be *not* ignored seems useful,
   but others may think that there's "mask is printed iff the file is ignored" rule.

Comments

Junio C Hamano Nov. 20, 2019, 3:48 a.m. UTC | #1
marat@seldon.slonopotamus.org writes:

> I believe this is a bug because it contradicts check-ignore documentation:
>
>   0 - One or more of the provided paths is ignored.
>   1 - None of the provided paths are ignored.

I think the doc was written with primarily positive entries in mind
(it might even predate the introduction of the feature to allow
negative entries in the file), so it might need to be adjusted with
something like s/be ignored/match the pattern/, perhaps?

Patch
diff mbox series

diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c
index 5a4f92395f..d0711434e6 100644
--- a/builtin/check-ignore.c
+++ b/builtin/check-ignore.c
@@ -111,7 +111,7 @@  static int check_ignore(struct dir_struct *dir,
                }
                if (!quiet && (pattern || show_non_matching))
                        output_pattern(pathspec.items[i].original, pattern);
-               if (pattern)
+               if (pattern && !(pattern->flags & PATTERN_FLAG_NEGATIVE))
                        num_ignored++;
        }
        free(seen);