diff: teach "--stat -w --exit-code" to notice differences

When options like "-w" is used while "--exit-code" option is in effect, instead of the usual "do we have any filepair whose preimage and postimage have different <mode,object>?" check, we need to compare the contents of the blobs, taking into account that certain changes are considered no-op. With the previous step, we taught "--patch" codepath to set the .found_changes bit correctly, even for a change that only affects the mode and not object. The "--stat" codepath, however, did not set the .found_changes bit at all. This lead to $ git diff --stat -w --exit-code for a change that does have an output to exit with status 0. Set the bit by inspecting the list of paths the diffstat output is given for (a mode-only change will still appear as a "0-line added 0-line deleted" change) to fix it. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Aug 18, 2023 at 16:59 UTC e8efd863699c6927953ebff6cb317c5632b7324d
2 files changed +2 -1
diff.c
+1
@@ -6901,6 +6901,7 @@ void compute_diffstat(struct diff_options *options,
6901 if (check_pair_status(p))
6902 diff_flush_stat(p, options, diffstat);
6903 }
6904 + options->found_changes = !!diffstat->nr;
6905 }
6906
6907 void diff_addremove(struct diff_options *options,
t/t4015-diff-whitespace.sh
+1 -1
@@ -11,7 +11,7 @@ TEST_PASSES_SANITIZE_LEAK=true
11 . ./test-lib.sh
12 . "$TEST_DIRECTORY"/lib-diff.sh
13
14 -for opts in --patch --quiet -s
14 +for opts in --patch --quiet -s --stat --shortstat --dirstat=lines
15 do
16
17 test_expect_success "status with $opts (different)" '