]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff: the -w option breaks --exit-code for --raw and other output modes
authorJunio C Hamano <gitster@pobox.com>
Fri, 18 Aug 2023 23:59:32 +0000 (16:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 22 Aug 2023 01:56:03 +0000 (18:56 -0700)
The output from "--raw", "--name-status", and "--name-only" modes in
"git diff" does depend on and does not reflect how certain different
contents are considered equal, unlike "--patch" and "--stat" output
modes do, when used with options like "-w" (another way of thinking
about it is that it is not like we recompute the hash of the blob
after removing all whitespaces to show "git diff --raw -w" output).

But the fact that "--raw" and friends ignore "-w" is not a good
excuse for "diff --raw -w --exit-code" to also ignore the request to
report the differences with its exit status.  When run without "-w",
"git diff --exit-code --raw" does report with its exit status the
differences as requested, and we should do the same when run with
"-w", too.

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 da965ff6880aaa8af768691cfb6d4cf583cbb0ee..78f4e7518f8e3ca83d5849b782488441b750d1f3 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -4744,6 +4744,10 @@ void diff_setup_done(struct diff_options *options)
        else
                options->prefix_length = 0;
 
+       /*
+        * --name-only, --name-status, --checkdiff, and -s
+        * turn other output format off.
+        */
        if (options->output_format & (DIFF_FORMAT_NAME |
                                      DIFF_FORMAT_NAME_STATUS |
                                      DIFF_FORMAT_CHECKDIFF |
@@ -6072,6 +6076,8 @@ static void flush_one_pair(struct diff_filepair *p, struct diff_options *opt)
                fprintf(opt->file, "%s", diff_line_prefix(opt));
                write_name_quoted(name_a, opt->file, opt->line_termination);
        }
+
+       opt->found_changes = 1;
 }
 
 static void show_file_mode_name(struct diff_options *opt, const char *newdelete, struct diff_filespec *fs)
index 230a89b9519a3b422014ae988447bc54efae2015..7fcffa4b11bdfe14055d9bcecf90150fa6bc5851 100755 (executable)
@@ -11,8 +11,12 @@ TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
-for opts in --patch --quiet -s --stat --shortstat --dirstat=lines
+for opt_res in --patch --quiet -s --stat --shortstat --dirstat=lines \
+              --raw! --name-only! --name-status!
 do
+       opts=${opt_res%!} expect_failure=
+       test "$opts" = "$opt_res" ||
+               expect_failure="test_expect_code 1"
 
        test_expect_success "status with $opts (different)" '
                echo foo >x &&
@@ -40,7 +44,7 @@ do
                echo foo >x &&
                git add x &&
                echo " foo" >x &&
-               git diff -w $opts --exit-code x
+               $expect_failure git diff -w $opts --exit-code x
        '
 done