The result of this is external tools and tools writing standard error
to a file from bash would not be able to receive progress information
during a push. Similar functionality is seen in fetch, which still
works.
An example that previously would output no information for --progress:
git push origin master --progress > ~/push_error_output.txt 2>&1
The above example and others now work with this patch.
Helped-by: Jeff King [off-list ref]
Helped-by: Jonathan Nieder [off-list ref]
Signed-off-by: Chase Brammer <redacted>
---
builtin/send-pack.c | 3 +++
send-pack.h | 1 +
transport.c | 1 +
3 files changed, 5 insertions(+), 0 deletions(-)
From: Jonathan Nieder <hidden> Date: 2016-06-15 22:49:46
Chase Brammer wrote:
The result of this is external tools and tools writing standard error
to a file from bash would not be able to receive progress information
during a push. Similar functionality is seen in fetch, which still
works.
A bit of protocol: since the patch is by Jeff, this should have
From: Jeff King [off-list ref]
at the beginning of the log message. See Documentation/SubmittingPatches
for details.
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:46
Hi,
On Wed, Oct 13, 2010 at 6:21 AM, Chase Brammer [off-list ref] wrote:
The result of this is external tools and tools writing standard error
to a file from bash would not be able to receive progress information
during a push. Similar functionality is seen in fetch, which still
works.
An example that previously would output no information for --progress:
git push origin master --progress > ~/push_error_output.txt 2>&1
The above example and others now work with this patch.
Helped-by: Jeff King [off-list ref]
Helped-by: Jonathan Nieder [off-list ref]
Signed-off-by: Chase Brammer <redacted>
The long subject line not withstanding, your patch seems corrupt.
Guess I'll have to write it by hand.
--
Cheers,
Ray Chuan
@@ -3,8 +3,14 @@test_description='push with --set-upstream' ../test-lib.sh+ensure_fresh_upstream(){+test-dparent&&+rm-rfparent+gitinit--bareparent+}+ test_expect_success'setup bare parent''-gitinit--bareparent&&+ensure_fresh_upstream&&gitremoteaddupstreamparent'
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:46
From: Jeff King <redacted>
When pushing via builtin transports (like file://, git://), the
underlying transport helper (in this case, git-pack-objects) did not get
the --progress option, even if it was passed to git push.
Fix this, and update the tests to reflect this.
Note that according to the git-pack-objects documentation, we can safely
apply the usual --progress semantics for the transport commands like
clone and fetch (and for pushing over other smart transports).
Reported-by: Chase Brammer <redacted>
Helped-by: Jonathan Nieder [off-list ref]
Signed-off-by: Tay Ray Chuan <redacted>
---
builtin/send-pack.c | 3 +++
send-pack.h | 1 +
t/t5523-push-upstream.sh | 4 ++--
transport.c | 1 +
4 files changed, 7 insertions(+), 2 deletions(-)
@@ -72,7 +72,7 @@ test_expect_success 'push -u HEAD' 'check_configheadbranchupstreamrefs/heads/headbranch'-test_expect_failure'progress messages to non-tty''+test_expect_success'progress messages to non-tty''ensure_fresh_upstream&&# skip progress messages, since stderr is non-tty
@@ -80,7 +80,7 @@ test_expect_failure 'progress messages to non-tty' '!grep"Writing objects"err'-test_expect_failure'progress messages to non-tty (forced)''+test_expect_success'progress messages to non-tty (forced)''ensure_fresh_upstream&&# force progress messages to stderr, even though it is non-tty
@@ -72,4 +72,20 @@ test_expect_success 'push -u HEAD' 'check_configheadbranchupstreamrefs/heads/headbranch'+test_expect_failure'progress messages to non-tty''+ensure_fresh_upstream&&++# skip progress messages, since stderr is non-tty+gitpush-uupstreammaster>out2>err&&+!grep"Writing objects"err+'++test_expect_failure'progress messages to non-tty (forced)''+ensure_fresh_upstream&&++# force progress messages to stderr, even though it is non-tty+gitpush-u--progressupstreammaster>out2>err&&+grep"Writing objects"err+'+ test_done
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:46
On Thu, Oct 14, 2010 at 3:31 AM, Tay Ray Chuan [off-list ref] wrote:
*** BLURB HERE ***
Whoops. Let me try again:
This patch series addresses the issue of git push not displaying
progress messages to non-tty stderr, even if --progress is used. As
suggested by the subject, this issue afflicts the "builtin smart
transports" - file://, git://, ssh://. (All of them use
git_transport_push() and thus git-pack-objects.)
--
Cheers,
Ray Chuan
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:47
Hi,
On Thu, Oct 14, 2010 at 3:31 AM, Tay Ray Chuan [off-list ref] wrote:
From: Jeff King <redacted>
[snip]
Reported-by: Chase Brammer <redacted>
Helped-by: Jonathan Nieder [off-list ref]
Signed-off-by: Tay Ray Chuan <redacted>
Chase, I switched the authorship to Jeff - after all, he was the one
who wrote the patch. I hope you're fine with that.
Jeff, if this patch is ok, since you're the author, perhaps you might
want to add your SOB?
--
Cheers,
Ray Chuan
From: Jeff King <hidden> Date: 2016-06-15 22:49:47
On Thu, Oct 14, 2010 at 08:59:41AM +0800, Tay Ray Chuan wrote:
On Thu, Oct 14, 2010 at 3:31 AM, Tay Ray Chuan [off-list ref] wrote:
quoted
From: Jeff King <redacted>
[snip]
Reported-by: Chase Brammer <redacted>
Helped-by: Jonathan Nieder [off-list ref]
Signed-off-by: Tay Ray Chuan <redacted>
Chase, I switched the authorship to Jeff - after all, he was the one
who wrote the patch. I hope you're fine with that.
Jeff, if this patch is ok, since you're the author, perhaps you might
want to add your SOB?
Yeah, definitely:
Signed-off-by: Jeff King <redacted>
-Peff
From: Jeff King <hidden> Date: 2016-06-15 22:49:47
On Thu, Oct 14, 2010 at 03:31:48AM +0800, Tay Ray Chuan wrote:
[PATCH 1/3] t5523-push-upstream: add function to ensure fresh upstream repo
[PATCH 2/3] t5523-push-upstream: test progress messages
[PATCH 3/3] push: pass --progress down to git-pack-objects
I had hoped to have a fix for --no-progress, but munging the tests took
so long that now I am sleepy. :) So here are some extra tests on top of
your series. The first two are refactoring, and the third has the new
tests. It checks regular stderr-is-tty progress and that "push -q"
suppresses progress, as Junio asked elsewhere. And it reveals the bug in
--no-progress.
It might make more sense to actually re-roll your series with the
refactoring at the front, and my 3/3 squashed into your 2/3.
Also, these tests feel a bit out of place in t5523, but I don't see a
better place for them to go. Perhaps they should go in their own test
script. I don't feel strongly, though.
[1/3]: tests: factor out terminal handling from t7006
[2/3]: tests: test terminal output to both stdout and stderr
[3/3]: t5523: test push progress output to tty
-Peff
From: Jeff King <hidden> Date: 2016-06-15 22:49:47
Other tests besides the pager ones may want to check how we handle
output to a terminal. This patch makes the code reusable.
Signed-off-by: Jeff King <redacted>
---
t/lib-terminal.sh | 28 ++++++++++++++++++++++++++++
t/t7006-pager.sh | 31 +------------------------------
t/{t7006 => }/test-terminal.perl | 0
3 files changed, 29 insertions(+), 30 deletions(-)
create mode 100644 t/lib-terminal.sh
rename t/{t7006 => }/test-terminal.perl (100%)
@@ -0,0 +1,28 @@+#!/bin/sh++test_expect_success'set up terminal for tests''+iftest-t1+then+>stdout_is_tty+elif+test_have_prereqPERL&&+"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl\+sh-c"test -t 1"+then+>test_terminal_works+fi+'++iftest-estdout_is_tty+then+test_terminal(){"$@";}+test_set_prereqTTY+eliftest-etest_terminal_works+then+test_terminal(){+"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl"$@"+}+test_set_prereqTTY+else+say"# no usable terminal, so skipping some tests"+fi
@@ -4,42 +4,13 @@ test_description='Test automatic use of a pager.' ../test-lib.sh ."$TEST_DIRECTORY"/lib-pager.sh+."$TEST_DIRECTORY"/lib-terminal.sh cleanup_fail(){echo>&2cleanupfailed(exit1)}-test_expect_success'set up terminal for tests''-rm-fstdout_is_tty||-cleanup_fail&&--iftest-t1-then->stdout_is_tty-elif-test_have_prereqPERL&&-"$PERL_PATH""$TEST_DIRECTORY"/t7006/test-terminal.perl\-sh-c"test -t 1"-then->test_terminal_works-fi-'--iftest-estdout_is_tty-then-test_terminal(){"$@";}-test_set_prereqTTY-eliftest-etest_terminal_works-then-test_terminal(){-"$PERL_PATH""$TEST_DIRECTORY"/t7006/test-terminal.perl"$@"-}-test_set_prereqTTY-else-say"# no usable terminal, so skipping some tests"-fi- test_expect_success'setup''unsetGIT_PAGERGIT_PAGER_IN_USE;test_might_failgitconfig--unsetcore.pager&&
diff --git a/t/t7006/test-terminal.perl b/t/test-terminal.perlsimilarity index 100%rename from t/t7006/test-terminal.perlrename to t/test-terminal.perl
--
1.7.3.1.204.g337d6.dirty
From: Jeff King <hidden> Date: 2016-06-15 22:49:47
Some outputs (like the pager) care whether stdout is a
terminal. Others (like progress meters) care about stderr.
This patch sets up both. Technically speaking, we could go
further and set up just one (because either the other goes
to a terminal, or because our tests are only interested in
one). This patch does both to keep the interface to
lib-terminal simple.
Signed-off-by: Jeff King <redacted>
---
t/lib-terminal.sh | 8 ++++----
t/test-terminal.perl | 31 ++++++++++++++++++++++++-------
2 files changed, 28 insertions(+), 11 deletions(-)
@@ -4,14 +4,15 @@ use warnings;useIO::Pty;useFile::Copy;-# Run @$argv in the background with stdout redirected to $out.+# Run @$argv in the background with stdio redirected to $out and $err.substart_child{-my($argv,$out)=@_;+my($argv,$out,$err)=@_;my$pid=fork;if(notdefined$pid){die"fork failed: $!"}elsif($pid==0){openSTDOUT,">&",$out;+openSTDERR,">&",$err;close$out;exec(@$argv)ordie"cannot exec '$argv->[0]': $!"}
@@ -47,12 +48,28 @@ sub xsendfile {copy($in,$out,4096)or$!{EIO}ordie"cannot copy from child: $!";}+subcopy_stdio{+my($out,$err)=@_;+my$pid=fork;+defined$pidordie"fork failed: $!";+if(!$pid){+close($out);+xsendfile(\*STDERR,$err);+exit0;+}+close($err);+xsendfile(\*STDOUT,$out);+finish_child($pid)==0+orexit1;+}+if($#ARGV<1){die"usage: test-terminal program args";}-my$master=newIO::Pty;-my$slave=$master->slave;-my$pid=start_child(\@ARGV,$slave);-close$slave;-xsendfile(\*STDOUT,$master);+my$master_out=newIO::Pty;+my$master_err=newIO::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));
From: Jeff King <hidden> Date: 2016-06-15 22:49:47
We already test the non-tty cases, but until recent changes
made lib-terminal.sh available, we couldn't test the case
with a tty. These tests reveal a bug: --no-progress is
silently ignored.
Signed-off-by: Jeff King <redacted>
---
t/t5523-push-upstream.sh | 26 ++++++++++++++++++++++++--
1 files changed, 24 insertions(+), 2 deletions(-)
@@ -2,6 +2,7 @@test_description='push with --set-upstream' ../test-lib.sh+."$TEST_DIRECTORY"/lib-terminal.sh ensure_fresh_upstream(){test-dparent&&
@@ -72,7 +73,14 @@ test_expect_success 'push -u HEAD' 'check_configheadbranchupstreamrefs/heads/headbranch'-test_expect_success'progress messages to non-tty''+test_expect_success'progress messages go to tty''+ensure_fresh_upstream&&++test_terminalgitpush-uupstreammaster>out2>err&&+grep"Writing objects"err+'++test_expect_success'progress messages do not go to non-tty''ensure_fresh_upstream&&# skip progress messages, since stderr is non-tty
@@ -80,7 +88,7 @@ test_expect_success 'progress messages to non-tty' '!grep"Writing objects"err'-test_expect_success'progress messages to non-tty (forced)''+test_expect_success'progress messages go to non-tty (forced)''ensure_fresh_upstream&&# force progress messages to stderr, even though it is non-tty
From: Jonathan Nieder <hidden> Date: 2016-06-15 22:49:47
Jeff King wrote:
Other tests besides the pager ones may want to check how we handle
output to a terminal. This patch makes the code reusable.
Signed-off-by: Jeff King <redacted>
From: Jonathan Nieder <hidden> Date: 2016-06-15 22:49:47
Jeff King wrote:
Some outputs (like the pager) care whether stdout is a
terminal. Others (like progress meters) care about stderr.
This patch sets up both. Technically speaking, we could go
further and set up just one (because either the other goes
to a terminal, or because our tests are only interested in
one).
This makes test_terminal more realistic, too: the usual case is for
stdout and stderr to go to a terminal (unless explicitly captured or
redirected).
Tests can use 'test_terminal sh -c "foo >/dev/null"' to test that a
command correctly handles being run with stderr a terminal and
stdout not.
And I doubt this would make test_terminal much slower.
So for what it's worth:
Acked-by: Jonathan Nieder <redacted>
Thanks.
Missing TTY prerequisite. (Do you think test_terminal should check
$prereq to prevent this?)
Oops, good catch. I think we should already catch it, as test_terminal
will not be defined at all in the no-tty case. We could print a nicer
message, but it is not likely to be seen by the user. If they are
using "-v", then stderr probably _is_ a tty. And if not, they will not
see the message. There are ways around it, but they are not likely to be
seen unless the user is really trying (e.g., "./t5523-* -v >not_a_tty").
-Peff
From: Jonathan Nieder <hidden> Date: 2016-06-15 22:49:47
Jeff King wrote:
On Wed, Oct 13, 2010 at 10:16:42PM -0500, Jonathan Nieder wrote:
quoted
Missing TTY prerequisite. (Do you think test_terminal should check
$prereq to prevent this?)
Oops, good catch. I think we should already catch it, as test_terminal
will not be defined at all in the no-tty case. We could print a nicer
message, but
I rather meant something like this.
Patch 1 exposes the internal $prereq variable from
test_expect_(success|failure). Maybe it should be called
GIT_TEST_something to avoid trampling other programs' namespaces? Not
sure.
Patch 2 introduces some magic autodetection so people that never run
tests without -v can still notice the missing TTY prereqs.
Jonathan Nieder (2):
test-lib: allow test code to check the list of declared prerequisites
test_terminal: catch use without TTY prerequisite
t/t7006-pager.sh | 20 ++++++++++++--------
t/test-lib.sh | 26 +++++++++++++++++++-------
2 files changed, 31 insertions(+), 15 deletions(-)
--
1.7.2.3
From: Jonathan Nieder <hidden> Date: 2016-06-15 22:49:47
This is plumbing to prepare helpers like test_terminal to notice buggy
test scripts that do not declare all of the necessary prerequisites.
Signed-off-by: Jonathan Nieder <redacted>
---
Applies on top of 892e6f7 (test-lib: make test_expect_code a test
command) from the en/and-cascade-tests branch. On master,
text_expect_code would have to be adjusted, too.
t/test-lib.sh | 26 +++++++++++++++++++-------
1 files changed, 19 insertions(+), 7 deletions(-)
@@ -362,6 +362,15 @@ test_have_prereq () {test$total_prereq=$ok_prereq}+test_declared_prereq(){+case",$test_prereq,"in+*,$1,*)+return0+;;+esac+return1+}+# You are not expected to call test_ok_ and test_failure_ directly, use# the text_expect_* functions instead.
@@ -414,17 +423,17 @@ test_skip () {breakesacdone-iftest-z"$to_skip"&&test-n"$prereq"&&-!test_have_prereq"$prereq"+iftest-z"$to_skip"&&test-n"$test_prereq"&&+!test_have_prereq"$test_prereq"thento_skip=tficase"$to_skip"int)of_prereq=-iftest"$missing_prereq"!="$prereq"+iftest"$missing_prereq"!="$test_prereq"then-of_prereq=" of $prereq"+of_prereq=" of $test_prereq"fisay_colorskip>&3"skipping test: $@"
@@ -438,9 +447,10 @@ test_skip () {} 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"+exporttest_prereqif!test_skip"$@"thensay>&3"checking known breakage: $2"
@@ -456,9 +466,10 @@ test_expect_failure () {} 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"+exporttest_prereqif!test_skip"$@"thensay>&3"expecting success: $2"
@@ -482,11 +493,12 @@ test_expect_success () {# 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+exporttest_prereqif!test_skip"$descr""$@"then# Announce the script to reduce confusion about the
From: Jonathan Nieder <hidden> Date: 2016-06-15 22:49:47
It is easy to forget to declare the TTY prerequisite when
writing tests on a system where it would always be satisfied
(because IO::Pty is installed; see v1.7.3-rc0~33^2, 2010-08-16
for example). Automatically detect this problem so there is
no need to remember.
test_terminal: need to declare TTY prerequisite
test_must_fail: command not found: test_terminal echo hi
test_terminal returns status 127 in this case to simulate
not being available.
Also replace the SIMPLEPAGERTTY prerequisite on one test with
"SIMPLEPAGER,TTY", since (1) the latter is supported now and
(2) the prerequisite detection relies on the TTY prereq being
explicitly declared.
Signed-off-by: Jonathan Nieder <redacted>
---
Penance for introducing that bug a few times.
t/t7006-pager.sh | 20 ++++++++++++--------
1 files changed, 12 insertions(+), 8 deletions(-)
@@ -28,11 +28,11 @@ test_expect_success 'set up terminal for tests' 'iftest-estdout_is_ttythen-test_terminal(){"$@";}+test_terminal_(){"$@";}test_set_prereqTTYeliftest-etest_terminal_worksthen-test_terminal(){+test_terminal_(){"$PERL_PATH""$TEST_DIRECTORY"/t7006/test-terminal.perl"$@"}test_set_prereqTTY
@@ -40,6 +40,15 @@ elsesay"# no usable terminal, so skipping some tests"fi+test_terminal(){+if!test_declared_prereqTTY+then+echo>&2'test_terminal: need to declare TTY prerequisite'+return127+fi+test_terminal_"$@"+}+ test_expect_success'setup''unsetGIT_PAGERGIT_PAGER_IN_USE;test_might_failgitconfig--unsetcore.pager&&
@@ -213,11 +222,6 @@ test_expect_success 'color when writing to a file intended for a pager' 'colorfulcolorful.log'-iftest_have_prereqSIMPLEPAGER&&test_have_prereqTTY-then-test_set_prereqSIMPLEPAGERTTY-fi-# Use this helper to make it easy for the caller of your# terminal-using function to specify whether it should fail.# If you write
@@ -253,7 +257,7 @@ parse_args() { test_default_pager(){parse_args"$@"-$test_expectationSIMPLEPAGERTTY"$cmd - default pager is used by default""+$test_expectationSIMPLEPAGER,TTY"$cmd - default pager is used by default""unsetPAGERGIT_PAGER;test_might_failgitconfig--unsetcore.pager&&rm-fdefault_pager_used||
From: Jeff King <hidden> Date: 2016-06-15 22:49:47
On Thu, Oct 14, 2010 at 03:37:21PM -0500, Jonathan Nieder wrote:
quoted
Oops, good catch. I think we should already catch it, as test_terminal
will not be defined at all in the no-tty case. We could print a nicer
message, but
I rather meant something like this.
Patch 1 exposes the internal $prereq variable from
test_expect_(success|failure). Maybe it should be called
GIT_TEST_something to avoid trampling other programs' namespaces? Not
sure.
Patch 2 introduces some magic autodetection so people that never run
tests without -v can still notice the missing TTY prereqs.
Yeah, that is better, as it will catch the lack of prerequisite even on
systems where the prerequisite is met.
It seems like a lot of code to catch something small, but on the other
hand, it does seem to be a repeated mistake.
-Peff
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:47
On Fri, Oct 15, 2010 at 12:42 PM, Jeff King [off-list ref] wrote:
On Thu, Oct 14, 2010 at 03:37:21PM -0500, Jonathan Nieder wrote:
quoted
quoted
Oops, good catch. I think we should already catch it, as test_terminal
will not be defined at all in the no-tty case. We could print a nicer
message, but
I rather meant something like this.
Patch 1 exposes the internal $prereq variable from
test_expect_(success|failure). Maybe it should be called
GIT_TEST_something to avoid trampling other programs' namespaces? Not
sure.
Patch 2 introduces some magic autodetection so people that never run
tests without -v can still notice the missing TTY prereqs.
Yeah, that is better, as it will catch the lack of prerequisite even on
systems where the prerequisite is met.
It seems like a lot of code to catch something small, but on the other
hand, it does seem to be a repeated mistake.
I'll probably be re-rolling the push --progress fix series with this and Jeff's.
--
Cheers,
Ray Chuan
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:48
This patch series addresses the issue of git push not displaying
progress messages to non-tty stderr, even if --progress is used. As
suggested by the subject, this issue afflicts the "builtin smart
transports" - file://, git://, ssh://. (All of them use
git_transport_push() and thus git-pack-objects.)
The last patch contains the actual fix; most of the other patches
improve tests that depend on a tty.
Contents:
[PATCH v2 0/8] fix push --progress over file://, git://, etc.
[PATCH v2 1/8] tests: factor out terminal handling from t7006
[PATCH v2 2/8] tests: test terminal output to both stdout and stderr
[PATCH v2 3/8] test-lib: allow test code to check the list of declared prerequisites
[PATCH v2 4/8] test_terminal: catch use without TTY prerequisite
[PATCH v2 5/8] test_terminal: give priority to test-terminal.perl usage
[PATCH v2 6/8] t5523-push-upstream: add function to ensure fresh upstream repo
[PATCH v2 7/8] t5523-push-upstream: test progress messages
[PATCH v2 8/8] push: pass --progress down to git-pack-objects
Jeff King (3):
tests: factor out terminal handling from t7006
tests: test terminal output to both stdout and stderr
push: pass --progress down to git-pack-objects
Jonathan Nieder (3):
test-lib: allow test code to check the list of declared prerequisites
test_terminal: catch use without TTY prerequisite
test_terminal: give priority to test-terminal.perl usage
Tay Ray Chuan (2):
t5523-push-upstream: add function to ensure fresh upstream repo
t5523-push-upstream: test progress messages
builtin/send-pack.c | 3 ++
send-pack.h | 1 +
t/lib-terminal.sh | 39 +++++++++++++++++++++++
t/t5523-push-upstream.sh | 44 +++++++++++++++++++++++++-
t/t7006-pager.sh | 38 +---------------------
t/t7006/test-terminal.perl | 58 ----------------------------------
t/test-lib.sh | 26 +++++++++++----
t/test-terminal.perl | 75 ++++++++++++++++++++++++++++++++++++++++++++
transport.c | 1 +
9 files changed, 183 insertions(+), 102 deletions(-)
create mode 100644 t/lib-terminal.sh
delete mode 100755 t/t7006/test-terminal.perl
create mode 100755 t/test-terminal.perl
--
1.7.2.2.513.ge1ef3
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:48
From: Jeff King <redacted>
Other tests besides the pager ones may want to check how we handle
output to a terminal. This patch makes the code reusable.
Signed-off-by: Jeff King <redacted>
---
No change.
t/lib-terminal.sh | 28 +++++++++++++++++++++
t/t7006-pager.sh | 31 +----------------------
t/t7006/test-terminal.perl | 58 --------------------------------------------
t/test-terminal.perl | 58 ++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 87 insertions(+), 88 deletions(-)
create mode 100644 t/lib-terminal.sh
delete mode 100755 t/t7006/test-terminal.perl
create mode 100755 t/test-terminal.perl
@@ -0,0 +1,28 @@+#!/bin/sh++test_expect_success'set up terminal for tests''+iftest-t1+then+>stdout_is_tty+elif+test_have_prereqPERL&&+"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl\+sh-c"test -t 1"+then+>test_terminal_works+fi+'++iftest-estdout_is_tty+then+test_terminal(){"$@";}+test_set_prereqTTY+eliftest-etest_terminal_works+then+test_terminal(){+"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl"$@"+}+test_set_prereqTTY+else+say"# no usable terminal, so skipping some tests"+fi
@@ -4,42 +4,13 @@ test_description='Test automatic use of a pager.' ../test-lib.sh ."$TEST_DIRECTORY"/lib-pager.sh+."$TEST_DIRECTORY"/lib-terminal.sh cleanup_fail(){echo>&2cleanupfailed(exit1)}-test_expect_success'set up terminal for tests''-rm-fstdout_is_tty||-cleanup_fail&&--iftest-t1-then->stdout_is_tty-elif-test_have_prereqPERL&&-"$PERL_PATH""$TEST_DIRECTORY"/t7006/test-terminal.perl\-sh-c"test -t 1"-then->test_terminal_works-fi-'--iftest-estdout_is_tty-then-test_terminal(){"$@";}-test_set_prereqTTY-eliftest-etest_terminal_works-then-test_terminal(){-"$PERL_PATH""$TEST_DIRECTORY"/t7006/test-terminal.perl"$@"-}-test_set_prereqTTY-else-say"# no usable terminal, so skipping some tests"-fi- test_expect_success'setup''unsetGIT_PAGERGIT_PAGER_IN_USE;test_might_failgitconfig--unsetcore.pager&&
@@ -1,58 +0,0 @@-#!/usr/bin/perl-use strict;-use warnings;-use IO::Pty;-use File::Copy;--# Run @$argv in the background with stdout redirected to $out.-sub start_child {- my ($argv, $out) = @_;- my $pid = fork;- if (not defined $pid) {- die "fork failed: $!"- } elsif ($pid == 0) {- open STDOUT, ">&", $out;- 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: $!";-}--if ($#ARGV < 1) {- die "usage: test-terminal program args";-}-my $master = new IO::Pty;-my $slave = $master->slave;-my $pid = start_child(\@ARGV, $slave);-close $slave;-xsendfile(\*STDOUT, $master);-exit(finish_child($pid));
@@ -0,0 +1,58 @@+#!/usr/bin/perl+usestrict;+usewarnings;+useIO::Pty;+useFile::Copy;++# Run @$argv in the background with stdout redirected to $out.+substart_child{+my($argv,$out)=@_;+my$pid=fork;+if(notdefined$pid){+die"fork failed: $!"+}elsif($pid==0){+openSTDOUT,">&",$out;+close$out;+exec(@$argv)ordie"cannot exec '$argv->[0]': $!"+}+return$pid;+}++# Wait for $pid to finish.+subfinish_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;+}+}++subxsendfile{+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}ordie"cannot copy from child: $!";+}++if($#ARGV<1){+die"usage: test-terminal program args";+}+my$master=newIO::Pty;+my$slave=$master->slave;+my$pid=start_child(\@ARGV,$slave);+close$slave;+xsendfile(\*STDOUT,$master);+exit(finish_child($pid));
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:48
From: Jonathan Nieder <redacted>
It is easy to forget to declare the TTY prerequisite when
writing tests on a system where it would always be satisfied
(because IO::Pty is installed; see v1.7.3-rc0~33^2, 2010-08-16
for example). Automatically detect this problem so there is
no need to remember.
test_terminal: need to declare TTY prerequisite
test_must_fail: command not found: test_terminal echo hi
test_terminal returns status 127 in this case to simulate
not being available.
Also replace the SIMPLEPAGERTTY prerequisite on one test with
"SIMPLEPAGER,TTY", since (1) the latter is supported now and
(2) the prerequisite detection relies on the TTY prereq being
explicitly declared.
Signed-off-by: Jonathan Nieder <redacted>
---
Rebased on top of Jeff's series, so that lib-terminal's test_terminal is
changed instead.
t/lib-terminal.sh | 13 +++++++++++--
t/t7006-pager.sh | 7 +------
2 files changed, 12 insertions(+), 8 deletions(-)
@@ -15,14 +15,23 @@ test_expect_success 'set up terminal for tests' 'iftest-ehave_ttythen-test_terminal(){"$@";}+test_terminal_(){"$@";}test_set_prereqTTYeliftest-etest_terminal_worksthen-test_terminal(){+test_terminal_(){"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl"$@"}test_set_prereqTTYelsesay"# no usable terminal, so skipping some tests"fi++test_terminal(){+if!test_declared_prereqTTY+then+echo>&2'test_terminal: need to declare TTY prerequisite'+return127+fi+test_terminal_"$@"+}
@@ -184,11 +184,6 @@ test_expect_success 'color when writing to a file intended for a pager' 'colorfulcolorful.log'-iftest_have_prereqSIMPLEPAGER&&test_have_prereqTTY-then-test_set_prereqSIMPLEPAGERTTY-fi-# Use this helper to make it easy for the caller of your# terminal-using function to specify whether it should fail.# If you write
@@ -224,7 +219,7 @@ parse_args() { test_default_pager(){parse_args"$@"-$test_expectationSIMPLEPAGERTTY"$cmd - default pager is used by default""+$test_expectationSIMPLEPAGER,TTY"$cmd - default pager is used by default""unsetPAGERGIT_PAGER;test_might_failgitconfig--unsetcore.pager&&rm-fdefault_pager_used||
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:48
From: Jonathan Nieder <redacted>
This is plumbing to prepare helpers like test_terminal to notice buggy
test scripts that do not declare all of the necessary prerequisites.
Signed-off-by: Jonathan Nieder <redacted>
---
No change.
t/test-lib.sh | 26 +++++++++++++++++++-------
1 files changed, 19 insertions(+), 7 deletions(-)
@@ -362,6 +362,15 @@ test_have_prereq () {test$total_prereq=$ok_prereq}+test_declared_prereq(){+case",$test_prereq,"in+*,$1,*)+return0+;;+esac+return1+}+# You are not expected to call test_ok_ and test_failure_ directly, use# the text_expect_* functions instead.
@@ -414,17 +423,17 @@ test_skip () {breakesacdone-iftest-z"$to_skip"&&test-n"$prereq"&&-!test_have_prereq"$prereq"+iftest-z"$to_skip"&&test-n"$test_prereq"&&+!test_have_prereq"$test_prereq"thento_skip=tficase"$to_skip"int)of_prereq=-iftest"$missing_prereq"!="$prereq"+iftest"$missing_prereq"!="$test_prereq"then-of_prereq=" of $prereq"+of_prereq=" of $test_prereq"fisay_colorskip>&3"skipping test: $@"
@@ -438,9 +447,10 @@ test_skip () {} 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"+exporttest_prereqif!test_skip"$@"thensay>&3"checking known breakage: $2"
@@ -456,9 +466,10 @@ test_expect_failure () {} 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"+exporttest_prereqif!test_skip"$@"thensay>&3"expecting success: $2"
@@ -500,11 +511,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+exporttest_prereqif!test_skip"$descr""$@"then# Announce the script to reduce confusion about the
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:48
From: Jeff King <redacted>
Some outputs (like the pager) care whether stdout is a
terminal. Others (like progress meters) care about stderr.
This patch sets up both. Technically speaking, we could go
further and set up just one (because either the other goes
to a terminal, or because our tests are only interested in
one). This patch does both to keep the interface to
lib-terminal simple.
Signed-off-by: Jeff King <redacted>
---
No change.
t/lib-terminal.sh | 8 ++++----
t/test-terminal.perl | 31 ++++++++++++++++++++++++-------
2 files changed, 28 insertions(+), 11 deletions(-)
@@ -4,14 +4,15 @@ use warnings;useIO::Pty;useFile::Copy;-# Run @$argv in the background with stdout redirected to $out.+# Run @$argv in the background with stdio redirected to $out and $err.substart_child{-my($argv,$out)=@_;+my($argv,$out,$err)=@_;my$pid=fork;if(notdefined$pid){die"fork failed: $!"}elsif($pid==0){openSTDOUT,">&",$out;+openSTDERR,">&",$err;close$out;exec(@$argv)ordie"cannot exec '$argv->[0]': $!"}
@@ -47,12 +48,28 @@ sub xsendfile {copy($in,$out,4096)or$!{EIO}ordie"cannot copy from child: $!";}+subcopy_stdio{+my($out,$err)=@_;+my$pid=fork;+defined$pidordie"fork failed: $!";+if(!$pid){+close($out);+xsendfile(\*STDERR,$err);+exit0;+}+close($err);+xsendfile(\*STDOUT,$out);+finish_child($pid)==0+orexit1;+}+if($#ARGV<1){die"usage: test-terminal program args";}-my$master=newIO::Pty;-my$slave=$master->slave;-my$pid=start_child(\@ARGV,$slave);-close$slave;-xsendfile(\*STDOUT,$master);+my$master_out=newIO::Pty;+my$master_err=newIO::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));
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:48
From: Jonathan Nieder <redacted>
Tay Ray Chuan wrote:
[snip]
2. For terminal tests that capture output/stderr, the TTY prerequisite
warning does not quite work for things like
test_terminal foo >out 2>err
because the warning gets "swallowed" up by the redirection that's
supposed only to be done by the subcommand.
Good catch. Such cases (like Jeff's patch) are not well supported
currently. :(
The outcome depends on whether stdout was already a terminal (in which
case test_terminal is a noop) or not (in which case test_terminal
introduces a pseudo-tty in the middle of the pipeline).
$ test_terminal.perl sh -c 'test -t 1 && echo >&2 YES' >out
YES
$ sh -c 'test -t 1 && echo >&2 YES' >out
$
How about this?
- use the test_terminal script even when running with "-v"
if IO::Pty is available, to allow commands like
test_terminal foo >out 2>err
- add a separate TTYREDIR prerequisite which is only set
when the test_terminal script is usable
- write the "need to declare TTY prerequisite" message to fd 4,
where it will be printed when running tests with -v, rather
than being swallowed up by an unrelated redireciton.
Signed-off-by: Jonathan Nieder <redacted>
Signed-off-by: Tay Ray Chuan <redacted>
---
Picked up from a private discussion. I left the discussion in the
patch message to give some background, and it also gives a nice
summary of the changes.
t/lib-terminal.sh | 24 +++++++++++++-----------
1 files changed, 13 insertions(+), 11 deletions(-)
@@ -1,36 +1,38 @@#!/bin/sh test_expect_success'set up terminal for tests''-iftest-t1&&test-t2-then->have_tty-elif+iftest_have_prereqPERL&&"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl\sh-c"test -t 1 && test -t 2"then>test_terminal_works+eliftest-t1&&test-t2+then+>have_ttyfi'-iftest-ehave_tty-then-test_terminal_(){"$@";}-test_set_prereqTTY-eliftest-etest_terminal_works+iftest-etest_terminal_worksthentest_terminal_(){"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl"$@"}test_set_prereqTTY+test_set_prereqTTYREDIR+eliftest-ehave_tty+then+test_terminal_(){"$@";}+test_set_prereqTTY+elsesay"# no usable terminal, so skipping some tests"fi test_terminal(){-if!test_declared_prereqTTY+if!test_declared_prereqTTY&&!test_declared_prereqTTYREDIRthen-echo>&2'test_terminal: need to declare TTY prerequisite'+echo>&4'test_terminal: need to declare TTY prerequisite'return127fitest_terminal_"$@"
@@ -3,8 +3,12 @@test_description='push with --set-upstream' ../test-lib.sh+ensure_fresh_upstream(){+rm-rfparent&&gitinit--bareparent+}+ test_expect_success'setup bare parent''-gitinit--bareparent&&+ensure_fresh_upstream&&gitremoteaddupstreamparent'
@@ -2,6 +2,7 @@test_description='push with --set-upstream' ../test-lib.sh+."$TEST_DIRECTORY"/lib-terminal.sh ensure_fresh_upstream(){rm-rfparent&&gitinit--bareparent
@@ -70,4 +71,41 @@ test_expect_success 'push -u HEAD' 'check_configheadbranchupstreamrefs/heads/headbranch'+test_expect_successTTY'progress messages go to tty''+ensure_fresh_upstream&&++test_terminalgitpush-uupstreammaster>out2>err&&+grep"Writing objects"err+'++test_expect_failure'progress messages do not go to non-tty''+ensure_fresh_upstream&&++# skip progress messages, since stderr is non-tty+gitpush-uupstreammaster>out2>err&&+!grep"Writing objects"err+'++test_expect_failure'progress messages go to non-tty (forced)''+ensure_fresh_upstream&&++# force progress messages to stderr, even though it is non-tty+gitpush-u--progressupstreammaster>out2>err&&+grep"Writing objects"err+'++test_expect_successTTY'push -q suppresses progress''+ensure_fresh_upstream&&++test_terminalgitpush-u-qupstreammaster>out2>err&&+!grep"Writing objects"err+'++test_expect_failureTTY'push --no-progress suppresses progress''+ensure_fresh_upstream&&++test_terminalgitpush-u--no-progressupstreammaster>out2>err&&+!grep"Writing objects"err+'+ test_done
From: Tay Ray Chuan <hidden> Date: 2016-06-15 22:49:48
From: Jeff King <redacted>
When pushing via builtin transports (like file://, git://), the
underlying transport helper (in this case, git-pack-objects) did not get
the --progress option, even if it was passed to git push.
Fix this, and update the tests to reflect this.
Note that according to the git-pack-objects documentation, we can safely
apply the usual --progress semantics for the transport commands like
clone and fetch (and for pushing over other smart transports).
Reported-by: Chase Brammer <redacted>
Helped-by: Jonathan Nieder [off-list ref]
Signed-off-by: Jeff King <redacted>
Signed-off-by: Tay Ray Chuan <redacted>
---
No significant changes other than those incurred while rebasing on
top of Jeff's patches.
builtin/send-pack.c | 3 +++
send-pack.h | 1 +
t/t5523-push-upstream.sh | 4 ++--
transport.c | 1 +
4 files changed, 7 insertions(+), 2 deletions(-)
@@ -78,7 +78,7 @@ test_expect_success TTY 'progress messages go to tty' 'grep"Writing objects"err'-test_expect_failure'progress messages do not go to non-tty''+test_expect_success'progress messages do not go to non-tty''ensure_fresh_upstream&&# skip progress messages, since stderr is non-tty
@@ -86,7 +86,7 @@ test_expect_failure 'progress messages do not go to non-tty' '!grep"Writing objects"err'-test_expect_failure'progress messages go to non-tty (forced)''+test_expect_success'progress messages go to non-tty (forced)''ensure_fresh_upstream&&# force progress messages to stderr, even though it is non-tty
From: Jonathan Nieder <hidden> Date: 2016-06-15 22:49:48
Tay Ray Chuan wrote:
- use the test_terminal script even when running with "-v"
if IO::Pty is available, to allow commands like
test_terminal foo >out 2>err
- add a separate TTYREDIR prerequisite which is only set
when the test_terminal script is usable
- write the "need to declare TTY prerequisite" message to fd 4,
where it will be printed when running tests with -v, rather
than being swallowed up by an unrelated redireciton.
The patches up to this one look good to me. This one behaves
as advertised, but I think the API is lousy --- it is just
begging people to use the TTY prereq where TTYREDIR is needed.
Better to change TTY to mean TTYREDIR and drop support for
test_terminal on systems without IO::Pty:
-- 8< --
Subject: test_terminal: ensure redirections work reliably
For terminal tests that capture output/stderr, the TTY prerequisite
warning does not quite work for commands like
test_terminal foo >out 2>err
because the warning gets "swallowed" up by the redirection that's
supposed only to be done by the subcommand.
Even worse, the outcome depends on whether stdout was already a
terminal (in which case test_terminal is a noop) or not (in which case
test_terminal introduces a pseudo-tty in the middle of the pipeline).
$ test_terminal.perl sh -c 'test -t 1 && echo >&2 YES' >out
YES
$ sh -c 'test -t 1 && echo >&2 YES' >out
$
So:
- use the test_terminal script even when running with "-v".
- skip tests that require a terminal when the test_terminal
script is unusable because IO::Pty is not installed.
- write the "need to declare TTY prerequisite" message to fd 4,
where it will be printed when running tests with -v, rather
than being swallowed up by an unrelated redireciton.
Noticed-by: Tay Ray Chuan [off-list ref]
Signed-off-by: Jonathan Nieder <redacted>
---
The only other sane alternative I can think of is to introduce
TTYNOREDIR, since at least people wouldn't be tempted to use
that. Distinguishing between
test_expect_success 'foo' '
test_terminal bar >out 2>err
'
and
test_expect_success 'foo' '
test_terminal bar
'
from a script run as
sh t1234-some-script.sh >log 2>err.log
does not seem to be easy without OS-specific hacks like
"readlink /dev/fd/1".
t/lib-terminal.sh | 38 ++++++++++----------------------------
1 files changed, 10 insertions(+), 28 deletions(-)
@@ -1,37 +1,19 @@#!/bin/sh test_expect_success'set up terminal for tests''-iftest-t1&&test-t2-then->have_tty-elif+iftest_have_prereqPERL&&"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl\sh-c"test -t 1 && test -t 2"then->test_terminal_works+test_set_prereqTTY&&+test_terminal(){+if!test_declared_prereqTTY+then+echo>&4"test_terminal: need to declare TTY prerequisite"+return127+fi+"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl"$@"+}fi'--iftest-ehave_tty-then-test_terminal_(){"$@";}-test_set_prereqTTY-eliftest-etest_terminal_works-then-test_terminal_(){-"$PERL_PATH""$TEST_DIRECTORY"/test-terminal.perl"$@"-}-test_set_prereqTTY-else-say"# no usable terminal, so skipping some tests"-fi--test_terminal(){-if!test_declared_prereqTTY-then-echo>&2'test_terminal: need to declare TTY prerequisite'-return127-fi-test_terminal_"$@"-}
@@ -70,4 +71,41 @@ test_expect_success 'push -u HEAD' 'check_configheadbranchupstreamrefs/heads/headbranch'+test_expect_successTTY'progress messages go to tty''+ensure_fresh_upstream&&++test_terminalgitpush-uupstreammaster>out2>err&&+grep"Writing objects"err+'
Thanks for testing the usual case. It is easy to forget sometimes.
The tests using the TTY prerequisite would need to use TTYREDIR
unless we simplify the latter out of existence.
From: Jonathan Nieder <hidden> Date: 2016-06-15 22:49:48
Tay Ray Chuan wrote:
Jeff King (3):
tests: factor out terminal handling from t7006
tests: test terminal output to both stdout and stderr
push: pass --progress down to git-pack-objects
Jonathan Nieder (3):
test-lib: allow test code to check the list of declared prerequisites
test_terminal: catch use without TTY prerequisite
test_terminal: give priority to test-terminal.perl usage
Tay Ray Chuan (2):
t5523-push-upstream: add function to ensure fresh upstream repo
t5523-push-upstream: test progress messages
I've sent some comments on patches 5 (give priority..) and 7 (test
progress messages). Except as mentioned,
Reviewed-by: Jonathan Nieder <redacted>
Thanks for cleaning up the test_terminal mess.
From: Jeff King <hidden> Date: 2016-06-15 22:49:51
On Sun, Oct 17, 2010 at 02:37:00AM +0800, Tay Ray Chuan wrote:
The outcome depends on whether stdout was already a terminal (in which
case test_terminal is a noop) or not (in which case test_terminal
introduces a pseudo-tty in the middle of the pipeline).
$ test_terminal.perl sh -c 'test -t 1 && echo >&2 YES' >out
YES
$ sh -c 'test -t 1 && echo >&2 YES' >out
$
How about this?
- use the test_terminal script even when running with "-v"
if IO::Pty is available, to allow commands like
test_terminal foo >out 2>err
- add a separate TTYREDIR prerequisite which is only set
when the test_terminal script is usable
Is it even worth keeping the direct-to-tty code at all? Yes, it means
that people without IO::Pty can use _some_ terminal tests with "-v". But
it creates a headache for test writers in understanding the subtle
difference between TTY and TTYREDIR.
-Peff