Code

Merge branch 'jk/push-progress' into next
authorJunio C Hamano <gitster@pobox.com>
Fri, 5 Nov 2010 18:39:07 +0000 (11:39 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 Nov 2010 18:39:07 +0000 (11:39 -0700)
* jk/push-progress:
  push: pass --progress down to git-pack-objects
  t5523-push-upstream: test progress messages
  t5523-push-upstream: add function to ensure fresh upstream repo
  test_terminal: ensure redirections work reliably
  test_terminal: catch use without TTY prerequisite
  test-lib: allow test code to check the list of declared prerequisites
  tests: test terminal output to both stdout and stderr
  tests: factor out terminal handling from t7006

1  2 
builtin/send-pack.c
t/test-lib.sh
t/test-terminal.perl

Simple merge
diff --cc t/test-lib.sh
Simple merge
index 0000000000000000000000000000000000000000,c2e9dacc2d45c72c60fcc155a38ac0993e7e4455..ee01eb957e97594ce24a61d4cac15a3a4e5a114d
mode 000000,100755..100755
--- /dev/null
@@@ -1,0 -1,75 +1,76 @@@
+ #!/usr/bin/perl
++use 5.008;
+ use strict;
+ use warnings;
+ use IO::Pty;
+ use File::Copy;
+ # Run @$argv in the background with stdio redirected to $out and $err.
+ sub start_child {
+       my ($argv, $out, $err) = @_;
+       my $pid = fork;
+       if (not defined $pid) {
+               die "fork failed: $!"
+       } elsif ($pid == 0) {
+               open STDOUT, ">&", $out;
+               open STDERR, ">&", $err;
+               close $out;
+               exec(@$argv) or die "cannot exec '$argv->[0]': $!"
+       }
+       return $pid;
+ }
+ # Wait for $pid to finish.
+ sub finish_child {
+       # Simplified from wait_or_whine() in run-command.c.
+       my ($pid) = @_;
+       my $waiting = waitpid($pid, 0);
+       if ($waiting < 0) {
+               die "waitpid failed: $!";
+       } elsif ($? & 127) {
+               my $code = $? & 127;
+               warn "died of signal $code";
+               return $code - 128;
+       } else {
+               return $? >> 8;
+       }
+ }
+ sub xsendfile {
+       my ($out, $in) = @_;
+       # Note: the real sendfile() cannot read from a terminal.
+       # It is unspecified by POSIX whether reads
+       # from a disconnected terminal will return
+       # EIO (as in AIX 4.x, IRIX, and Linux) or
+       # end-of-file.  Either is fine.
+       copy($in, $out, 4096) or $!{EIO} or die "cannot copy from child: $!";
+ }
+ sub copy_stdio {
+       my ($out, $err) = @_;
+       my $pid = fork;
+       defined $pid or die "fork failed: $!";
+       if (!$pid) {
+               close($out);
+               xsendfile(\*STDERR, $err);
+               exit 0;
+       }
+       close($err);
+       xsendfile(\*STDOUT, $out);
+       finish_child($pid) == 0
+               or exit 1;
+ }
+ if ($#ARGV < 1) {
+       die "usage: test-terminal program args";
+ }
+ my $master_out = new IO::Pty;
+ my $master_err = new IO::Pty;
+ my $pid = start_child(\@ARGV, $master_out->slave, $master_err->slave);
+ close $master_out->slave;
+ close $master_err->slave;
+ copy_stdio($master_out, $master_err);
+ exit(finish_child($pid));