So far, test-terminal.perl did not care at all about the stdin (that is, leave it as-is). This mostly works well, but git-shortlog is a problem: * It takes decisions based on isatty(0). (No test checks this, but compare 'git shortlog </dev/null' with 'git shortlog' in a terminal.) * It reads all of stdin if !isatty(0) and no arguments were passed. Because of the latter, t7006.58ff cause unexpected results if you do: git rev-list <range> | while read sha; do git checkout sha make test done If t7006 runs during any 'make test' run, the next 'read sha' will fail (git-shortlog ate all of stdin already) and the while loop stops immediately. In particular, this loop will only ever successfully test *one* revision. To fix this, change test-terminal.perl to open a third PTY for stdin, send an EOF (Ctrl-D) immediately and close it later. Since this may not be portable, we use POSIX::Termios to set it to Ctrl-D. Noticed-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> Signed-off-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> --- t/test-terminal.perl | 22 +++++++++++++++++++--- 1 files changed, 19 insertions(+), 3 deletions(-) diff --git a/t/test-terminal.perl b/t/test-terminal.perl index ee01eb9..87b5a8c 100755 --- a/t/test-terminal.perl +++ b/t/test-terminal.perl @@ -4,14 +4,16 @@ use warnings; use IO::Pty; use File::Copy; +use POSIX (); -# Run @$argv in the background with stdio redirected to $out and $err. +# Run @$argv in the background with stdio redirected from $in and to $out and $err. sub start_child { - my ($argv, $out, $err) = @_; + my ($argv, $in, $out, $err) = @_; my $pid = fork; if (not defined $pid) { die "fork failed: $!" } elsif ($pid == 0) { + open STDIN, "<&", $in; open STDOUT, ">&", $out; open STDERR, ">&", $err; close $out; @@ -64,13 +66,27 @@ sub copy_stdio { or exit 1; } +sub set_default_eof_char { + my $fd = fileno shift; + my $termios = POSIX::Termios->new; + $termios->getattr($fd); + $termios->setcc(&POSIX::VEOF, 4); + $termios->setattr($fd, &POSIX::TCSANOW) + or die "Termios::setattr failed: $!"; +} + if ($#ARGV < 1) { die "usage: test-terminal program args"; } +my $master_in = new IO::Pty; my $master_out = new IO::Pty; my $master_err = new IO::Pty; -my $pid = start_child(\@ARGV, $master_out->slave, $master_err->slave); +set_default_eof_char($master_in->slave); +my $pid = start_child(\@ARGV, $master_in->slave, $master_out->slave, $master_err->slave); +close $master_in->slave; close $master_out->slave; close $master_err->slave; +print $master_in "\cD"; copy_stdio($master_out, $master_err); +close $master_in; exit(finish_child($pid)); -- 1.7.8.431.g2abf2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html