On Tue, Aug 24, 2021 at 11:14 AM Vincent Lefevre <[email protected]>
wrote:
>
> Hi,
>
> I've found the following issue. When I pipe the output of
> "svn diff --diff-cmd diff" and a broken pipe occurs on the
> diff command, I get a "Broken pipe" error:
>
> diff: standard output: Broken pipe
> svn: E200012: 'diff' returned 2
>
> Tested with svn, version 1.14.1 (r1886195) under Debian 11 (bullseye).
>
> The cause is that svn runs the diff command with SIGPIPE ignored,
> so that diff gets an EPIPE write error instead of being killed by
> the signal. I think that a fix should be to reset SIGPIPE to the
> default action just before executing the external diff command.
Confirmed.
I don't see mention of it in the issue tracker. Please could you file
it there?
I started looking into it but ran out of time for now. Anyway, SIGPIPE
is ignored throughout the client, for good reasons, since r848296:
(relevant bits of log message):
- Ignore SIGPIPE, to prevent wedging the repos on network errors,
or when piping the output to a command that quits before all data
is read, e.g. head, more or less.
SIGPIPE is disabled in the client (and 2 other programs) by:
+#ifdef SIGPIPE
+ /* Disable SIGPIPE generation for the platforms that have it. */
+ apr_signal(SIGPIPE, SIG_IGN);
+#endif
It would be easy to temporarily re-enable it before executing diff-cmd
but first it's important to make sure that won't break another use
case which the current disabling is handling. (An example of one
question that comes to mind: is it possible to use --diff-cmd with
'svn log -r#### --diff' and if so are there any ramifications to
re-enabling SIGPIPE in that scenario? I haven't checked yet.)
Thanks,
Nathan