#!/usr/bin/env bash # # A more capable sbt runner, coincidentally also called sbt. # Author: Paul Phillips # https://github.com/paulp/sbt-extras # # Generated from http://www.opensource.org/licenses/bsd-license.php # Copyright (c) 2011, Paul Phillips. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the author nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. set -o pipefail declare -r sbt_release_version="1.12.11" declare -r sbt_unreleased_version="1.12.11" declare -r latest_213="2.13.18" declare -r latest_212="2.12.21" declare -r latest_211="2.11.12" declare -r latest_210="2.10.7" declare -r latest_29="2.9.3" declare -r latest_28="2.8.2" declare -r buildProps="project/build.properties" declare -r sbt_launch_ivy_release_repo="https://repo.typesafe.com/typesafe/ivy-releases" declare -r sbt_launch_ivy_snapshot_repo="https://repo.scala-sbt.org/scalasbt/ivy-snapshots" declare -r sbt_launch_mvn_release_repo="https://repo1.maven.org/maven2" declare -r sbt_launch_mvn_snapshot_repo="https://repo.scala-sbt.org/scalasbt/maven-snapshots" declare -r default_jvm_opts_common="-Xms512m -Xss2m -XX:MaxInlineLevel=18" declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy -Dsbt.coursier.home=project/.coursier" declare sbt_jar sbt_dir sbt_create sbt_version sbt_script sbt_new declare sbt_explicit_version declare verbose noshare batch trace_level declare java_cmd="java" declare sbt_launch_dir="$HOME/.sbt/launchers" declare sbt_launch_repo # pull -J and -D options to give to java. declare -a java_args scalac_args sbt_commands residual_args # args to jvm/sbt via files or environment variables declare -a extra_jvm_opts extra_sbt_opts echoerr() { echo >&2 "$@"; } vlog() { [[ -n "$verbose" ]] && echoerr "$@"; } die() { echo "Aborting: $*" exit 1 } setTrapExit() { # save stty and trap exit, to ensure echo is re-enabled if we are interrupted. SBT_STTY="$(stty -g 2>/dev/null)" export SBT_STTY # restore stty settings (echo in particular) onSbtRunnerExit() { [ -t 0 ] || return vlog "" vlog "restoring stty: $SBT_STTY" stty "$SBT_STTY" } vlog "saving stty: $SBT_STTY" trap onSbtRunnerExit EXIT } # this seems to cover the bases on OSX, and someone will # have to tell me about the others. get_script_path() { local path="$1" [[ -L "$path" ]] || { echo "$path" return } local -r target="$(readlink "$path")" if [[ "${target:0:1}" == "/" ]]; then echo "$target" else echo "${path%/*}/$target" fi } script_path="$(get_script_path "${BASH_SOURCE[0]}")" declare -r script_path script_name="${script_path##*/}" declare -r script_name init_default_option_file() { local overriding_var="${!1}" local default_file="$2" if [[ ! -r "$default_file" && "$overriding_var" =~ ^@(.*)$ ]]; then local envvar_file="${BASH_REMATCH[1]}" if [[ -r "$envvar_file" ]]; then default_file="$envvar_file" fi fi echo "$default_file" } sbt_opts_file="$(init_default_option_file SBT_OPTS .sbtopts)" sbtx_opts_file="$(init_default_option_file SBTX_OPTS .sbtxopts)" jvm_opts_file="$(init_default_option_file JVM_OPTS .jvmopts)" build_props_sbt() { [[ -r "$buildProps" ]] && grep '^sbt\.version' "$buildProps" | tr '=\r' ' ' | awk '{ print $2; }' } set_sbt_version() { sbt_version="${sbt_explicit_version:-$(build_props_sbt)}" [[ -n "$sbt_version" ]] || sbt_version=$sbt_release_version export sbt_version } url_base() { local version="$1" case "$version" in 0.7.*) echo "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/simple-build-tool" ;; 0.10.*) echo "$sbt_launch_ivy_release_repo" ;; 0.11.[12]) echo "$sbt_launch_ivy_release_repo" ;; 0.*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]) # ie "*-yyyymmdd-hhMMss" echo "$sbt_launch_ivy_snapshot_repo" ;; 0.*) echo "$sbt_launch_ivy_release_repo" ;; *-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]T[0-9][0-9][0-9][0-9][0-9][0-9]) # ie "*-yyyymmddThhMMss" echo "$sbt_launch_mvn_snapshot_repo" ;; *) echo "$sbt_launch_mvn_release_repo" ;; esac } make_url() { local version="$1" local base="${sbt_launch_repo:-$(url_base "$version")}" case "$version" in 0.7.*) echo "$base/sbt-launch-0.7.7.jar" ;; 0.10.*) echo "$base/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; 0.11.[12]) echo "$base/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; 0.*) echo "$base/org.scala-sbt/sbt-launch/$version/sbt-launch.jar" ;; *) echo "$base/org/scala-sbt/sbt-launch/$version/sbt-launch-${version}.jar" ;; esac } addJava() { vlog "[addJava] arg = '$1'" java_args+=("$1") } addSbt() { vlog "[addSbt] arg = '$1'" sbt_commands+=("$1") } addScalac() { vlog "[addScalac] arg = '$1'" scalac_args+=("$1") } addResidual() { vlog "[residual] arg = '$1'" residual_args+=("$1") } addResolver() { addSbt "set resolvers += $1"; } addDebugger() { addJava "-Xdebug" && addJava "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1"; } setThisBuild() { vlog "[addBuild] args = '$*'" local key="$1" && shift addSbt "set $key in ThisBuild := $*" } setScalaVersion() { [[ "$1" == *"-SNAPSHOT" ]] && addResolver 'Resolver.sonatypeRepo("snapshots")' addSbt "++ $1" } setJavaHome() { java_cmd="$1/bin/java" setThisBuild javaHome "_root_.scala.Some(file(\"$1\"))" export JAVA_HOME="$1" export JDK_HOME="$1" export PATH="$JAVA_HOME/bin:$PATH" } getJavaVersion() { local -r str=$("$1" -version 2>&1 | grep -E -e '(java|openjdk) version' | awk '{ print $3 }' | tr -d '"') # java -version on java8 says 1.8.x # but on 9 and 10 it's 9.x.y and 10.x.y. if [[ "$str" =~ ^1\.([0-9]+)(\..*)?$ ]]; then echo "${BASH_REMATCH[1]}" # Fixes https://github.com/dwijnand/sbt-extras/issues/326 elif [[ "$str" =~ ^([0-9]+)(\..*)?(-ea)?$ ]]; then echo "${BASH_REMATCH[1]}" elif [[ -n "$str" ]]; then echoerr "Can't parse java version from: $str" fi } checkJava() { # Warn if there is a Java version mismatch between PATH and JAVA_HOME/JDK_HOME [[ -n "$JAVA_HOME" && -e "$JAVA_HOME/bin/java" ]] && java="$JAVA_HOME/bin/java" [[ -n "$JDK_HOME" && -e