]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff --no-index: refuse to compare stdin to a directory
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Wed, 5 Jul 2023 19:49:27 +0000 (20:49 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Jul 2023 21:00:28 +0000 (14:00 -0700)
When the user runs

    git diff --no-index file directory

we follow the behavior of POSIX diff and rewrite the arguments as

    git diff --no-index file directory/file

Doing that when "file" is "-" (which means "read from stdin") does not
make sense so we should error out if the user asks us to compare "-" to
a directory. This matches the behavior of GNU diff and diff on *BSD.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff-no-index.c
t/t4053-diff-no-index.sh

index 4296940f907530ef420a9bc6ba085f2dd1f693a9..77462ac2a9c6bf82c02421d9043f9d1788a065bb 100644 (file)
@@ -218,11 +218,13 @@ static void fixup_paths(const char **path, struct strbuf *replacement)
 {
        unsigned int isdir0, isdir1;
 
-       if (path[0] == file_from_standard_input ||
-           path[1] == file_from_standard_input)
-               return;
-       isdir0 = is_directory(path[0]);
-       isdir1 = is_directory(path[1]);
+       isdir0 = path[0] != file_from_standard_input && is_directory(path[0]);
+       isdir1 = path[1] != file_from_standard_input && is_directory(path[1]);
+
+       if ((path[0] == file_from_standard_input && isdir1) ||
+           (isdir0 && path[1] == file_from_standard_input))
+               die(_("cannot compare stdin to a directory"));
+
        if (isdir0 == isdir1)
                return;
        if (isdir0) {
index 4e9fa0403d3631fdeafd0e90e3ae80894930c2e9..5bfb282e985ac8967f58382d33219f75b16459e5 100755 (executable)
@@ -205,4 +205,9 @@ test_expect_success POSIXPERM,SYMLINKS 'diff --no-index normalizes: mode not lik
        test_cmp expected actual
 '
 
+test_expect_success 'diff --no-index refuses to diff stdin and a directory' '
+       test_must_fail git diff --no-index -- - a </dev/null 2>err &&
+       grep "fatal: cannot compare stdin to a directory" err
+'
+
 test_done