Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
1.14.1
-
None
-
None
-
Debian GNU/Linux.
Description
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
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.
To reproduce the bug:
#!/bin/sh set -e export LC_ALL=C mkdir my-test-svn cd my-test-svn svnadmin create svn svn co file://`pwd`/svn wc cd wc seq 10000 > file svn add file svn diff | head svn diff --diff-cmd diff | head cd ../.. rm -rf my-test-svn
This gives:
Checked out revision 0. A file Index: file =================================================================== --- file (nonexistent) +++ file (working copy) @@ -0,0 +1,10000 @@ +1 +2 +3 +4 +5 Index: file =================================================================== --- file (nonexistent) +++ file (working copy) @@ -0,0 +1,10000 @@ +1 +2 +3 +4 +5 diff: standard output: Broken pipe svn: E200012: 'diff' returned 2
A possible fix (to be tested): instead of ignoring SIGPIPE (using SIG_IGN), use a handler that does nothing. That way, when a command is executed, SIGPIPE will be reset to the default action in the command (i.e. killing the command, unless the command itself changes how it handles SIGPIPE).