I've found the following bug with Subversion 1.6.16:

  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=627025

The problem is: With the svn+ssh scheme, a ssh process is started and
sets its stderr to non-blocking mode. When executing an API-based svn
client with both stdout and stderr redirected to a pipe, output to
stdout (and stderr too, I suppose) fails with EAGAIN instead of
blocking when the pipe buffer is full. See the above URL for more
information.

"svn log 2>&1 | less" on a (big enough) svn+ssh working copy fails to
output the full log. It sometimes ends with:

  svn: Write error: Resource temporarily unavailable

I think the above test should be sufficient, but just in case, I've
attached (this is what I used for my Debian bug report):
  * a shell script bigrep to create a repository and a working copy.
  * a Perl script svn2log (based on SVN::Client) to reproduce the bug.

To reproduce the bug:

  ./bigrep
  ./svn2log bigrep-wc 2>&1 | less

and hit the [End] key. One generally gets:

[...]
2990
2991
2992
29
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000

lines 14957-15015/15015 (END)

Also:

tomate% ./svn2log bigrep-wc 2>&1 | wc
  26521   26553  123083
tomate% ./svn2log bigrep-wc 2>&1 | wc
  25701   25733  118987
tomate% ./svn2log bigrep-wc 2>&1 | wc
  25702   25734  118987
tomate% ./svn2log bigrep-wc 2>&1 | wc
  30012   30046  139467
tomate% ./svn2log bigrep-wc 2>&1 | wc
  30012   30046  139467
tomate% ./svn2log bigrep-wc 2>&1 | wc
  26521   26553  123083

As suggested by Niko Tyni:

  Possibly subversion should make a new descriptor for the ssh stderr
  and then shovel data between that and its own stderr.

You can also see what cvs did, because it had the same problem.

-- 
Vincent Lefèvre <vinc...@vinc17.net> - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / Arénaire project (LIP, ENS-Lyon)
#!/bin/sh

set -e
rm -rf bigrep-repos bigrep-wc
svnadmin create bigrep-repos
svn co svn+ssh://localhost`pwd`/bigrep-repos bigrep-wc
cd bigrep-wc
for i in `seq 1 10`
do
  touch file$i
  svn add file$i
  seq 1 3000 > log
  svn ci -F log
done
svn update
#!/usr/bin/env perl

use strict;
use SVN::Client;

my $ctx = new SVN::Client;
$ctx->log(\@ARGV, 'HEAD', 1, 0, undef, \&log_receiver);

sub log_receiver
  {
    print "@_[0..4]\n";
  }

Reply via email to