Skip to content

Commit a64f8b2

Browse files
committed
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 <[email protected]>
1 parent 5626558 commit a64f8b2

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

diff.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4744,6 +4744,10 @@ void diff_setup_done(struct diff_options *options)
47444744
else
47454745
options->prefix_length = 0;
47464746

4747+
/*
4748+
* --name-only, --name-status, --checkdiff, and -s
4749+
* turn other output format off.
4750+
*/
47474751
if (options->output_format & (DIFF_FORMAT_NAME |
47484752
DIFF_FORMAT_NAME_STATUS |
47494753
DIFF_FORMAT_CHECKDIFF |
@@ -6072,6 +6076,8 @@ static void flush_one_pair(struct diff_filepair *p, struct diff_options *opt)
60726076
fprintf(opt->file, "%s", diff_line_prefix(opt));
60736077
write_name_quoted(name_a, opt->file, opt->line_termination);
60746078
}
6079+
6080+
opt->found_changes = 1;
60756081
}
60766082

60776083
static void show_file_mode_name(struct diff_options *opt, const char *newdelete, struct diff_filespec *fs)

t/t4015-diff-whitespace.sh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ TEST_PASSES_SANITIZE_LEAK=true
1111
. ./test-lib.sh
1212
. "$TEST_DIRECTORY"/lib-diff.sh
1313

14-
for opts in --patch --quiet -s --stat --shortstat --dirstat=lines
14+
for opt_res in --patch --quiet -s --stat --shortstat --dirstat=lines \
15+
--raw! --name-only! --name-status!
1516
do
17+
opts=${opt_res%!} expect_failure=
18+
test "$opts" = "$opt_res" ||
19+
expect_failure="test_expect_code 1"
1620

1721
test_expect_success "status with $opts (different)" '
1822
echo foo >x &&
@@ -40,7 +44,7 @@ do
4044
echo foo >x &&
4145
git add x &&
4246
echo " foo" >x &&
43-
git diff -w $opts --exit-code x
47+
$expect_failure git diff -w $opts --exit-code x
4448
'
4549
done
4650

0 commit comments

Comments
 (0)