aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRené Scharfe <l.s.r@web.de>2025-11-09 17:43:36 +0100
committerJunio C Hamano <gitster@pobox.com>2025-11-10 11:23:57 -0800
commitfa052367ef8f7829996ff15368d63edfff0e40c3 (patch)
treefbd4210e322478f1d5d315805c9c7f16512d0110
parentf368df439b31b422169975cc3c95f7db6a46eada (diff)
downloadgit-fa052367ef8f7829996ff15368d63edfff0e40c3.tar.gz
diff: disable rename detection with --quiet
Detecting renames and copies improves diff's output. This effort is wasted if we don't show any. Disable detection in that case. This actually fixes the error code when using the options --cached, --find-copies-harder, --no-ext-diff and --quiet together: run_diff_index() indirectly calls diff-lib.c::show_modified(), which queues even non-modified entries using diff_change() because we need them for copy detection. diff_change() sets flags.has_changes, though, which causes diff_can_quit_early() to declare we're done after seeing only the very first entry -- way too soon. Using --cached, --find-copies-harder and --quiet together without --no-ext-diff was not affected even before, as it causes the flag flags.diff_from_contents to be set, which disables the optimization in a different way. Reported-by: D. Ben Knoble <ben.knoble@gmail.com> Suggested-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--diff.c2
-rwxr-xr-xt/t4007-rename-3.sh10
2 files changed, 12 insertions, 0 deletions
diff --git a/diff.c b/diff.c
index 90e8003dd1..e4f8c0dc6c 100644
--- a/diff.c
+++ b/diff.c
@@ -4965,6 +4965,8 @@ void diff_setup_done(struct diff_options *options)
if (options->flags.quick) {
options->output_format = DIFF_FORMAT_NO_OUTPUT;
options->flags.exit_with_status = 1;
+ options->detect_rename = 0;
+ options->flags.find_copies_harder = 0;
}
/*
diff --git a/t/t4007-rename-3.sh b/t/t4007-rename-3.sh
index e8faf0dd2e..3fc81bcd76 100755
--- a/t/t4007-rename-3.sh
+++ b/t/t4007-rename-3.sh
@@ -41,6 +41,16 @@ test_expect_success 'copy detection, cached' '
compare_diff_raw current expected
'
+test_expect_success 'exit code of quiet copy detection' '
+ test_expect_code 1 \
+ git diff --quiet --cached --find-copies-harder $tree
+'
+
+test_expect_success 'exit code of quiet copy detection with --no-ext-diff' '
+ test_expect_code 1 \
+ git diff --quiet --cached --find-copies-harder --no-ext-diff $tree
+'
+
# In the tree, there is only path0/COPYING. In the cache, path0 and
# path1 both have COPYING and the latter is a copy of path0/COPYING.
# However when we say we care only about path1, we should just see