From: Junio C Hamano Date: Fri, 18 Aug 2023 23:59:32 +0000 (-0700) Subject: diff: the -w option breaks --exit-code for --raw and other output modes X-Git-Tag: v2.42.1~46^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a64f8b25953b9cf0f6d81ed24e87448ae513b094;p=thirdparty%2Fgit.git diff: the -w option breaks --exit-code for --raw and other output modes 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 --- diff --git a/diff.c b/diff.c index da965ff688..78f4e7518f 100644 --- 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) diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index 230a89b951..7fcffa4b11 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -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