From: "brian m. carlson" <sandals@crustytoothpaste.net>
To: Thomas Guyot-Sionnest <tguyot@gmail.com>
Cc: git@vger.kernel.org, dermoth@aei.ca
Subject: Re: [PATCH 2/2] Allow passing pipes for input pipes to diff --no-index
Date: Fri, 18 Sep 2020 21:56:23 +0000 [thread overview]
Message-ID: <20200918215623.GE67496@camp.crustytoothpaste.net> (raw)
In-Reply-To: <20200918113256.8699-3-tguyot@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3168 bytes --]
On 2020-09-18 at 11:32:56, Thomas Guyot-Sionnest wrote:
> diff --git a/diff-no-index.c b/diff-no-index.c
> index 7814eabfe0..779c686d23 100644
> --- a/diff-no-index.c
> +++ b/diff-no-index.c
> @@ -41,6 +41,33 @@ static int read_directory_contents(const char *path, struct string_list *list)
> */
> static const char file_from_standard_input[] = "-";
>
> +/* Check that file is - (STDIN) or unnamed pipe - explicitly
> + * avoid on-disk named pipes which could block
> + */
> +static int ispipe(const char *name)
> +{
> + struct stat st;
> +
> + if (name == file_from_standard_input)
> + return 1; /* STDIN */
> +
> + if (!lstat(name, &st)) {
> + if (S_ISLNK(st.st_mode)) {
> + /* symlink - read it and check it doesn't exists
> + * as a file yet link to a pipe */
> + struct strbuf sb = STRBUF_INIT;
> + strbuf_realpath(&sb, name, 0);
> + /* We're abusing strbuf_realpath here, it may append
> + * pipe:[NNNNNNNNN] to an abs path */
> + if (!stat(sb.buf, &st))
> + return 0; /* link target exists , not pipe */
> + if (!stat(name, &st))
> + return S_ISFIFO(st.st_mode);
This makes a lot of assumptions about the implementation which are
specific to Linux, namely that an anonymous pipe will be a symlink to a
FIFO. That's not the case on macOS, where the /dev/fd entries are
actually named pipes themselves.
Granted, in that case, Git just chokes and fails instead of diffing the
symlink values, but I suspect you'll want this to work on macOS as well.
I don't use macOS that often, but I would appreciate it if it worked
when I did, and I'm sure others will as well.
I think we can probably get away with just doing a regular stat and
seeing if S_ISFIFO is true, which is both simpler and cheaper.
> diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh
> index 0168946b63..e49f773515 100755
> --- a/t/t4053-diff-no-index.sh
> +++ b/t/t4053-diff-no-index.sh
> @@ -144,4 +144,193 @@ test_expect_success 'diff --no-index allows external diff' '
> test_cmp expect actual
> '
>
> +test_expect_success 'diff --no-index can diff piped subshells' '
> + echo 1 >non/git/c &&
> + test_expect_code 0 git diff --no-index non/git/b <(cat non/git/c) &&
> + test_expect_code 0 git diff --no-index <(cat non/git/b) non/git/c &&
> + test_expect_code 0 git diff --no-index <(cat non/git/b) <(cat non/git/c) &&
> + test_expect_code 0 cat non/git/b | git diff --no-index - non/git/c &&
> + test_expect_code 0 cat non/git/c | git diff --no-index non/git/b - &&
> + test_expect_code 0 cat non/git/b | git diff --no-index - <(cat non/git/c) &&
> + test_expect_code 0 cat non/git/c | git diff --no-index <(cat non/git/b) -
> +'
As mentioned by others, this requires non-POSIX syntax. /bin/sh on my
Debian system is dash, which doesn't support this. You can either use a
prerequisite, or just test by piping from standard input and assume that
Git can handle the rest. I would recommend at least adding some POSIX
testcases that use only a pipe from standard input to avoid regressing
this behavior on Debian and Ubuntu.
--
brian m. carlson: Houston, Texas, US
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 263 bytes --]
next prev parent reply other threads:[~2020-09-18 21:57 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-18 11:32 Allow passing pipes to diff --no-index + bugfix Thomas Guyot-Sionnest
2020-09-18 11:32 ` [PATCH 1/2] diff: Fix modified lines stats with --stat and --numstat Thomas Guyot-Sionnest
2020-09-18 14:46 ` Taylor Blau
2020-09-18 15:10 ` Thomas Guyot-Sionnest
2020-09-18 17:37 ` Jeff King
2020-09-18 18:00 ` Thomas Guyot-Sionnest
2020-09-20 4:53 ` Thomas Guyot
2020-09-18 17:27 ` Jeff King
2020-09-18 17:52 ` Thomas Guyot-Sionnest
2020-09-18 18:06 ` Junio C Hamano
2020-09-23 19:16 ` Johannes Schindelin
2020-09-23 19:23 ` Junio C Hamano
2020-09-23 20:44 ` Johannes Schindelin
2020-09-24 4:49 ` Thomas Guyot
2020-09-24 5:24 ` [PATCH v3] " Thomas Guyot-Sionnest
2020-09-24 7:41 ` [PATCH v4] " Thomas Guyot-Sionnest
2020-09-24 6:40 ` [PATCH 1/2] " Junio C Hamano
2020-09-24 7:13 ` Thomas Guyot
2020-09-24 17:19 ` Junio C Hamano
2020-09-24 17:38 ` Junio C Hamano
2020-09-23 15:05 ` Johannes Schindelin
2020-09-20 13:09 ` [PATCH v2] " Thomas Guyot-Sionnest
2020-09-20 15:39 ` Taylor Blau
2020-09-20 16:38 ` Thomas Guyot
2020-09-20 19:11 ` Junio C Hamano
2020-09-20 20:08 ` Junio C Hamano
2020-09-20 20:36 ` Junio C Hamano
2020-09-20 22:15 ` Junio C Hamano
2020-09-21 19:26 ` Jeff King
2020-09-21 21:51 ` Junio C Hamano
2020-09-21 22:20 ` Jeff King
2020-09-21 22:37 ` Junio C Hamano
2020-09-18 11:32 ` [PATCH 2/2] Allow passing pipes for input pipes to diff --no-index Thomas Guyot-Sionnest
2020-09-18 14:36 ` Taylor Blau
2020-09-18 16:34 ` Thomas Guyot-Sionnest
2020-09-18 17:19 ` Jeff King
2020-09-18 17:21 ` Jeff King
2020-09-18 17:39 ` Thomas Guyot-Sionnest
2020-09-18 17:48 ` Junio C Hamano
2020-09-18 18:02 ` Jeff King
2020-09-20 12:54 ` Thomas Guyot
2020-09-21 19:31 ` Jeff King
2020-09-21 20:14 ` Junio C Hamano
2020-09-18 17:58 ` Taylor Blau
2020-09-18 18:05 ` Jeff King
2020-09-18 17:20 ` Jeff King
2020-09-18 18:00 ` Taylor Blau
2020-09-18 21:56 ` brian m. carlson [this message]
2020-09-18 17:51 ` Allow passing pipes to diff --no-index + bugfix Junio C Hamano
2020-09-18 18:24 ` Thomas Guyot-Sionnest
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200918215623.GE67496@camp.crustytoothpaste.net \
--to=sandals@crustytoothpaste.net \
--cc=dermoth@aei.ca \
--cc=git@vger.kernel.org \
--cc=tguyot@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.