Merge branch 'rh/test-color-avoid-terminfo-in-original-home'
authorJunio C Hamano <gitster@pobox.com>
Fri, 10 Jul 2015 21:17:55 +0000 (14:17 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 10 Jul 2015 21:17:55 +0000 (14:17 -0700)
An ancient test framework enhancement to allow color was not
entirely correct; this makes it work even when tput needs to read
from the ~/.terminfo under the user's real HOME directory.

* rh/test-color-avoid-terminfo-in-original-home:
  test-lib.sh: fix color support when tput needs ~/.terminfo
  Revert "test-lib.sh: do tests for color support after changing HOME"

1  2 
t/test-lib.sh

diff --combined t/test-lib.sh
@@@ -15,9 -15,6 +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 +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
@@@ -152,7 -149,10 +149,7 @@@ unset UNZI
  
  case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
  1|2|true)
 -      echo "* warning: Some tests will not work if GIT_TRACE" \
 -              "is set as to trace on STDERR ! *"
 -      echo "* warning: Please set GIT_TRACE to something" \
 -              "other than 1, 2 or true ! *"
 +      GIT_TRACE=4
        ;;
  esac
  
@@@ -181,8 -181,14 +178,14 @@@ export _x05 _x40 _z40 LF u200
  # This test checks if command xyzzy does the right thing...
  # '
  # . ./test-lib.sh
+ test "x$TERM" != "xdumb" && (
+               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
        --root=*)
                root=$(expr "z$1" : 'z[^=]*=\(.*\)')
                shift ;;
 +      --chain-lint)
 +              GIT_TEST_CHAIN_LINT=1
 +              shift ;;
 +      --no-chain-lint)
 +              GIT_TEST_CHAIN_LINT=0
 +              shift ;;
        -x)
                trace=t
                verbose=t
@@@ -253,6 -253,44 +256,44 @@@ the
        verbose=t
  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 () {
+               test -z "$1" && test -n "$quiet" && return
+               eval "say_color_color=\$say_color_$1"
+               shift
+               printf "%s\\n" "$say_color_color$*$say_color_reset"
+       }
+ else
+       say_color() {
+               test -z "$1" && test -n "$quiet" && return
+               shift
+               printf "%s\n" "$*"
+       }
+ fi
+ TERM=dumb
+ export TERM
  error () {
        say_color error "error: $*"
        GIT_EXIT_OK=t
@@@ -302,7 -340,6 +343,7 @@@ die () 
  
  GIT_EXIT_OK=
  trap 'die' EXIT
 +trap 'exit $?' INT
  
  # The user-facing functions are loaded from a separate file so that
  # test_perf subshells can have them too
@@@ -528,16 -565,6 +569,16 @@@ test_eval_ () 
  test_run_ () {
        test_cleanup=:
        expecting_failure=$2
 +
 +      if test "${GIT_TEST_CHAIN_LINT:-1}" != 0; then
 +              # 117 is magic because it is unlikely to match the exit
 +              # code of other programs
 +              test_eval_ "(exit 117) && $1"
 +              if test "$?" != 117; then
 +                      error "bug in the test script: broken &&-chain: $1"
 +              fi
 +      fi
 +
        setup_malloc_check
        test_eval_ "$1"
        eval_ret=$?
@@@ -829,52 -856,6 +870,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"
@@@ -1045,42 -1026,12 +1040,42 @@@ test_lazy_prereq USR_BIN_TIME 
        test -x /usr/bin/time
  '
  
 -# When the tests are run as root, permission tests will report that
 -# things are writable when they shouldn't be.
 -test -w / || test_set_prereq SANITY
 +test_lazy_prereq NOT_ROOT '
 +      uid=$(id -u) &&
 +      test "$uid" != 0
 +'
 +
 +# On a filesystem that lacks SANITY, a file can be deleted even if
 +# the containing directory doesn't have write permissions, or a file
 +# can be accessed even if the containing directory doesn't have read
 +# or execute permissions, causing our tests that validate that Git
 +# works sensibly in such situations.
 +test_lazy_prereq SANITY '
 +      mkdir SANETESTD.1 SANETESTD.2 &&
 +
 +      chmod +w SANETESTD.1 SANETESTD.2 &&
 +      >SANETESTD.1/x 2>SANETESTD.2/x &&
 +      chmod -w SANETESTD.1 &&
 +      chmod -rx SANETESTD.2 ||
 +      error "bug in test sript: cannot prepare SANETESTD"
 +
 +      ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x
 +      status=$?
 +
 +      chmod +rwx SANETESTD.1 SANETESTD.2 &&
 +      rm -rf SANETESTD.1 SANETESTD.2 ||
 +      error "bug in test sript: cannot clean SANETESTD"
 +      return $status
 +'
  
  GIT_UNZIP=${GIT_UNZIP:-unzip}
  test_lazy_prereq UNZIP '
        "$GIT_UNZIP" -v
        test $? -ne 127
  '
 +
 +run_with_limited_cmdline () {
 +      (ulimit -s 128 && "$@")
 +}
 +
 +test_lazy_prereq CMDLINE_LIMIT 'run_with_limited_cmdline true'