Merge branch 'bc/hash-independent-tests-part-4'
authorJunio C Hamano <gitster@pobox.com>
Fri, 9 Aug 2019 17:13:14 +0000 (10:13 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 9 Aug 2019 17:13:14 +0000 (10:13 -0700)
Test fix.

* bc/hash-independent-tests-part-4:
t0000: reword comments for "local" test
t: decrease nesting in test_oid_to_path

1  2 
t/t0000-basic.sh
t/test-lib-functions.sh
diff --combined t/t0000-basic.sh
index e89438e619b010d8eb36bcfa54de8d49cd373180,60c6610ec0b82e123cd543dd7d3757197281706c..9ca0818cbe4c1fb7f7d4c4558f00c5dabc0ae778
@@@ -25,16 -25,14 +25,14 @@@ try_local_x () 
        echo "$x"
  }
  
- # This test is an experiment to check whether any Git users are using
- # Shells that don't support the "local" keyword. "local" is not
+ # Check whether the shell supports the "local" keyword. "local" is not
  # POSIX-standard, but it is very widely supported by POSIX-compliant
- # shells, and if it doesn't cause problems for people, we would like
- # to be able to use it in Git code.
+ # shells, and we rely on it within Git's test framework.
  #
- # For now, this is the only test that requires "local". If your shell
- # fails this test, you can ignore the failure, but please report the
- # problem to the Git mailing list <git@vger.kernel.org>, as it might
- # convince us to continue avoiding the use of "local".
+ # If your shell fails this test, the results of other tests may be
+ # unreliable. You may wish to report the problem to the Git mailing
+ # list <git@vger.kernel.org>, as it could cause us to reconsider
+ # relying on "local".
  test_expect_success 'verify that the running shell supports "local"' '
        x="notlocal" &&
        echo "local" >expected1 &&
@@@ -726,7 -724,7 +724,7 @@@ donthaveit=ye
  test_expect_success DONTHAVEIT 'unmet prerequisite causes test to be skipped' '
        donthaveit=no
  '
 -if test -z "$GIT_TEST_FAIL_PREREQS" -a $haveit$donthaveit != yesyes
 +if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $haveit$donthaveit != yesyes
  then
        say "bug in test framework: prerequisite tags do not work reliably"
        exit 1
@@@ -747,7 -745,7 +745,7 @@@ donthaveiteither=ye
  test_expect_success DONTHAVEIT,HAVEIT 'unmet prerequisites causes test to be skipped' '
        donthaveiteither=no
  '
 -if test -z "$GIT_TEST_FAIL_PREREQS" -a $haveit$donthaveit$donthaveiteither != yesyesyes
 +if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $haveit$donthaveit$donthaveiteither != yesyesyes
  then
        say "bug in test framework: multiple prerequisite tags do not work reliably"
        exit 1
@@@ -763,7 -761,7 +761,7 @@@ test_expect_success !LAZY_TRUE 'missin
        donthavetrue=no
  '
  
 -if test -z "$GIT_TEST_FAIL_PREREQS" -a "$havetrue$donthavetrue" != yesyes
 +if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a "$havetrue$donthavetrue" != yesyes
  then
        say 'bug in test framework: lazy prerequisites do not work'
        exit 1
@@@ -779,7 -777,7 +777,7 @@@ test_expect_success LAZY_FALSE 'missin
        havefalse=no
  '
  
 -if test -z "$GIT_TEST_FAIL_PREREQS" -a "$nothavefalse$havefalse" != yesyes
 +if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a "$nothavefalse$havefalse" != yesyes
  then
        say 'bug in test framework: negative lazy prerequisites do not work'
        exit 1
@@@ -790,7 -788,7 +788,7 @@@ test_expect_success 'tests clean up aft
        test_when_finished clean=yes
  '
  
 -if test -z "$GIT_TEST_FAIL_PREREQS" -a $clean != yes
 +if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $clean != yes
  then
        say "bug in test framework: basic cleanup command does not work reliably"
        exit 1
diff --combined t/test-lib-functions.sh
index 48bd3b467d3f32b7a8fda26a7ff04114afde5aa4,de58e8b502ac60c4ec9e79dbed12b050c45988fb..e0b3f28d3a96e1b937f4c31e0a3d2e8fb3e6fed5
@@@ -233,129 -233,6 +233,129 @@@ test_merge () 
        git tag "$1"
  }
  
 +# Efficiently create <nr> commits, each with a unique number (from 1 to <nr>
 +# by default) in the commit message.
 +#
 +# Usage: test_commit_bulk [options] <nr>
 +#   -C <dir>:
 +#     Run all git commands in directory <dir>
 +#   --ref=<n>:
 +#     ref on which to create commits (default: HEAD)
 +#   --start=<n>:
 +#     number commit messages from <n> (default: 1)
 +#   --message=<msg>:
 +#     use <msg> as the commit mesasge (default: "commit %s")
 +#   --filename=<fn>:
 +#     modify <fn> in each commit (default: %s.t)
 +#   --contents=<string>:
 +#     place <string> in each file (default: "content %s")
 +#   --id=<string>:
 +#     shorthand to use <string> and %s in message, filename, and contents
 +#
 +# The message, filename, and contents strings are evaluated by printf, with the
 +# first "%s" replaced by the current commit number. So you can do:
 +#
 +#   test_commit_bulk --filename=file --contents="modification %s"
 +#
 +# to have every commit touch the same file, but with unique content.
 +#
 +test_commit_bulk () {
 +      tmpfile=.bulk-commit.input
 +      indir=.
 +      ref=HEAD
 +      n=1
 +      message='commit %s'
 +      filename='%s.t'
 +      contents='content %s'
 +      while test $# -gt 0
 +      do
 +              case "$1" in
 +              -C)
 +                      indir=$2
 +                      shift
 +                      ;;
 +              --ref=*)
 +                      ref=${1#--*=}
 +                      ;;
 +              --start=*)
 +                      n=${1#--*=}
 +                      ;;
 +              --message=*)
 +                      message=${1#--*=}
 +                      ;;
 +              --filename=*)
 +                      filename=${1#--*=}
 +                      ;;
 +              --contents=*)
 +                      contents=${1#--*=}
 +                      ;;
 +              --id=*)
 +                      message="${1#--*=} %s"
 +                      filename="${1#--*=}-%s.t"
 +                      contents="${1#--*=} %s"
 +                      ;;
 +              -*)
 +                      BUG "invalid test_commit_bulk option: $1"
 +                      ;;
 +              *)
 +                      break
 +                      ;;
 +              esac
 +              shift
 +      done
 +      total=$1
 +
 +      add_from=
 +      if git -C "$indir" rev-parse --verify "$ref"
 +      then
 +              add_from=t
 +      fi
 +
 +      while test "$total" -gt 0
 +      do
 +              test_tick &&
 +              echo "commit $ref"
 +              printf 'author %s <%s> %s\n' \
 +                      "$GIT_AUTHOR_NAME" \
 +                      "$GIT_AUTHOR_EMAIL" \
 +                      "$GIT_AUTHOR_DATE"
 +              printf 'committer %s <%s> %s\n' \
 +                      "$GIT_COMMITTER_NAME" \
 +                      "$GIT_COMMITTER_EMAIL" \
 +                      "$GIT_COMMITTER_DATE"
 +              echo "data <<EOF"
 +              printf "$message\n" $n
 +              echo "EOF"
 +              if test -n "$add_from"
 +              then
 +                      echo "from $ref^0"
 +                      add_from=
 +              fi
 +              printf "M 644 inline $filename\n" $n
 +              echo "data <<EOF"
 +              printf "$contents\n" $n
 +              echo "EOF"
 +              echo
 +              n=$((n + 1))
 +              total=$((total - 1))
 +      done >"$tmpfile"
 +
 +      git -C "$indir" \
 +          -c fastimport.unpacklimit=0 \
 +          fast-import <"$tmpfile" || return 1
 +
 +      # This will be left in place on failure, which may aid debugging.
 +      rm -f "$tmpfile"
 +
 +      # If we updated HEAD, then be nice and update the index and working
 +      # tree, too.
 +      if test "$ref" = "HEAD"
 +      then
 +              git -C "$indir" checkout -f HEAD || return 1
 +      fi
 +
 +}
 +
  # 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.
@@@ -432,7 -309,7 +432,7 @@@ test_unset_prereq () 
  }
  
  test_set_prereq () {
 -      if test -n "$GIT_TEST_FAIL_PREREQS"
 +      if test -n "$GIT_TEST_FAIL_PREREQS_INTERNAL"
        then
                case "$1" in
                # The "!" case is handled below with
@@@ -1031,21 -908,6 +1031,21 @@@ test_cmp_rev () 
        fi
  }
  
 +# Compare paths respecting core.ignoreCase
 +test_cmp_fspath () {
 +      if test "x$1" = "x$2"
 +      then
 +              return 0
 +      fi
 +
 +      if test true != "$(git config --get --type=bool core.ignorecase)"
 +      then
 +              return 1
 +      fi
 +
 +      test "x$(echo "$1" | tr A-Z a-z)" =  "x$(echo "$2" | tr A-Z a-z)"
 +}
 +
  # Print a sequence of integers in increasing order, either with
  # two arguments (start and end):
  #
@@@ -1173,20 -1035,62 +1173,20 @@@ perl () 
        command "$PERL_PATH" "$@" 2>&7
  } 7>&2 2>&4
  
 -# Is the value one of the various ways to spell a boolean true/false?
 -test_normalize_bool () {
 -      git -c magic.variable="$1" config --bool magic.variable 2>/dev/null
 -}
 -
 -# Given a variable $1, normalize the value of it to one of "true",
 -# "false", or "auto" and store the result to it.
 -#
 -#     test_tristate GIT_TEST_HTTPD
 -#
 -# A variable set to an empty string is set to 'false'.
 -# A variable set to 'false' or 'auto' keeps its value.
 -# Anything else is set to 'true'.
 -# An unset variable defaults to 'auto'.
 -#
 -# The last rule is to allow people to set the variable to an empty
 -# string and export it to decline testing the particular feature
 -# for versions both before and after this change.  We used to treat
 -# both unset and empty variable as a signal for "do not test" and
 -# took any non-empty string as "please test".
 -
 -test_tristate () {
 -      if eval "test x\"\${$1+isset}\" = xisset"
 -      then
 -              # explicitly set
 -              eval "
 -                      case \"\$$1\" in
 -                      '')     $1=false ;;
 -                      auto)   ;;
 -                      *)      $1=\$(test_normalize_bool \$$1 || echo true) ;;
 -                      esac
 -              "
 -      else
 -              eval "$1=auto"
 -      fi
 -}
 -
  # Exit the test suite, either by skipping all remaining tests or by
 -# exiting with an error. If "$1" is "auto", we then we assume we were
 -# opportunistically trying to set up some tests and we skip. If it is
 -# "true", then we report a failure.
 +# exiting with an error. If our prerequisite variable $1 falls back
 +# on a default assume we were opportunistically trying to set up some
 +# tests and we skip. If it is explicitly "true", then we report a failure.
  #
  # The error/skip message should be given by $2.
  #
  test_skip_or_die () {
 -      case "$1" in
 -      auto)
 +      if ! git env--helper --type=bool --default=false --exit-code $1
 +      then
                skip_all=$2
                test_done
 -              ;;
 -      true)
 -              error "$2"
 -              ;;
 -      *)
 -              error "BUG: test tristate is '$1' (real error: $2)"
 -      esac
 +      fi
 +      error "$2"
  }
  
  # The following mingw_* functions obey POSIX shell syntax, but are actually
@@@ -1433,7 -1337,8 +1433,8 @@@ test_oid () 
  # Insert a slash into an object ID so it can be used to reference a location
  # under ".git/objects".  For example, "deadbeef..." becomes "de/adbeef..".
  test_oid_to_path () {
-       echo "${1%${1#??}}/${1#??}"
+       local basename=${1#??}
+       echo "${1%$basename}/$basename"
  }
  
  # Choose a port number based on the test script's number and store it in