Merge branch 'jk/push-progress'
authorJunio C Hamano <gitster@pobox.com>
Wed, 17 Nov 2010 23:01:00 +0000 (15:01 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Nov 2010 23:01:00 +0000 (15:01 -0800)
* 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
diff --combined builtin/send-pack.c
index 8aa303158b2461c9272c8ca5b094149a54cc35d2,efd9be67bd6ed8e8e04f3d6a9abd3efe25e9d4a8..2cd1c40b70890732905ad9433e452aa9a9548533
@@@ -48,6 -48,7 +48,7 @@@ static int pack_objects(int fd, struct 
                NULL,
                NULL,
                NULL,
+               NULL,
        };
        struct child_process po;
        int i;
@@@ -59,6 -60,8 +60,8 @@@
                argv[i++] = "--delta-base-offset";
        if (args->quiet)
                argv[i++] = "-q";
+       if (args->progress)
+               argv[i++] = "--progress";
        memset(&po, 0, sizeof(po));
        po.argv = argv;
        po.in = -1;
        }
  
        if (finish_command(&po))
 -              return error("pack-objects died with strange error");
 +              return -1;
        return 0;
  }
  
diff --combined t/test-lib.sh
index bbe79e0fcbd88a1d1c02cd5c51c820def8fdd53f,31366e10a36be2977f2af4c4b5fe1e8e8f1f21f7..744f4364c2b41724e9c395c386fd8048338a2435
@@@ -248,10 -248,6 +248,10 @@@ test_decode_color () 
                -e 's/.\[m/<RESET>/g'
  }
  
 +nul_to_q () {
 +      perl -pe 'y/\000/Q/'
 +}
 +
  q_to_nul () {
        perl -pe 'y/Q/\000/'
  }
@@@ -366,6 -362,15 +366,15 @@@ test_have_prereq () 
        test $total_prereq = $ok_prereq
  }
  
+ test_declared_prereq () {
+       case ",$test_prereq," in
+       *,$1,*)
+               return 0
+               ;;
+       esac
+       return 1
+ }
  # You are not expected to call test_ok_ and test_failure_ directly, use
  # the text_expect_* functions instead.
  
@@@ -418,17 -423,17 +427,17 @@@ test_skip () 
                        break
                esac
        done
-       if test -z "$to_skip" && test -n "$prereq" &&
-          ! test_have_prereq "$prereq"
+       if test -z "$to_skip" && test -n "$test_prereq" &&
+          ! test_have_prereq "$test_prereq"
        then
                to_skip=t
        fi
        case "$to_skip" in
        t)
                of_prereq=
-               if test "$missing_prereq" != "$prereq"
+               if test "$missing_prereq" != "$test_prereq"
                then
-                       of_prereq=" of $prereq"
+                       of_prereq=" of $test_prereq"
                fi
  
                say_color skip >&3 "skipping test: $@"
  }
  
  test_expect_failure () {
-       test "$#" = 3 && { prereq=$1; shift; } || prereq=
+       test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
        test "$#" = 2 ||
        error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
+       export test_prereq
        if ! test_skip "$@"
        then
                say >&3 "checking known breakage: $2"
  }
  
  test_expect_success () {
-       test "$#" = 3 && { prereq=$1; shift; } || prereq=
+       test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
        test "$#" = 2 ||
        error "bug in the test script: not 2 or 3 parameters to test-expect-success"
+       export test_prereq
        if ! test_skip "$@"
        then
                say >&3 "expecting success: $2"
@@@ -504,11 -511,12 +515,12 @@@ test_expect_code () 
  # Usage: test_external description command arguments...
  # Example: test_external 'Perl API' perl ../path/to/test.pl
  test_external () {
-       test "$#" = 4 && { prereq=$1; shift; } || prereq=
+       test "$#" = 4 && { test_prereq=$1; shift; } || test_prereq=
        test "$#" = 3 ||
        error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
        descr="$1"
        shift
+       export test_prereq
        if ! test_skip "$descr" "$@"
        then
                # Announce the script to reduce confusion about the
diff --combined t/test-terminal.perl
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));