]> git.ipfire.org Git - thirdparty/git.git/commit - diff.c
diff-filter: be more careful when looking for negative bits
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 28 Jan 2022 12:02:50 +0000 (12:02 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 28 Jan 2022 18:18:18 +0000 (10:18 -0800)
commit75408ca94980c125b3a800003c3e6b7cdcb27d44
treeaa07d5a9eb5f01f9765132a18fc25dd73fbf66e8
parent4d4d4eaa7b7f7ceda0648273ad33b71fc68e36c1
diff-filter: be more careful when looking for negative bits

The `--diff-filter=<bits>` option allows to filter the diff by certain
criteria, for example `R` to only show renamed files. It also supports
negating a filter via a down-cased letter, i.e. `r` to show _everything
but_ renamed files.

However, the code is a bit overzealous when trying to figure out whether
`git diff` should start with all diff-filters turned on because the user
provided a lower-case letter: if the `--diff-filter` argument starts
with an upper-case letter, we must not start with all bits turned on.

Even worse, it is possible to specify the diff filters in multiple,
separate options, e.g. `--diff-filter=AM [...] --diff-filter=m`.

Let's accumulate the include/exclude filters independently, and only
special-case the "only exclude filters were specified" case after
parsing the options altogether.

Note: The code replaced by this commit took pains to avoid setting any
unused bits of `options->filter`. That was unnecessary, though, as all
accesses happen via the `filter_bit_tst()` function using specific bits,
and setting the unused bits has no effect. Therefore, we can simplify
the code by using `~0` (or in this instance, `~<unwanted-bit>`).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
diff.h
t/t4202-log.sh