]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff: teach "--stat -w --exit-code" to notice differences
authorJunio C Hamano <gitster@pobox.com>
Fri, 18 Aug 2023 23:59:30 +0000 (16:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 19 Aug 2023 00:01:11 +0000 (17:01 -0700)
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>
diff.c
t/t4015-diff-whitespace.sh

diff --git a/diff.c b/diff.c
index 998d7ae20ca874e2d4cdd2dbe2d6b39c435be6a0..da965ff6880aaa8af768691cfb6d4cf583cbb0ee 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -6901,6 +6901,7 @@ void compute_diffstat(struct diff_options *options,
                if (check_pair_status(p))
                        diff_flush_stat(p, options, diffstat);
        }
+       options->found_changes = !!diffstat->nr;
 }
 
 void diff_addremove(struct diff_options *options,
index 02731dccb9741e625a9e263e4f158298681c92c2..230a89b9519a3b422014ae988447bc54efae2015 100755 (executable)
@@ -11,7 +11,7 @@ TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
-for opts in --patch --quiet -s
+for opts in --patch --quiet -s --stat --shortstat --dirstat=lines
 do
 
        test_expect_success "status with $opts (different)" '