git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).