Re: [PATCH v2 1/4] diff --no-index: refuse to compare stdin to a directory
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jul 5, 2023, 21:17 UTC
- Message-ID
- <xmqqmt0axdlz.fsf@gitster.g>
- In-Reply-To
- <5e65a15223bc42293516308eb31ade5395609c55.1688586536.git.phillip.wood@dunelm.org.uk>
Phillip Wood <phillip.wood123@gmail.com> writes:
Show 13 quoted lines
> From: Phillip Wood <phillip.wood@dunelm.org.uk> > > 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.
"git diff --no-index directory file" would also be the same way.
Makes sense.
Show 5 quoted lines
> - if (path[0] == file_from_standard_input || > - path[1] == file_from_standard_input) > - return; > - isdir0 = is_directory(path[0]); > - isdir1 = is_directory(path[1]);
We used to silently did nonsense, I guess.
Show 6 quoted lines
> + 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"));OK. It is much better than turning "diff - D" into "diff - D/-". If D were a missing or a misspelt directory name, the rest of the function will just leave the original intact and let comparison between the standard input and D that does not exist, and will fail correctly anyway. Good.
Show 17 quoted lines
> if (isdir0 == isdir1)
> return;
> if (isdir0) {
> diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh
> index 4e9fa0403d..5bfb282e98 100755
> --- a/t/t4053-diff-no-index.sh
> +++ b/t/t4053-diff-no-index.sh
> @@ -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