Skip to content

Commit

Permalink
diff --no-index: refuse to compare stdin to a directory
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
phillipwood authored and gitster committed Jul 5, 2023
1 parent a9e066f commit 4981984
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 5 deletions.
12 changes: 7 additions & 5 deletions diff-no-index.c
Expand Up @@ -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) {
Expand Down
5 changes: 5 additions & 0 deletions t/t4053-diff-no-index.sh
Expand Up @@ -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

0 comments on commit 4981984

Please sign in to comment.