You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@subversion.apache.org by "Vincent Lefevre (Jira)" <ji...@apache.org> on 2021/08/26 17:00:15 UTC

[jira] [Created] (SVN-4879) Broken pipe on the diff command with --diff-cmd

Vincent Lefevre created SVN-4879:
------------------------------------

             Summary: Broken pipe on the diff command with --diff-cmd
                 Key: SVN-4879
                 URL: https://issues.apache.org/jira/browse/SVN-4879
             Project: Subversion
          Issue Type: Bug
          Components: cmdline client
    Affects Versions: 1.14.1
         Environment: Debian GNU/Linux.
            Reporter: Vincent Lefevre


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:
{noformat}
diff: standard output: Broken pipe
svn: E200012: 'diff' returned 2{noformat}
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:

 
{noformat}
#!/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{noformat}
 

This gives:
{noformat}
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{noformat}
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).



--
This message was sent by Atlassian Jira
(v8.3.4#803005)