Re: [PATCH] Don't ignore write failure from git-diff, git-log, etc.
- From
Junio C Hamano <junkio@cox.net>
- Date
- May 29, 2007, 23:50 UTC
- Message-ID
- <7v646b5gw5.fsf@assigned-by-dhcp.cox.net>
- In-Reply-To
- <87veebs84i.fsf@rho.meyering.net>
Jim Meyering <jim@meyering.net> writes:
Show 40 quoted lines
> ...
> Also, to be consistent with e.g., write_or_die, do not
> diagnose EPIPE write failures.
>
> Signed-off-by: Jim Meyering <jim@meyering.net>
> ---
> git.c | 19 ++++++++++++++++++-
> 1 files changed, 18 insertions(+), 1 deletions(-)
>
> diff --git a/git.c b/git.c
> index 29b55a1..8258885 100644
> --- a/git.c
> +++ b/git.c
> @@ -308,6 +308,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
> for (i = 0; i < ARRAY_SIZE(commands); i++) {
> struct cmd_struct *p = commands+i;
> const char *prefix;
> + int status;
> if (strcmp(p->cmd, cmd))
> continue;
>
> @@ -321,7 +322,23 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
> die("%s must be run in a work tree", cmd);
> trace_argv_printf(argv, argc, "trace: built-in: git");
>
> - exit(p->fn(argc, argv, prefix));
> + status = p->fn(argc, argv, prefix);
> +
> + /* Close stdout if necessary, and diagnose any failure
> + other than EPIPE. */
> + if (fcntl(fileno (stdout), F_GETFD) >= 0) {
> + errno = 0;
> + if ((ferror(stdout) || fclose(stdout))
> + && errno != EPIPE) {
> + if (errno == 0)
> + die("write failure on standard output");
> + else
> + die("write failure on standard output"
> + ": %s", strerror(errno));
> + }This makes the final write failure trump the breakage p->fn() already diagnosed, doesn't it? Maybe if (fcntrl(...) >=0 ) should read if (!status && fcntrl(...) >= 0).
Show 8 quoted lines
> + } > + > + exit(status); > } > } > > -- > 1.5.2.73.g18bece