On monday May 28th 2007 at 15:14 Jim Meyering wrote: > > I don't know how many people remember all the _stupid_ problems we had > > exactly because many versions of bash are crap, crap, crap, and people > > (including you) don't realize that EPIPE is _different_ from other write > > errors. > > > > Just do a google search for > > > > "broken pipe" bash > > > > and not only will you see a lot of complaints, but the #5 entry is a > > complaint for a git issue that we had tons of problems with. See for > > example > > > > http://www.gelato.unsw.edu.au/archives/git/0504/2602.html > > Whether bash should print a diagnostic when it kills a process with > SIGPIPE is _different_ from whether the writing process should diagnose > its own write failure arising from a handled SIGPIPE. > > I suspect that git's special treatment of EPIPE was a shoot-the-messenger > reaction to the work-around (trap '' PIPE) required to avoid diagnostics > from porcelain being interpreted by what would now be a 2-year-old > version of bash. It is time to remove that work-around, because it > can obscure real errors, and removing it will be largely unnoticed. Good point. But also notice that when you are stuck with a shell that does complain about SIGPIPE it is _really_ annoying! On current Debian 'sid' with your patch this does not seem to be the case. The second chunk of your patch (to git.c) contains a small copy-paste accident methinks: > @@ -321,7 +322,15 @@ 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. */ > + if (fcntl(fileno (stdout), F_GETFD) >= 0) > + && (ferror(stdout) || fclose(stdout))) > + die("write failure on standard output: %s", > + strerror(errno)); > + > + exit(status); The if statement with 'fcntl' is missing a brace, it should be: + if ((fcntl(fileno (stdout), F_GETFD) >= 0) + && (ferror(stdout) || fclose(stdout))) -- Marco Roeland - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html