Uploaded image for project: 'Subversion'
  1. Subversion
  2. SVN-4879

Broken pipe on the diff command with --diff-cmd

Attach filesAttach ScreenshotAdd voteVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.14.1
    • None
    • cmdline client
    • 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).

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            vinc17 Vincent Lefevre

            Dates

              Created:
              Updated:

              Issue deployment