diff --git a/citest/test.sh b/citest/test.sh index 2b08afcae..4c8450464 100755 --- a/citest/test.sh +++ b/citest/test.sh @@ -1,12 +1,12 @@ #!/bin/bash ## https://github.com/travis-ci/travis-ci/issues/8408 -export _JAVA_OPTIONS= +unset _JAVA_OPTIONS java -version ## end of Java switching -mkdir freshly-baked +mkdir -p freshly-baked unzip -qo ../target/universal/sbt.zip -d ./freshly-baked export SBT_OPTS=-Dfile.encoding=UTF-8 @@ -16,3 +16,16 @@ export SBT_OPTS=-Dfile.encoding=UTF-8 export SBT_OPTS="-Dfile.encoding=UTF-8 -Xms2048M -Xmx2048M -Xss2M -XX:MaxPermSize=512M" ./freshly-baked/sbt/bin/sbt about run + +env HOME=./target/home1 ./freshly-baked/sbt/bin/sbt about +test -d ./target/home1/.sbt/preloaded || echo "expected to find preloaded in ./target/home1/.sbt" + +env HOME=./target/home2 ./freshly-baked/sbt/bin/sbt -sbt-dir ./target/home2/alternate-sbt about +test -d ./target/home2/alternate-sbt/preloaded || echo "expected to find preloaded in ./target/home2/alternate-sbt" + +env HOME=./target/home3 ./freshly-baked/sbt/bin/sbt -J-Dsbt.preloaded=./target/home3/alternate-preloaded about +test -d ./target/home3/alternate-preloaded || echo "expected to find preloaded in ./target/home3/alternate-preloaded" + +env HOME=./target/home4 ./freshly-baked/sbt/bin/sbt -J-Dsbt.global.base=./target/home4/global-base about +test -d ./target/home4/global-base || echo "expected to find preloaded in ./target/home4/global-base" + diff --git a/src/universal/bin/sbt-launch-lib.bash b/src/universal/bin/sbt-launch-lib.bash index e7155a148..e2905182c 100755 --- a/src/universal/bin/sbt-launch-lib.bash +++ b/src/universal/bin/sbt-launch-lib.bash @@ -213,17 +213,54 @@ process_args () { vlog "[process_args] java_version = '$java_version'" } +# Extracts the preloaded directory from either -Dsbt.preloaded or -Dsbt.global.base +# properties by looking at: +# - _JAVA_OPTIONS environment variable, +# - SBT_OPTS environment variable, +# - JAVA_OPTS environment variable and +# - properties set by command-line options +# in that order. The last one will be chosen such that `sbt.preloaded` is +# always preferred over `sbt.global.base`. +getPreloaded() { + local -a _java_options_array + local -a sbt_opts_array + local -a java_opts_array + read -a _java_options_array <<< "$_JAVA_OPTIONS" + read -a sbt_opts_array <<< "$SBT_OPTS" + read -a java_opts_array <<< "$JAVA_OPTS" + + local args_to_check=( + "${_java_options_array[@]}" + "${sbt_opts_array[@]}" + "${java_opts_array[@]}" + "${java_args[@]}") + local via_global_base="$HOME/.sbt/preloaded" + local via_explicit="" + + for opt in "${args_to_check[@]}"; do + if [[ "$opt" == -Dsbt.preloaded=* ]]; then + via_explicit="${opt#-Dsbt.preloaded=}" + elif [[ "$opt" == -Dsbt.global.base=* ]]; then + via_global_base="${opt#-Dsbt.global.base=}/preloaded" + fi + done + + echo "${via_explicit:-${via_global_base}}" +} + syncPreloaded() { + local source_preloaded="$sbt_home/lib/local-preloaded" + local target_preloaded="$(getPreloaded)" if [[ "$init_sbt_version" == "" ]]; then # FIXME: better $init_sbt_version detection - init_sbt_version="$(ls -1 "$sbt_home/lib/local-preloaded/org.scala-sbt/sbt/")" + init_sbt_version="$(ls -1 "$source_preloaded/org.scala-sbt/sbt/")" fi - [[ -f "$HOME/.sbt/preloaded/org.scala-sbt/sbt/$init_sbt_version/jars/sbt.jar" ]] || { + [[ -f "$target_preloaded/org.scala-sbt/sbt/$init_sbt_version/jars/sbt.jar" ]] || { # lib/local-preloaded exists (This is optional) - [[ -d "$sbt_home/lib/local-preloaded/" ]] && { + [[ -d "$source_preloaded" ]] && { command -v rsync >/dev/null 2>&1 && { - mkdir -p "$HOME/.sbt/preloaded" - rsync -a --ignore-existing "$sbt_home/lib/local-preloaded/" "$HOME/.sbt/preloaded" + mkdir -p "$target_preloaded" + rsync -a --ignore-existing "$source_preloaded" "$target_preloaded" } } } @@ -277,6 +314,12 @@ copyRt() { } run() { + # process the combined args, then reset "$@" to the residuals + process_args "$@" + set -- "${residual_args[@]}" + argumentCount=$# + + # Copy preloaded repo to user's preloaded directory syncPreloaded # no jar? download it. @@ -286,11 +329,6 @@ run() { exit 1 } - # process the combined args, then reset "$@" to the residuals - process_args "$@" - set -- "${residual_args[@]}" - argumentCount=$# - # TODO - java check should be configurable... checkJava "6"