Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Sat, 28 Mar 2009 08:16:46 +0000 (01:16 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 28 Mar 2009 08:16:46 +0000 (01:16 -0700)
* maint:
test-lib: Clean up comments and Makefile.
diff --no-index: Do not generate patch output if other output is requested

1  2 
diff-no-index.c
t/Makefile
t/test-lib.sh
diff --combined diff-no-index.c
index 598687b50ac7b88ca0860faf1670d03047bb3603,7273a7a0b648cc8cbd6dce2043a6e544b87d28b6..42c1dd8ad3b0633767bf577975a895722f882565
@@@ -38,10 -38,6 +38,10 @@@ static int get_mode(const char *path, i
  
        if (!path || !strcmp(path, "/dev/null"))
                *mode = 0;
 +#ifdef _WIN32
 +      else if (!strcasecmp(path, "nul"))
 +              *mode = 0;
 +#endif
        else if (!strcmp(path, "-"))
                *mode = create_ce_mode(0666);
        else if (lstat(path, &st))
@@@ -205,8 -201,6 +205,6 @@@ void diff_no_index(struct rev_info *rev
                    no_index ? "--no-index" : "[--no-index]");
  
        diff_setup(&revs->diffopt);
-       if (!revs->diffopt.output_format)
-               revs->diffopt.output_format = DIFF_FORMAT_PATCH;
        for (i = 1; i < argc - 2; ) {
                int j;
                if (!strcmp(argv[i], "--no-index"))
                revs->diffopt.paths = argv + argc - 2;
        revs->diffopt.nr_paths = 2;
        revs->diffopt.skip_stat_unmatch = 1;
+       if (!revs->diffopt.output_format)
+               revs->diffopt.output_format = DIFF_FORMAT_PATCH;
  
        DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS);
        DIFF_OPT_SET(&revs->diffopt, NO_INDEX);
diff --combined t/Makefile
index 09623414a755dc7e964a0d21768e136dba4556e2,9149373032ef8e1403c820cc289728393e5b8aa8..bf816fc8505508c91999175ad6544a67febabb33
@@@ -24,7 -24,7 +24,7 @@@ pre-clean
        $(RM) -r test-results
  
  clean:
-       $(RM) -r 'trash directory' test-results
+       $(RM) -r 'trash directory'.* test-results
  
  aggregate-results-and-cleanup: $(T)
        $(MAKE) aggregate-results
@@@ -38,7 -38,4 +38,7 @@@ full-svn-test
        $(MAKE) $(TSVN) GIT_SVN_NO_OPTIMIZE_COMMITS=1 LC_ALL=C
        $(MAKE) $(TSVN) GIT_SVN_NO_OPTIMIZE_COMMITS=0 LC_ALL=en_US.UTF-8
  
 -.PHONY: pre-clean $(T) aggregate-results clean
 +valgrind:
 +      GIT_TEST_OPTS=--valgrind $(MAKE)
 +
 +.PHONY: pre-clean $(T) aggregate-results clean valgrind
diff --combined t/test-lib.sh
index 2979e8ea0e85c86a57d9f0dda8915d3b031478de,59d82d25e9ad586ff43a4a9485d348492fb36d19..b050196cb7bb1b668925afe4c9307ea578c97166
@@@ -3,22 -3,6 +3,22 @@@
  # Copyright (c) 2005 Junio C Hamano
  #
  
 +# if --tee was passed, write the output not only to the terminal, but
 +# additionally to the file test-results/$BASENAME.out, too.
 +case "$GIT_TEST_TEE_STARTED, $* " in
 +done,*)
 +      # do not redirect again
 +      ;;
 +*' --tee '*|*' --va'*)
 +      mkdir -p test-results
 +      BASE=test-results/$(basename "$0" .sh)
 +      (GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
 +       echo $? > $BASE.exit) | tee $BASE.out
 +      test "$(cat $BASE.exit)" = 0
 +      exit
 +      ;;
 +esac
 +
  # Keep the original TERM for say_color
  ORIGINAL_TERM=$TERM
  
@@@ -110,10 -94,6 +110,10 @@@ d
        --no-python)
                # noop now...
                shift ;;
 +      --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
 +              valgrind=t; verbose=t; shift ;;
 +      --tee)
 +              shift ;; # was handled already
        *)
                break ;;
        esac
@@@ -238,50 -218,18 +238,50 @@@ test_merge () 
        git tag "$1"
  }
  
 +# This function helps systems where core.filemode=false is set.
 +# Use it instead of plain 'chmod +x' to set or unset the executable bit
 +# of a file in the working directory and add it to the index.
 +
 +test_chmod () {
 +      chmod "$@" &&
 +      git update-index --add "--chmod=$@"
 +}
 +
 +# Use test_set_prereq to tell that a particular prerequisite is available.
 +# The prerequisite can later be checked for in two ways:
 +#
 +# - Explicitly using test_have_prereq.
 +#
 +# - Implicitly by specifying the prerequisite tag in the calls to
 +#   test_expect_{success,failure,code}.
 +#
 +# The single parameter is the prerequisite tag (a simple word, in all
 +# capital letters by convention).
 +
 +test_set_prereq () {
 +      satisfied="$satisfied$1 "
 +}
 +satisfied=" "
 +
 +test_have_prereq () {
 +      case $satisfied in
 +      *" $1 "*)
 +              : yes, have it ;;
 +      *)
 +              ! : nope ;;
 +      esac
 +}
 +
  # You are not expected to call test_ok_ and test_failure_ directly, use
  # the text_expect_* functions instead.
  
  test_ok_ () {
 -      test_count=$(expr "$test_count" + 1)
 -      test_success=$(expr "$test_success" + 1)
 +      test_success=$(($test_success + 1))
        say_color "" "  ok $test_count: $@"
  }
  
  test_failure_ () {
 -      test_count=$(expr "$test_count" + 1)
 -      test_failure=$(expr "$test_failure" + 1);
 +      test_failure=$(($test_failure + 1))
        say_color error "FAIL $test_count: $1"
        shift
        echo "$@" | sed -e 's/^/        /'
  }
  
  test_known_broken_ok_ () {
 -      test_count=$(expr "$test_count" + 1)
        test_fixed=$(($test_fixed+1))
        say_color "" "  FIXED $test_count: $@"
  }
  
  test_known_broken_failure_ () {
 -      test_count=$(expr "$test_count" + 1)
        test_broken=$(($test_broken+1))
        say_color skip "  still broken $test_count: $@"
  }
@@@ -309,23 -259,20 +309,23 @@@ test_run_ () 
  }
  
  test_skip () {
 -      this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$')
 -      this_test="$this_test.$(expr "$test_count" + 1)"
 +      test_count=$(($test_count+1))
        to_skip=
        for skp in $GIT_SKIP_TESTS
        do
 -              case "$this_test" in
 +              case $this_test.$test_count in
                $skp)
                        to_skip=t
                esac
        done
 +      if test -z "$to_skip" && test -n "$prereq" &&
 +         ! test_have_prereq "$prereq"
 +      then
 +              to_skip=t
 +      fi
        case "$to_skip" in
        t)
                say_color skip >&3 "skipping test: $@"
 -              test_count=$(expr "$test_count" + 1)
                say_color skip "skip $test_count: $1"
                : true
                ;;
  }
  
  test_expect_failure () {
 +      test "$#" = 3 && { prereq=$1; shift; } || prereq=
        test "$#" = 2 ||
 -      error "bug in the test script: not 2 parameters to test-expect-failure"
 +      error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
        if ! test_skip "$@"
        then
                say >&3 "checking known breakage: $2"
  }
  
  test_expect_success () {
 +      test "$#" = 3 && { prereq=$1; shift; } || prereq=
        test "$#" = 2 ||
 -      error "bug in the test script: not 2 parameters to test-expect-success"
 +      error "bug in the test script: not 2 or 3 parameters to test-expect-success"
        if ! test_skip "$@"
        then
                say >&3 "expecting success: $2"
  }
  
  test_expect_code () {
 +      test "$#" = 4 && { prereq=$1; shift; } || prereq=
        test "$#" = 3 ||
 -      error "bug in the test script: not 3 parameters to test-expect-code"
 +      error "bug in the test script: not 3 or 4 parameters to test-expect-code"
        if ! test_skip "$@"
        then
                say >&3 "expecting exit code $1: $3"
  # Usage: test_external description command arguments...
  # Example: test_external 'Perl API' perl ../path/to/test.pl
  test_external () {
 -      test "$#" -eq 3 ||
 -      error >&5 "bug in the test script: not 3 parameters to test_external"
 +      test "$#" = 4 && { prereq=$1; shift; } || prereq=
 +      test "$#" = 3 ||
 +      error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
        descr="$1"
        shift
        if ! test_skip "$descr" "$@"
        then
                # Announce the script to reduce confusion about the
                # test output that follows.
 -              say_color "" " run $(expr "$test_count" + 1): $descr ($*)"
 +              say_color "" " run $test_count: $descr ($*)"
                # Run command; redirect its stderr to &4 as in
                # test_run_, but keep its stdout on our stdout even in
                # non-verbose mode.
@@@ -491,7 -434,7 +491,7 @@@ test_create_repo () 
        repo="$1"
        mkdir -p "$repo"
        cd "$repo" || error "Cannot setup test environment"
 -      "$GIT_EXEC_PATH/git" init "--template=$GIT_EXEC_PATH/templates/blt/" >&3 2>&4 ||
 +      "$GIT_EXEC_PATH/git-init" "--template=$owd/../templates/blt/" >&3 2>&4 ||
        error "cannot run git init -- have you built things yet?"
        mv .git/hooks .git/hooks-disabled
        cd "$owd"
@@@ -501,7 -444,7 +501,7 @@@ test_done () 
        trap - EXIT
        test_results_dir="$TEST_DIRECTORY/test-results"
        mkdir -p "$test_results_dir"
 -      test_results_path="$test_results_dir/${0%-*}-$$"
 +      test_results_path="$test_results_dir/${0%.sh}-$$"
  
        echo "total $test_count" >> $test_results_path
        echo "success $test_success" >> $test_results_path
        fi
        case "$test_failure" in
        0)
-               # We could:
-               # cd .. && rm -fr 'trash directory'
-               # but that means we forbid any tests that use their own
-               # subdirectory from calling test_done without coming back
-               # to where they started from.
-               # The Makefile provided will clean this test area so
-               # we will leave things as they are.
                say_color pass "passed all $msg"
  
                test -d "$remove_trash" &&
  # Test the binaries we have just built.  The tests are kept in
  # t/ subdirectory and are run in 'trash directory' subdirectory.
  TEST_DIRECTORY=$(pwd)
 -PATH=$TEST_DIRECTORY/..:$PATH
 -GIT_EXEC_PATH=$(pwd)/..
 +if test -z "$valgrind"
 +then
 +      if test -z "$GIT_TEST_INSTALLED"
 +      then
 +              PATH=$TEST_DIRECTORY/..:$PATH
 +              GIT_EXEC_PATH=$TEST_DIRECTORY/..
 +      else
 +              GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path)  ||
 +              error "Cannot run git from $GIT_TEST_INSTALLED."
 +              PATH=$GIT_TEST_INSTALLED:$TEST_DIRECTORY/..:$PATH
 +              GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
 +      fi
 +else
 +      make_symlink () {
 +              test -h "$2" &&
 +              test "$1" = "$(readlink "$2")" || {
 +                      # be super paranoid
 +                      if mkdir "$2".lock
 +                      then
 +                              rm -f "$2" &&
 +                              ln -s "$1" "$2" &&
 +                              rm -r "$2".lock
 +                      else
 +                              while test -d "$2".lock
 +                              do
 +                                      say "Waiting for lock on $2."
 +                                      sleep 1
 +                              done
 +                      fi
 +              }
 +      }
 +
 +      make_valgrind_symlink () {
 +              # handle only executables
 +              test -x "$1" || return
 +
 +              base=$(basename "$1")
 +              symlink_target=$TEST_DIRECTORY/../$base
 +              # do not override scripts
 +              if test -x "$symlink_target" &&
 +                  test ! -d "$symlink_target" &&
 +                  test "#!" != "$(head -c 2 < "$symlink_target")"
 +              then
 +                      symlink_target=../valgrind.sh
 +              fi
 +              case "$base" in
 +              *.sh|*.perl)
 +                      symlink_target=../unprocessed-script
 +              esac
 +              # create the link, or replace it if it is out of date
 +              make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
 +      }
 +
 +      # override all git executables in TEST_DIRECTORY/..
 +      GIT_VALGRIND=$TEST_DIRECTORY/valgrind
 +      mkdir -p "$GIT_VALGRIND"/bin
 +      for file in $TEST_DIRECTORY/../git* $TEST_DIRECTORY/../test-*
 +      do
 +              make_valgrind_symlink $file
 +      done
 +      OLDIFS=$IFS
 +      IFS=:
 +      for path in $PATH
 +      do
 +              ls "$path"/git-* 2> /dev/null |
 +              while read file
 +              do
 +                      make_valgrind_symlink "$file"
 +              done
 +      done
 +      IFS=$OLDIFS
 +      PATH=$GIT_VALGRIND/bin:$PATH
 +      GIT_EXEC_PATH=$GIT_VALGRIND/bin
 +      export GIT_VALGRIND
 +fi
  GIT_TEMPLATE_DIR=$(pwd)/../templates/blt
  unset GIT_CONFIG
  GIT_CONFIG_NOSYSTEM=1
@@@ -658,8 -520,7 +650,8 @@@ test_create_repo "$test
  # in subprocesses like git equals our $PWD (for pathname comparisons).
  cd -P "$test" || exit 1
  
 -this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$')
 +this_test=${0##*/}
 +this_test=${this_test%%-*}
  for skp in $GIT_SKIP_TESTS
  do
        to_skip=
                test_done
        esac
  done
 +
 +# Fix some commands on Windows
 +case $(uname -s) in
 +*MINGW*)
 +      # Windows has its own (incompatible) sort and find
 +      sort () {
 +              /usr/bin/sort "$@"
 +      }
 +      find () {
 +              /usr/bin/find "$@"
 +      }
 +      sum () {
 +              md5sum "$@"
 +      }
 +      # git sees Windows-style pwd
 +      pwd () {
 +              builtin pwd -W
 +      }
 +      # no POSIX permissions
 +      # backslashes in pathspec are converted to '/'
 +      # exec does not inherit the PID
 +      ;;
 +*)
 +      test_set_prereq POSIXPERM
 +      test_set_prereq BSLASHPSPEC
 +      test_set_prereq EXECKEEPSPID
 +      ;;
 +esac
 +
 +# test whether the filesystem supports symbolic links
 +ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS
 +rm -f y