Re: git fails with a broken pipe when one quits the pager
- From
- Vincent Lefevre <vincent@vinc17.net>
- Date
- Feb 1, 2021, 10:34 UTC
- Message-ID
- <20210201103429.GT623063@zira.vinc17.org>
- In-Reply-To
- <87o8h4omqa.fsf@evledraar.gmail.com>
On 2021-01-31 21:49:49 +0100, Ævar Arnfjörð Bjarmason wrote:
Show 13 quoted lines
> On Sun, Jan 31 2021, Vincent Lefevre wrote: > > FYI, I already have the exit status already in my prompt (the above > > commands were just for the example). Still, the git behavior is > > disturbing. > > > > Moreover, this doesn't solve the issue when doing something like > > > > git log && some_other_command > > What issue? That we're returning an exit code per getting a SIGHUP here > is a feature. Consider: > > git -c core.pager=/bin/false log && echo showed you the output
If the pager exists with a non-zero exit status, it is normal to return a non-zero exit status. This was not the bug I reported.
> > No! I want to be warned about real SIGPIPEs. > > Not being able to write "git log" output is a real SIGPIPE.
Which is not the case here, because the full output has never been requested by the user.
Show 9 quoted lines
> Is it because in your mind it's got something to do with the "|" shell > piping construct? The SIGPIPE is sent by the kernel, so it's no less > expected in cases like: > > git log && echo foo > > Than: > > git log | cat
See the difference (without the patch) between
$ git log && echo foo; echo $? 141
and
$ git log | head; echo $? [...] 0
[...]
> Maybe we have users who'd like to work around zsh's "setopt > PRINT_EXIT_VALUE" mode (would you want this patch if you could make zsh > ignore 141?).
zsh is working as expected, and as I've already said, I ***WANT*** SIGPIPE to be reported by the shell, as it may indicate a real failure in a script. BTW, I even have a script using git that relies on that:
{ git rev-list --author "$@[-1]" HEAD &&
git rev-list --grep "$@[-1]" HEAD } | \
git "${@[1,-2]:-lv}" --no-walk --stdinreturn $((pipestatus[2] ? pipestatus[2] : pipestatus[1]))
Here it is important not to lose any information. No pager is involved, the full output is needed. If for some reason, the LHS of the pipe fails due to a SIGPIPE but the right hand side succeeds, the error will be reported.
The fact is that with a pager, the SIGPIPE with a pager is normal. Thus with a pager, git is reporting a spurious SIGPIPE, and this is disturbing.
-- Vincent Lefèvre <vincent@vinc17.net> - Web: <https://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)