Re: [PATCH] Don't ignore write failure from git-diff, git-log, etc.
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:13
Jim Meyering [off-list ref] writes:
quoted hunk
... Also, to be consistent with e.g., write_or_die, do not diagnose EPIPE write failures. Signed-off-by: Jim Meyering <redacted> --- 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).
+ } + + exit(status); } } -- 1.5.2.73.g18bece