From bd2ecbae58213046a468256b95fc4864de25bdf5 Mon Sep 17 00:00:00 2001 From: Lidong Yan Date: Fri, 17 Oct 2025 10:38:36 +0800 Subject: [PATCH] diff: stop output garbled message in dry run mode In dry run mode, diff_flush_patch() should not produce any output. However, in commit b55e6d36eb (diff: ensure consistent diff behavior with ignore options, 2025-08-08), only the output during the comparison of two file contents was suppressed. For file deletions or mode changes, diff_flush_patch() still produces output. In run_extern_diff(), set quiet to true if in dry run mode. In emit_diff_symbol_from_struct(), directly return if in dry run mode. Signed-off-by: Lidong Yan Signed-off-by: Johannes Schindelin --- diff.c | 5 ++++- t/t4013-diff-various.sh | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/diff.c b/diff.c index 7b5601de2f..eeeca39c30 100644 --- a/diff.c +++ b/diff.c @@ -1357,6 +1357,9 @@ static void emit_diff_symbol_from_struct(struct diff_options *o, int len = eds->len; unsigned flags = eds->flags; + if (o->dry_run) + return; + switch (s) { case DIFF_SYMBOL_NO_LF_EOF: context = diff_get_color_opt(o, DIFF_CONTEXT); @@ -4426,7 +4429,7 @@ static void run_external_diff(const struct external_diff *pgm, { struct child_process cmd = CHILD_PROCESS_INIT; struct diff_queue_struct *q = &diff_queued_diff; - int quiet = !(o->output_format & DIFF_FORMAT_PATCH); + int quiet = !(o->output_format & DIFF_FORMAT_PATCH) || o->dry_run; int rc; /* diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh index cfeec239e0..3a47b2f7cb 100755 --- a/t/t4013-diff-various.sh +++ b/t/t4013-diff-various.sh @@ -661,6 +661,27 @@ test_expect_success 'diff -I: ignore matching file' ' test_grep ! "file1" actual ' +test_expect_success 'diff -I: ignore all content changes' ' + test_when_finished "git rm -f file1 file2" && + : >file1 && + git add file1 && + : >file2 && + git add file2 && + + rm -f file1 file2 && + mkdir file2 && + test_diff_no_content_changes () { + git diff $1 --ignore-blank-lines -I".*" >actual && + test_line_count = 2 actual && + test_grep "file1" actual && + test_grep "file2" actual && + test_grep ! "diff --git" actual + } && + test_diff_no_content_changes "--raw" && + test_diff_no_content_changes "--name-only" && + test_diff_no_content_changes "--name-status" +' + # check_prefix # check only lines with paths to avoid dependency on exact oid/contents check_prefix () {