* [PATCH 0/2] redo fix for test-lib.sh color support
@ 2015-06-17 19:06 Richard Hansen
2015-06-17 19:06 ` [PATCH 1/2] Revert "test-lib.sh: do tests for color support after changing HOME" Richard Hansen
2015-06-17 19:06 ` [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo Richard Hansen
0 siblings, 2 replies; 13+ messages in thread
From: Richard Hansen @ 2015-06-17 19:06 UTC (permalink / raw)
To: git; +Cc: Richard Hansen
Commit 102fc80d fixed a bug where tput was failing because it needed
to read ~/.terminfo after HOME was changed. However, that commit is
buggy, and it unnecessarily disables color support when tput needs to
read from ~/.terminfo.
This series does two things:
* revert the buggy fix
* fix it properly, I hope :)
Richard Hansen (2):
Revert "test-lib.sh: do tests for color support after changing HOME"
test-lib.sh: fix color support when tput needs ~/.terminfo
t/test-lib.sh | 103 +++++++++++++++++++++++++++++-----------------------------
1 file changed, 51 insertions(+), 52 deletions(-)
--
2.4.3
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/2] Revert "test-lib.sh: do tests for color support after changing HOME"
2015-06-17 19:06 [PATCH 0/2] redo fix for test-lib.sh color support Richard Hansen
@ 2015-06-17 19:06 ` Richard Hansen
2015-06-17 19:06 ` [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo Richard Hansen
1 sibling, 0 replies; 13+ messages in thread
From: Richard Hansen @ 2015-06-17 19:06 UTC (permalink / raw)
To: git; +Cc: Richard Hansen
This reverts commit 102fc80d32094ad6598b17ab9d607516ee8edc4a.
There are two issues with that commit:
* It is buggy. In pseudocode, it is doing:
color is set || TERM != dumb && color works && color=t
when it should be doing:
color is set || { TERM != dumb && color works && color=t }
* It unnecessarily disables color when tput needs to read
~/.terminfo to get the control sequences.
---
t/test-lib.sh | 90 ++++++++++++++++++++++++++++-------------------------------
1 file changed, 43 insertions(+), 47 deletions(-)
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 39da9c2..57212ec 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -181,8 +181,16 @@ export _x05 _x40 _z40 LF u200c
# This test checks if command xyzzy does the right thing...
# '
# . ./test-lib.sh
+test "x$ORIGINAL_TERM" != "xdumb" && (
+ TERM=$ORIGINAL_TERM &&
+ export TERM &&
+ test -t 1 &&
+ tput bold >/dev/null 2>&1 &&
+ tput setaf 1 >/dev/null 2>&1 &&
+ tput sgr0 >/dev/null 2>&1
+ ) &&
+ color=t
-unset color
while test "$#" -ne 0
do
case "$1" in
@@ -253,6 +261,40 @@ then
verbose=t
fi
+if test -n "$color"
+then
+ say_color () {
+ (
+ TERM=$ORIGINAL_TERM
+ export TERM
+ case "$1" in
+ error)
+ tput bold; tput setaf 1;; # bold red
+ skip)
+ tput setaf 4;; # blue
+ warn)
+ tput setaf 3;; # brown/yellow
+ pass)
+ tput setaf 2;; # green
+ info)
+ tput setaf 6;; # cyan
+ *)
+ test -n "$quiet" && return;;
+ esac
+ shift
+ printf "%s" "$*"
+ tput sgr0
+ echo
+ )
+ }
+else
+ say_color() {
+ test -z "$1" && test -n "$quiet" && return
+ shift
+ printf "%s\n" "$*"
+ }
+fi
+
error () {
say_color error "error: $*"
GIT_EXIT_OK=t
@@ -829,52 +871,6 @@ HOME="$TRASH_DIRECTORY"
GNUPGHOME="$HOME/gnupg-home-not-used"
export HOME GNUPGHOME
-# run the tput tests *after* changing HOME (in case ncurses needs
-# ~/.terminfo for $TERM)
-test -n "${color+set}" || test "x$ORIGINAL_TERM" != "xdumb" && (
- TERM=$ORIGINAL_TERM &&
- export TERM &&
- test -t 1 &&
- tput bold >/dev/null 2>&1 &&
- tput setaf 1 >/dev/null 2>&1 &&
- tput sgr0 >/dev/null 2>&1
- ) &&
- color=t
-
-if test -n "$color"
-then
- say_color () {
- (
- TERM=$ORIGINAL_TERM
- export TERM
- case "$1" in
- error)
- tput bold; tput setaf 1;; # bold red
- skip)
- tput setaf 4;; # blue
- warn)
- tput setaf 3;; # brown/yellow
- pass)
- tput setaf 2;; # green
- info)
- tput setaf 6;; # cyan
- *)
- test -n "$quiet" && return;;
- esac
- shift
- printf "%s" "$*"
- tput sgr0
- echo
- )
- }
-else
- say_color() {
- test -z "$1" && test -n "$quiet" && return
- shift
- printf "%s\n" "$*"
- }
-fi
-
if test -z "$TEST_NO_CREATE_REPO"
then
test_create_repo "$TRASH_DIRECTORY"
--
2.4.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 19:06 [PATCH 0/2] redo fix for test-lib.sh color support Richard Hansen
2015-06-17 19:06 ` [PATCH 1/2] Revert "test-lib.sh: do tests for color support after changing HOME" Richard Hansen
@ 2015-06-17 19:06 ` Richard Hansen
2015-06-17 19:43 ` Jeff King
1 sibling, 1 reply; 13+ messages in thread
From: Richard Hansen @ 2015-06-17 19:06 UTC (permalink / raw)
To: git; +Cc: Richard Hansen
If tput needs ~/.terminfo for the current $TERM, then tput will
succeed before HOME is changed to $TRASH_DIRECTORY (causing color to
be set to 't') but fail afterward.
One possible way to fix this is to treat HOME like TERM: back up the
original value and temporarily restore it before say_color() runs
tput.
Instead, pre-compute and save the color control sequences before
changing either TERM or HOME. Use the saved control sequences in
say_color() rather than call tput each time. This avoids the need to
back up and restore the TERM and HOME variables, and it avoids the
overhead of a subshell and two invocations of tput per call to
say_color().
Signed-off-by: Richard Hansen <rhansen@bbn.com>
---
t/test-lib.sh | 53 ++++++++++++++++++++++++++++-------------------------
1 file changed, 28 insertions(+), 25 deletions(-)
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 57212ec..4a59bfb 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -15,9 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see http://www.gnu.org/licenses/ .
-# Keep the original TERM for say_color
-ORIGINAL_TERM=$TERM
-
# Test the binaries we have just built. The tests are kept in
# t/ subdirectory and are run in 'trash directory' subdirectory.
if test -z "$TEST_DIRECTORY"
@@ -68,12 +65,12 @@ done,*)
esac
# For repeatability, reset the environment to known value.
+# TERM is sanitized below, after saving color control sequences.
LANG=C
LC_ALL=C
PAGER=cat
TZ=UTC
-TERM=dumb
-export LANG LC_ALL PAGER TERM TZ
+export LANG LC_ALL PAGER TZ
EDITOR=:
# A call to "unset" with no arguments causes at least Solaris 10
# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets
@@ -181,9 +178,7 @@ export _x05 _x40 _z40 LF u200c
# This test checks if command xyzzy does the right thing...
# '
# . ./test-lib.sh
-test "x$ORIGINAL_TERM" != "xdumb" && (
- TERM=$ORIGINAL_TERM &&
- export TERM &&
+test "x$TERM" != "xdumb" && (
test -t 1 &&
tput bold >/dev/null 2>&1 &&
tput setaf 1 >/dev/null 2>&1 &&
@@ -263,29 +258,34 @@ fi
if test -n "$color"
then
+ # Save the color control sequences now rather than run tput
+ # each time say_color() is called. This is done for two
+ # reasons:
+ # * TERM will be changed to dumb
+ # * HOME will be changed to a temporary directory and tput
+ # might need to read ~/.terminfo from the original HOME
+ # directory to get the control sequences
+ # Note: This approach assumes the control sequences don't end
+ # in a newline for any terminal of interest (command
+ # substitutions strip trailing newlines). Given that most
+ # (all?) terminals in common use are related to ECMA-48, this
+ # shouldn't be a problem.
+ say_color_error=$(tput bold; tput setaf 1) # bold red
+ say_color_skip=$(tput setaf 4) # blue
+ say_color_warn=$(tput setaf 3) # brown/yellow
+ say_color_pass=$(tput setaf 2) # green
+ say_color_info=$(tput setaf 6) # cyan
+ say_color_sgr0=$(tput sgr0)
say_color () {
- (
- TERM=$ORIGINAL_TERM
- export TERM
+ say_color_color=
case "$1" in
- error)
- tput bold; tput setaf 1;; # bold red
- skip)
- tput setaf 4;; # blue
- warn)
- tput setaf 3;; # brown/yellow
- pass)
- tput setaf 2;; # green
- info)
- tput setaf 6;; # cyan
+ error|skip|warn|pass|info)
+ eval "say_color_color=\$say_color_$1";;
*)
test -n "$quiet" && return;;
esac
shift
- printf "%s" "$*"
- tput sgr0
- echo
- )
+ printf "%s\\n" "$say_color_color$*$say_color_sgr0"
}
else
say_color() {
@@ -295,6 +295,9 @@ else
}
fi
+TERM=dumb
+export TERM
+
error () {
say_color error "error: $*"
GIT_EXIT_OK=t
--
2.4.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 19:06 ` [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo Richard Hansen
@ 2015-06-17 19:43 ` Jeff King
2015-06-17 19:55 ` Richard Hansen
0 siblings, 1 reply; 13+ messages in thread
From: Jeff King @ 2015-06-17 19:43 UTC (permalink / raw)
To: Richard Hansen; +Cc: git
On Wed, Jun 17, 2015 at 03:06:26PM -0400, Richard Hansen wrote:
> If tput needs ~/.terminfo for the current $TERM, then tput will
> succeed before HOME is changed to $TRASH_DIRECTORY (causing color to
> be set to 't') but fail afterward.
>
> One possible way to fix this is to treat HOME like TERM: back up the
> original value and temporarily restore it before say_color() runs
> tput.
>
> Instead, pre-compute and save the color control sequences before
> changing either TERM or HOME. Use the saved control sequences in
> say_color() rather than call tput each time. This avoids the need to
> back up and restore the TERM and HOME variables, and it avoids the
> overhead of a subshell and two invocations of tput per call to
> say_color().
>
> Signed-off-by: Richard Hansen <rhansen@bbn.com>
Nice, I like it.
> + # Save the color control sequences now rather than run tput
> + # each time say_color() is called. This is done for two
> + # reasons:
> + # * TERM will be changed to dumb
> + # * HOME will be changed to a temporary directory and tput
> + # might need to read ~/.terminfo from the original HOME
> + # directory to get the control sequences
> + # Note: This approach assumes the control sequences don't end
> + # in a newline for any terminal of interest (command
> + # substitutions strip trailing newlines). Given that most
> + # (all?) terminals in common use are related to ECMA-48, this
> + # shouldn't be a problem.
Yeah, that was my first thought, but I agree it probably isn't going to
be a big deal in practice.
> + say_color_error=$(tput bold; tput setaf 1) # bold red
> + say_color_skip=$(tput setaf 4) # blue
> + say_color_warn=$(tput setaf 3) # brown/yellow
> + say_color_pass=$(tput setaf 2) # green
> + say_color_info=$(tput setaf 6) # cyan
> + say_color_sgr0=$(tput sgr0)
> [...]
> + error|skip|warn|pass|info)
> + eval "say_color_color=\$say_color_$1";;
> *)
> test -n "$quiet" && return;;
I think you could dispense with this case statement entirely and do:
eval "say_color_color=\$say_color_$1"
if test -z "$say_color_color"; then
test -n "$quiet" && return
fi
I guess that is making the assumption that all colors have non-zero
sizes, but that seems reasonable. I do not mind it so much as you have
it, but it does mean adding a new field needs to update two spots.
-Peff
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 19:43 ` Jeff King
@ 2015-06-17 19:55 ` Richard Hansen
2015-06-17 20:15 ` Junio C Hamano
2015-06-17 20:25 ` [PATCH " Jeff King
0 siblings, 2 replies; 13+ messages in thread
From: Richard Hansen @ 2015-06-17 19:55 UTC (permalink / raw)
To: Jeff King; +Cc: git
On 2015-06-17 15:43, Jeff King wrote:
> On Wed, Jun 17, 2015 at 03:06:26PM -0400, Richard Hansen wrote:
>> + say_color_error=$(tput bold; tput setaf 1) # bold red
>> + say_color_skip=$(tput setaf 4) # blue
>> + say_color_warn=$(tput setaf 3) # brown/yellow
>> + say_color_pass=$(tput setaf 2) # green
>> + say_color_info=$(tput setaf 6) # cyan
>> + say_color_sgr0=$(tput sgr0)
>> [...]
>> + error|skip|warn|pass|info)
>> + eval "say_color_color=\$say_color_$1";;
>> *)
>> test -n "$quiet" && return;;
>
> I think you could dispense with this case statement entirely and do:
>
> eval "say_color_color=\$say_color_$1"
> if test -z "$say_color_color"; then
> test -n "$quiet" && return
> fi
>
> I guess that is making the assumption that all colors have non-zero
> sizes, but that seems reasonable.
We could test if the variable is set first (test -n "${foo+set}"), at
the cost of a bit more complexity.
> I do not mind it so much as you have
> it, but it does mean adding a new field needs to update two spots.
I also don't like the duplicate list of color types, and I considered
doing something similar to what you suggested, but I decided against it.
I'm a bit worried about bizarre syntax errors or code execution if
say_color() is used improperly. ('eval' with uncontrolled variables
makes me nervous.)
Thanks for reviewing,
Richard
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 19:55 ` Richard Hansen
@ 2015-06-17 20:15 ` Junio C Hamano
2015-06-17 21:11 ` [PATCH v2 0/2] redo fix for test-lib.sh color support Richard Hansen
2015-06-17 20:25 ` [PATCH " Jeff King
1 sibling, 1 reply; 13+ messages in thread
From: Junio C Hamano @ 2015-06-17 20:15 UTC (permalink / raw)
To: Richard Hansen; +Cc: Jeff King, git
Richard Hansen <rhansen@bbn.com> writes:
> We could test if the variable is set first (test -n "${foo+set}"), at
> the cost of a bit more complexity.
>
>> I do not mind it so much as you have
>> it, but it does mean adding a new field needs to update two spots.
>
> I also don't like the duplicate list of color types, and I considered
> doing something similar to what you suggested, but I decided against it.
> I'm a bit worried about bizarre syntax errors or code execution if
> say_color() is used improperly. ('eval' with uncontrolled variables
> makes me nervous.)
I originally had the same reaction to your use of `eval` (with or
without being guarded by the case to limit to known 5 ones). But
the uncontrolled-ness of this use of eval is to the same degree of
uncontrolled-ness of any test_expect_{success,failure} scriptlet,
so...
I like this "save to variables instead of using tput" approach very
much either way. Well done.
Thanks.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 19:55 ` Richard Hansen
2015-06-17 20:15 ` Junio C Hamano
@ 2015-06-17 20:25 ` Jeff King
1 sibling, 0 replies; 13+ messages in thread
From: Jeff King @ 2015-06-17 20:25 UTC (permalink / raw)
To: Richard Hansen; +Cc: git
On Wed, Jun 17, 2015 at 03:55:05PM -0400, Richard Hansen wrote:
> > I do not mind it so much as you have
> > it, but it does mean adding a new field needs to update two spots.
>
> I also don't like the duplicate list of color types, and I considered
> doing something similar to what you suggested, but I decided against it.
> I'm a bit worried about bizarre syntax errors or code execution if
> say_color() is used improperly. ('eval' with uncontrolled variables
> makes me nervous.)
As Junio pointed out, I think all bets are off in the test scripts. They
are running tons of arbitrary code. :)
But for the record, I am fine with your patch as-is. Thanks for looking
into it.
-Peff
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 0/2] redo fix for test-lib.sh color support
2015-06-17 20:15 ` Junio C Hamano
@ 2015-06-17 21:11 ` Richard Hansen
2015-06-17 21:11 ` [PATCH v2 1/2] Revert "test-lib.sh: do tests for color support after changing HOME" Richard Hansen
2015-06-17 21:11 ` [PATCH v2 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo Richard Hansen
0 siblings, 2 replies; 13+ messages in thread
From: Richard Hansen @ 2015-06-17 21:11 UTC (permalink / raw)
To: git, gitster, peff; +Cc: Richard Hansen
Changes from v1:
* Eliminate the case statement and assume the user passed a sane
value for $1.
* Use the same test as the non-colorized version of say_color() when
determining whether to suppress the output: assume that a message
can only be suppresed if $1 is the empty string. This avoids the
need to test whether the variable say_color_$1 is set.
* Rename say_color_sgr0 to say_color_reset.
* Add a new variable say_color_ (set to the empty string) as a way
of documenting that $1 is expected to be the empty string for
normal text.
Richard Hansen (2):
Revert "test-lib.sh: do tests for color support after changing HOME"
test-lib.sh: fix color support when tput needs ~/.terminfo
t/test-lib.sh | 99 ++++++++++++++++++++++++++++-------------------------------
1 file changed, 47 insertions(+), 52 deletions(-)
--
2.4.3
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/2] Revert "test-lib.sh: do tests for color support after changing HOME"
2015-06-17 21:11 ` [PATCH v2 0/2] redo fix for test-lib.sh color support Richard Hansen
@ 2015-06-17 21:11 ` Richard Hansen
2015-06-17 21:11 ` [PATCH v2 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo Richard Hansen
1 sibling, 0 replies; 13+ messages in thread
From: Richard Hansen @ 2015-06-17 21:11 UTC (permalink / raw)
To: git, gitster, peff; +Cc: Richard Hansen
This reverts commit 102fc80d32094ad6598b17ab9d607516ee8edc4a.
There are two issues with that commit:
* It is buggy. In pseudocode, it is doing:
color is set || TERM != dumb && color works && color=t
when it should be doing:
color is set || { TERM != dumb && color works && color=t }
* It unnecessarily disables color when tput needs to read
~/.terminfo to get the control sequences.
---
t/test-lib.sh | 90 ++++++++++++++++++++++++++++-------------------------------
1 file changed, 43 insertions(+), 47 deletions(-)
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 39da9c2..57212ec 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -181,8 +181,16 @@ export _x05 _x40 _z40 LF u200c
# This test checks if command xyzzy does the right thing...
# '
# . ./test-lib.sh
+test "x$ORIGINAL_TERM" != "xdumb" && (
+ TERM=$ORIGINAL_TERM &&
+ export TERM &&
+ test -t 1 &&
+ tput bold >/dev/null 2>&1 &&
+ tput setaf 1 >/dev/null 2>&1 &&
+ tput sgr0 >/dev/null 2>&1
+ ) &&
+ color=t
-unset color
while test "$#" -ne 0
do
case "$1" in
@@ -253,6 +261,40 @@ then
verbose=t
fi
+if test -n "$color"
+then
+ say_color () {
+ (
+ TERM=$ORIGINAL_TERM
+ export TERM
+ case "$1" in
+ error)
+ tput bold; tput setaf 1;; # bold red
+ skip)
+ tput setaf 4;; # blue
+ warn)
+ tput setaf 3;; # brown/yellow
+ pass)
+ tput setaf 2;; # green
+ info)
+ tput setaf 6;; # cyan
+ *)
+ test -n "$quiet" && return;;
+ esac
+ shift
+ printf "%s" "$*"
+ tput sgr0
+ echo
+ )
+ }
+else
+ say_color() {
+ test -z "$1" && test -n "$quiet" && return
+ shift
+ printf "%s\n" "$*"
+ }
+fi
+
error () {
say_color error "error: $*"
GIT_EXIT_OK=t
@@ -829,52 +871,6 @@ HOME="$TRASH_DIRECTORY"
GNUPGHOME="$HOME/gnupg-home-not-used"
export HOME GNUPGHOME
-# run the tput tests *after* changing HOME (in case ncurses needs
-# ~/.terminfo for $TERM)
-test -n "${color+set}" || test "x$ORIGINAL_TERM" != "xdumb" && (
- TERM=$ORIGINAL_TERM &&
- export TERM &&
- test -t 1 &&
- tput bold >/dev/null 2>&1 &&
- tput setaf 1 >/dev/null 2>&1 &&
- tput sgr0 >/dev/null 2>&1
- ) &&
- color=t
-
-if test -n "$color"
-then
- say_color () {
- (
- TERM=$ORIGINAL_TERM
- export TERM
- case "$1" in
- error)
- tput bold; tput setaf 1;; # bold red
- skip)
- tput setaf 4;; # blue
- warn)
- tput setaf 3;; # brown/yellow
- pass)
- tput setaf 2;; # green
- info)
- tput setaf 6;; # cyan
- *)
- test -n "$quiet" && return;;
- esac
- shift
- printf "%s" "$*"
- tput sgr0
- echo
- )
- }
-else
- say_color() {
- test -z "$1" && test -n "$quiet" && return
- shift
- printf "%s\n" "$*"
- }
-fi
-
if test -z "$TEST_NO_CREATE_REPO"
then
test_create_repo "$TRASH_DIRECTORY"
--
2.4.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 21:11 ` [PATCH v2 0/2] redo fix for test-lib.sh color support Richard Hansen
2015-06-17 21:11 ` [PATCH v2 1/2] Revert "test-lib.sh: do tests for color support after changing HOME" Richard Hansen
@ 2015-06-17 21:11 ` Richard Hansen
2015-06-17 22:13 ` Jeff King
1 sibling, 1 reply; 13+ messages in thread
From: Richard Hansen @ 2015-06-17 21:11 UTC (permalink / raw)
To: git, gitster, peff; +Cc: Richard Hansen
If tput needs ~/.terminfo for the current $TERM, then tput will
succeed before HOME is changed to $TRASH_DIRECTORY (causing color to
be set to 't') but fail afterward.
One possible way to fix this is to treat HOME like TERM: back up the
original value and temporarily restore it before say_color() runs
tput.
Instead, pre-compute and save the color control sequences before
changing either TERM or HOME. Use the saved control sequences in
say_color() rather than call tput each time. This avoids the need to
back up and restore the TERM and HOME variables, and it avoids the
overhead of a subshell and two invocations of tput per call to
say_color().
Signed-off-by: Richard Hansen <rhansen@bbn.com>
---
t/test-lib.sh | 57 ++++++++++++++++++++++++++++-----------------------------
1 file changed, 28 insertions(+), 29 deletions(-)
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 57212ec..cea6cda 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -15,9 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see http://www.gnu.org/licenses/ .
-# Keep the original TERM for say_color
-ORIGINAL_TERM=$TERM
-
# Test the binaries we have just built. The tests are kept in
# t/ subdirectory and are run in 'trash directory' subdirectory.
if test -z "$TEST_DIRECTORY"
@@ -68,12 +65,12 @@ done,*)
esac
# For repeatability, reset the environment to known value.
+# TERM is sanitized below, after saving color control sequences.
LANG=C
LC_ALL=C
PAGER=cat
TZ=UTC
-TERM=dumb
-export LANG LC_ALL PAGER TERM TZ
+export LANG LC_ALL PAGER TZ
EDITOR=:
# A call to "unset" with no arguments causes at least Solaris 10
# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets
@@ -181,9 +178,7 @@ export _x05 _x40 _z40 LF u200c
# This test checks if command xyzzy does the right thing...
# '
# . ./test-lib.sh
-test "x$ORIGINAL_TERM" != "xdumb" && (
- TERM=$ORIGINAL_TERM &&
- export TERM &&
+test "x$TERM" != "xdumb" && (
test -t 1 &&
tput bold >/dev/null 2>&1 &&
tput setaf 1 >/dev/null 2>&1 &&
@@ -263,29 +258,30 @@ fi
if test -n "$color"
then
+ # Save the color control sequences now rather than run tput
+ # each time say_color() is called. This is done for two
+ # reasons:
+ # * TERM will be changed to dumb
+ # * HOME will be changed to a temporary directory and tput
+ # might need to read ~/.terminfo from the original HOME
+ # directory to get the control sequences
+ # Note: This approach assumes the control sequences don't end
+ # in a newline for any terminal of interest (command
+ # substitutions strip trailing newlines). Given that most
+ # (all?) terminals in common use are related to ECMA-48, this
+ # shouldn't be a problem.
+ say_color_error=$(tput bold; tput setaf 1) # bold red
+ say_color_skip=$(tput setaf 4) # blue
+ say_color_warn=$(tput setaf 3) # brown/yellow
+ say_color_pass=$(tput setaf 2) # green
+ say_color_info=$(tput setaf 6) # cyan
+ say_color_reset=$(tput sgr0)
+ say_color_="" # no formatting for normal text
say_color () {
- (
- TERM=$ORIGINAL_TERM
- export TERM
- case "$1" in
- error)
- tput bold; tput setaf 1;; # bold red
- skip)
- tput setaf 4;; # blue
- warn)
- tput setaf 3;; # brown/yellow
- pass)
- tput setaf 2;; # green
- info)
- tput setaf 6;; # cyan
- *)
- test -n "$quiet" && return;;
- esac
+ test -z "$1" && test -n "$quiet" && return
+ eval "say_color_color=\$say_color_$1"
shift
- printf "%s" "$*"
- tput sgr0
- echo
- )
+ printf "%s\\n" "$say_color_color$*$say_color_reset"
}
else
say_color() {
@@ -295,6 +291,9 @@ else
}
fi
+TERM=dumb
+export TERM
+
error () {
say_color error "error: $*"
GIT_EXIT_OK=t
--
2.4.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 21:11 ` [PATCH v2 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo Richard Hansen
@ 2015-06-17 22:13 ` Jeff King
2015-06-17 22:23 ` Junio C Hamano
0 siblings, 1 reply; 13+ messages in thread
From: Jeff King @ 2015-06-17 22:13 UTC (permalink / raw)
To: Richard Hansen; +Cc: git, gitster
On Wed, Jun 17, 2015 at 05:11:21PM -0400, Richard Hansen wrote:
> + test -z "$1" && test -n "$quiet" && return
> + eval "say_color_color=\$say_color_$1"
Thanks, this looks much simpler.
In the non-quiet case, you will eval $say_color_, even though we know it
to be bogus. I guess we need to make sure say_color_color is blank,
though. The alternative would be:
if test -z "$1"; then
test -n "$quiet" && return
say_color_color=
else
eval "say_color_color=\$say_color_$1"
fi
I dunno if that makes the intent more clear or not. I am OK with it
either way.
-Peff
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 22:13 ` Jeff King
@ 2015-06-17 22:23 ` Junio C Hamano
2015-06-17 22:26 ` Jeff King
0 siblings, 1 reply; 13+ messages in thread
From: Junio C Hamano @ 2015-06-17 22:23 UTC (permalink / raw)
To: Jeff King; +Cc: Richard Hansen, git
Jeff King <peff@peff.net> writes:
> On Wed, Jun 17, 2015 at 05:11:21PM -0400, Richard Hansen wrote:
>
>> + test -z "$1" && test -n "$quiet" && return
>> + eval "say_color_color=\$say_color_$1"
>
> Thanks, this looks much simpler.
>
> In the non-quiet case, you will eval $say_color_, even though we know it
> to be bogus.
Yeah, but there is this gem in this patch:
+ ...
+ say_color_info=$(tput setaf 6) # cyan
+ say_color_reset=$(tput sgr0)
+ say_color_="" # no formatting for normal text
In other words, the patch handles these two in the same mechanism:
say_color error "this is my error message"
say_color "" "ok this is just a regular message"
and treating an empy string just one of the supported "colors",
i.e. "error", "skip", "warn", "pass", "info" "reset" and "" are the
colors.
> I guess we need to make sure say_color_color is blank,
> though. The alternative would be:
>
> if test -z "$1"; then
> test -n "$quiet" && return
> say_color_color=
> else
> eval "say_color_color=\$say_color_$1"
> fi
>
> I dunno if that makes the intent more clear or not. I am OK with it
> either way.
I am OK with it either way, too.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo
2015-06-17 22:23 ` Junio C Hamano
@ 2015-06-17 22:26 ` Jeff King
0 siblings, 0 replies; 13+ messages in thread
From: Jeff King @ 2015-06-17 22:26 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Richard Hansen, git
On Wed, Jun 17, 2015 at 03:23:49PM -0700, Junio C Hamano wrote:
> Jeff King <peff@peff.net> writes:
>
> > On Wed, Jun 17, 2015 at 05:11:21PM -0400, Richard Hansen wrote:
> >
> >> + test -z "$1" && test -n "$quiet" && return
> >> + eval "say_color_color=\$say_color_$1"
> >
> > Thanks, this looks much simpler.
> >
> > In the non-quiet case, you will eval $say_color_, even though we know it
> > to be bogus.
>
> Yeah, but there is this gem in this patch:
>
> + ...
> + say_color_info=$(tput setaf 6) # cyan
> + say_color_reset=$(tput sgr0)
> + say_color_="" # no formatting for normal text
Oh, sorry, I was so focused on the later part that I totally missed
that. That is rather elegant, and nicer than what I wrote.
-Peff
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2015-06-17 22:26 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-17 19:06 [PATCH 0/2] redo fix for test-lib.sh color support Richard Hansen
2015-06-17 19:06 ` [PATCH 1/2] Revert "test-lib.sh: do tests for color support after changing HOME" Richard Hansen
2015-06-17 19:06 ` [PATCH 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo Richard Hansen
2015-06-17 19:43 ` Jeff King
2015-06-17 19:55 ` Richard Hansen
2015-06-17 20:15 ` Junio C Hamano
2015-06-17 21:11 ` [PATCH v2 0/2] redo fix for test-lib.sh color support Richard Hansen
2015-06-17 21:11 ` [PATCH v2 1/2] Revert "test-lib.sh: do tests for color support after changing HOME" Richard Hansen
2015-06-17 21:11 ` [PATCH v2 2/2] test-lib.sh: fix color support when tput needs ~/.terminfo Richard Hansen
2015-06-17 22:13 ` Jeff King
2015-06-17 22:23 ` Junio C Hamano
2015-06-17 22:26 ` Jeff King
2015-06-17 20:25 ` [PATCH " Jeff King
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).