]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff: disable rename detection with --quiet
authorRené Scharfe <l.s.r@web.de>
Sun, 9 Nov 2025 16:43:36 +0000 (17:43 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Nov 2025 19:23:57 +0000 (11:23 -0800)
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>
diff.c
t/t4007-rename-3.sh

diff --git a/diff.c b/diff.c
index 90e8003dd11e4df314ac8cff73a842164d663c42..e4f8c0dc6c691bb8054a841b68f6f2c7eae26e37 100644 (file)
--- 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;
        }
 
        /*
index e8faf0dd2ef1c5e0dc3aebe19276843d62a658e5..3fc81bcd760081f063334eb20c0c02fe13cf10d8 100755 (executable)
@@ -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