Re: git fails with a broken pipe when one quits the pager
From: Johannes Sixt <hidden>
Date: 2021-02-01 22:05:48
Subsystem:
the rest · Maintainer:
Linus Torvalds
Am 31.01.21 um 21:49 schrieb Ævar Arnfjörð Bjarmason:
On Sun, Jan 31 2021, Vincent Lefevre wrote:quoted
On 2021-01-31 02:47:59 +0100, Ævar Arnfjörð Bjarmason wrote:quoted
On Fri, Jan 15 2021, Vincent Lefevre wrote:quoted
And of course, I don't want to hide error messages by default, because this would hide *real* errors.Isn't the solution to this that your shell stops reporting failures due to SIGPIPE in such a prominent way then?No! I want to be warned about real SIGPIPEs.Not being able to write "git log" output is a real SIGPIPE.
When Git is talking to a pager *and* it knows about it because has started it itself, SIGPIPE is just a nuisance, not a useful behavior. Guess why `git log` works on Windows when the pager is quit early, where we do not have SIGPIPE? Because write errors are checked in sufficiently many places. I propose to do just this:
diff --git a/pager.c b/pager.c
index ee435de675..9fcc36425f 100644
--- a/pager.c
+++ b/pager.c@@ -138,6 +138,7 @@ void setup_pager(void) /* this makes sure that the parent terminates after the pager */ sigchain_push_common(wait_for_pager_signal); + sigchain_push(SIGPIPE, SIG_IGN); atexit(wait_for_pager_atexit); }
diff --git a/run-command.c b/run-command.c
index ea4d0fb4b1..c0041413b5 100644
--- a/run-command.c
+++ b/run-command.c@@ -1165,10 +1165,6 @@ void check_pipe(int err) if (err == EPIPE) { if (in_async()) async_exit(141); - - signal(SIGPIPE, SIG_DFL); - raise(SIGPIPE); - /* Should never happen, but just in case... */ exit(141); } }