diff --git a/pom.xml b/pom.xml
index 94e6ed4270..a4f86a0f5c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -191,7 +191,7 @@
maven-release-plugin
2.1
-
+
@@ -290,6 +290,51 @@
+
+ gen-scalatra
+
+
+ template
+ scalatra
+
+
+
+ compile exec:java
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.3.2
+
+
+
+ java
+
+
+
+
+ java
+ com.wordnik.swagger.codegen.Codegen
+
+ -l
+ scalatra
+ -i
+ ${swagger-spec}
+ -t
+ ${swagger-template}
+ -o
+ ${swagger-out}
+
+
+
+
+
+
+ samples/yaml/echo.yaml
+ src/main/resources/scalatra
+ generated-code/scalatra
+
+
target/site
@@ -342,7 +387,6 @@
${swagger-core-version}
compile
-
com.samskivert
jmustache
@@ -408,7 +452,6 @@
2.1.4
2.3
1.2
-
4.8.1
1.0.0
2.4
diff --git a/samples/yaml/echo.yaml b/samples/yaml/echo.yaml
new file mode 100644
index 0000000000..ce60293f6e
--- /dev/null
+++ b/samples/yaml/echo.yaml
@@ -0,0 +1,51 @@
+swagger: 2
+info:
+ title: Echo API
+ description: Simple Rest Echo
+ version: "1.0.0"
+host: "localhost:8002"
+schemes:
+ - http
+basePath: /v1
+produces:
+ - application/json
+paths:
+ /echo:
+ get:
+ description: "Returns the 'message' to the caller"
+ operationId: "echo"
+ parameters:
+ #- name: X-header-param
+ - name: headerParam
+ in: header
+ type: string
+ required: false
+ - name: message
+ in: query
+ type: string
+ required: true
+ responses:
+ 200:
+ description: "Success"
+ schema:
+ $ref: EchoResponse
+ default:
+ description: "Error"
+ schema:
+ $ref: Error
+definitions:
+ EchoResponse:
+ required:
+ - message
+ properties:
+ message:
+ type: string
+ Error:
+ properties:
+ code:
+ type: integer
+ format: int32
+ message:
+ type: string
+ fields:
+ type: string
diff --git a/src/main/resources/scalatra/JettyMain.scala b/src/main/resources/scalatra/JettyMain.scala
index ec73dd2281..e25f16ba39 100644
--- a/src/main/resources/scalatra/JettyMain.scala
+++ b/src/main/resources/scalatra/JettyMain.scala
@@ -1,32 +1,43 @@
-import org.eclipse.jetty.server.nio.SelectChannelConnector
-import org.eclipse.jetty.server.{ Server }
-import org.eclipse.jetty.server.handler.ContextHandlerCollection
+import org.eclipse.jetty.server._
import org.eclipse.jetty.webapp.WebAppContext
-import org.eclipse.jetty.servlet.{ DefaultServlet, ServletContextHandler, ServletHolder }
+import org.scalatra.servlet.ScalatraListener
object JettyMain {
+
+ object conf {
+ val port = sys.env.get("PORT") map (_.toInt) getOrElse (8080)
+ val stopTimeout = sys.env.get("STOP_TIMEOUT") map (_.toInt) getOrElse (5000)
+ val connectorIdleTimeout = sys.env.get("CONNECTOR_IDLE_TIMEOUT") map (_.toInt) getOrElse (90000)
+ val webapp = sys.env.get("PUBLIC") getOrElse "webapp"
+ val contextPath = sys.env.get("CONTEXT_PATH") getOrElse "/"
+ }
+
def main(args: Array[String]) = {
val server: Server = new Server
println("starting jetty")
- server setGracefulShutdown 5000
- server setSendServerVersion false
- server setSendDateHeader true
+ server setStopTimeout conf.stopTimeout
+ //server setDumpAfterStart true
server setStopAtShutdown true
- val connector = new SelectChannelConnector
- connector setPort sys.env.get("PORT").map(_.toInt).getOrElse(8080)
- connector setMaxIdleTime 90000
+ val httpConfig = new HttpConfiguration()
+ httpConfig setSendDateHeader true
+ httpConfig setSendServerVersion false
+
+ val connector = new NetworkTrafficServerConnector(server, new HttpConnectionFactory(httpConfig))
+ connector setPort conf.port
+ connector setSoLingerTime 0
+ connector setIdleTimeout conf.connectorIdleTimeout
server addConnector connector
- val webapp = sys.env.get("PUBLIC") getOrElse "webapp"
+ val webapp = conf.webapp
val webApp = new WebAppContext
- webApp setContextPath "/"
- webApp setResourceBase webapp
- webApp setDescriptor (webapp+"/WEB-INF/web.xml");
+ webApp setContextPath conf.contextPath
+ webApp setResourceBase conf.webapp
+ webApp setEventListeners Array(new ScalatraListener)
server setHandler webApp
server.start()
}
-}
\ No newline at end of file
+}
diff --git a/src/main/resources/scalatra/build.sbt b/src/main/resources/scalatra/build.sbt
index 9f04adc46b..afe84c2c7f 100644
--- a/src/main/resources/scalatra/build.sbt
+++ b/src/main/resources/scalatra/build.sbt
@@ -18,24 +18,27 @@ name := "scalatra-sample"
version := "0.1.0-SNAPSHOT"
-scalaVersion := "2.10.0"
+scalaVersion := "2.11.2"
+
+scalacOptions += "-language:postfixOps"
libraryDependencies ++= Seq(
- "org.scalatest" %% "scalatest" % "2.0" % "test",
+ "org.scalatest" %% "scalatest" % "2.2.1" % "test",
"org.scalatra" %% "scalatra" % "2.3.0.RC3",
"org.scalatra" %% "scalatra-scalate" % "2.3.0.RC3",
"org.scalatra" %% "scalatra-json" % "2.3.0.RC3",
"org.scalatra" %% "scalatra-swagger" % "2.3.0.RC3",
"org.scalatra" %% "scalatra-swagger-ext" % "2.3.0.RC3",
"org.scalatra" %% "scalatra-slf4j" % "2.3.0.RC3",
- "org.json4s" %% "json4s-jackson" % "3.1.0",
- "org.json4s" %% "json4s-ext" % "3.1.0",
+ "org.json4s" %% "json4s-jackson" % "3.2.10",
+ "org.json4s" %% "json4s-ext" % "3.2.10",
"commons-codec" % "commons-codec" % "1.7",
- "net.databinder.dispatch" %% "dispatch-core" % "0.9.5",
- "net.databinder.dispatch" %% "json4s-jackson" % "0.9.5",
- "com.typesafe.akka" %% "akka-actor" % "2.1.0",
- "org.eclipse.jetty" % "jetty-server" % "8.1.7.v20120910" % "container;provided",
- "org.eclipse.jetty" % "jetty-webapp" % "8.1.7.v20120910" % "container;provided",
+ "net.databinder.dispatch" %% "dispatch-core" % "0.11.2",
+ //"net.databinder.dispatch" %% "json4s-jackson" % "0.11.2",
+ "net.databinder.dispatch" %% "dispatch-json4s-jackson" % "0.11.2",
+ "com.typesafe.akka" %% "akka-actor" % "2.3.6",
+ "org.eclipse.jetty" % "jetty-server" % "9.2.3.v20140905" % "container;compile;test",
+ "org.eclipse.jetty" % "jetty-webapp" % "9.2.3.v20140905" % "container;compile;test",
"org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;compile;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar"))
)
@@ -51,9 +54,11 @@ ivyXML :=
-mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
- {
+mergeStrategy in assembly <<= (mergeStrategy in assembly) {
+ (old) => {
case "about.html" => MergeStrategy.discard
case x => old(x)
}
}
+
+net.virtualvoid.sbt.graph.Plugin.graphSettings
diff --git a/src/main/resources/scalatra/project/build.properties b/src/main/resources/scalatra/project/build.properties
index 8cbb5226c4..be6c454fba 100644
--- a/src/main/resources/scalatra/project/build.properties
+++ b/src/main/resources/scalatra/project/build.properties
@@ -1 +1 @@
-sbt.version=0.13.0
\ No newline at end of file
+sbt.version=0.13.5
diff --git a/src/main/resources/scalatra/project/plugins.sbt b/src/main/resources/scalatra/project/plugins.sbt
index 94de8e5414..7358abbbbc 100644
--- a/src/main/resources/scalatra/project/plugins.sbt
+++ b/src/main/resources/scalatra/project/plugins.sbt
@@ -1,7 +1,9 @@
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.1")
-addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.6.4")
+addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.7.5")
-addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.6.0")
+addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.9.0")
-addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.2.1")
+addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0")
+
+addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4")
diff --git a/src/main/resources/scalatra/sbt b/src/main/resources/scalatra/sbt
index 491debf4fb..08e5882121 100755
--- a/src/main/resources/scalatra/sbt
+++ b/src/main/resources/scalatra/sbt
@@ -4,80 +4,58 @@
# Author: Paul Phillips
# todo - make this dynamic
-declare -r sbt_release_version=0.12.4
-declare -r sbt_beta_version=0.13.0-RC4
-declare -r sbt_snapshot_version=0.13.0-SNAPSHOT
+declare -r sbt_release_version="0.13.6"
+declare -r sbt_unreleased_version="0.13.6"
+declare -r buildProps="project/build.properties"
-declare sbt_jar sbt_dir sbt_create sbt_snapshot sbt_launch_dir
-declare scala_version java_home sbt_explicit_version
-declare verbose debug quiet noshare batch trace_level log_level
-declare sbt_saved_stty
+declare sbt_jar sbt_dir sbt_create sbt_version
+declare scala_version sbt_explicit_version
+declare verbose noshare batch trace_level log_level
+declare sbt_saved_stty debugUs
-echoerr () { [[ -z $quiet ]] && echo "$@" >&2; }
-vlog () { [[ -n "$verbose$debug" ]] && echoerr "$@"; }
-dlog () { [[ -n $debug ]] && echoerr "$@"; }
-
-# we'd like these set before we get around to properly processing arguments
-for arg in "$@"; do
- case $arg in
- -q|-quiet) quiet=true ;;
- -d|-debug) debug=true ;;
- -v|-verbose) verbose=true ;;
- *) ;;
- esac
-done
+echoerr () { echo >&2 "$@"; }
+vlog () { [[ -n "$verbose" ]] && echoerr "$@"; }
+# spaces are possible, e.g. sbt.version = 0.13.0
build_props_sbt () {
- if [[ -r project/build.properties ]]; then
- versionLine=$(grep ^sbt.version project/build.properties | tr -d '\r')
- versionString=${versionLine##sbt.version=}
- echo "$versionString"
- fi
+ [[ -r "$buildProps" ]] && \
+ grep '^sbt\.version' "$buildProps" | tr '=' ' ' | awk '{ print $2; }'
}
update_build_props_sbt () {
local ver="$1"
- local old=$(build_props_sbt)
+ local old="$(build_props_sbt)"
- if [[ $ver == $old ]]; then
- return
- elif [[ -r project/build.properties ]]; then
- perl -pi -e "s/^sbt\.version=.*\$/sbt.version=${ver}/" project/build.properties
- grep -q '^sbt.version=' project/build.properties || echo "sbt.version=${ver}" >> project/build.properties
+ [[ -r "$buildProps" ]] && [[ "$ver" != "$old" ]] && {
+ perl -pi -e "s/^sbt\.version\b.*\$/sbt.version=${ver}/" "$buildProps"
+ grep -q '^sbt.version[ =]' "$buildProps" || printf "\nsbt.version=%s\n" "$ver" >> "$buildProps"
- echoerr !!!
- echoerr !!! Updated file project/build.properties setting sbt.version to: $ver
- echoerr !!! Previous value was: $old
- echoerr !!!
- fi
+ vlog "!!!"
+ vlog "!!! Updated file $buildProps setting sbt.version to: $ver"
+ vlog "!!! Previous value was: $old"
+ vlog "!!!"
+ }
}
-sbt_version () {
- if [[ -n $sbt_explicit_version ]]; then
- echo $sbt_explicit_version
- else
- local v=$(build_props_sbt)
- if [[ -n $v ]]; then
- echo $v
- else
- echo $sbt_release_version
- fi
- fi
+set_sbt_version () {
+ sbt_version="${sbt_explicit_version:-$(build_props_sbt)}"
+ [[ -n "$sbt_version" ]] || sbt_version=$sbt_release_version
+ export sbt_version
}
# restore stty settings (echo in particular)
onSbtRunnerExit() {
- [[ -n $sbt_saved_stty ]] || return
- dlog ""
- dlog "restoring stty: $sbt_saved_stty"
- stty $sbt_saved_stty
+ [[ -n "$sbt_saved_stty" ]] || return
+ vlog ""
+ vlog "restoring stty: $sbt_saved_stty"
+ stty "$sbt_saved_stty"
unset sbt_saved_stty
}
# save stty and trap exit, to ensure echo is reenabled if we are interrupted.
trap onSbtRunnerExit EXIT
-sbt_saved_stty=$(stty -g 2>/dev/null)
-dlog "Saved stty: $sbt_saved_stty"
+sbt_saved_stty="$(stty -g 2>/dev/null)"
+vlog "Saved stty: $sbt_saved_stty"
# this seems to cover the bases on OSX, and someone will
# have to tell me about the others.
@@ -85,11 +63,11 @@ get_script_path () {
local path="$1"
[[ -L "$path" ]] || { echo "$path" ; return; }
- local target=$(readlink "$path")
+ local target="$(readlink "$path")"
if [[ "${target:0:1}" == "/" ]]; then
echo "$target"
else
- echo "$(dirname $path)/$target"
+ echo "${path%/*}/$target"
fi
}
@@ -99,45 +77,45 @@ die() {
}
make_url () {
- groupid="$1"
- category="$2"
- version="$3"
+ version="$1"
- echo "http://typesafe.artifactoryonline.com/typesafe/ivy-$category/$groupid/sbt-launch/$version/sbt-launch.jar"
-}
-
-readarr () {
- while read ; do
- eval "$1+=(\"$REPLY\")"
- done
+ case "$version" in
+ 0.7.*) echo "http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar" ;;
+ 0.10.* ) echo "$sbt_launch_repo/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;;
+ 0.11.[12]) echo "$sbt_launch_repo/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;;
+ *) echo "$sbt_launch_repo/org.scala-sbt/sbt-launch/$version/sbt-launch.jar" ;;
+ esac
}
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
+ 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
+ echo "$default_file"
}
-declare -r default_jvm_opts="-Dfile.encoding=UTF8 -XX:MaxPermSize=256m -Xms512m -Xmx1g -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC"
+declare -r cms_opts="-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC"
+declare -r jit_opts="-XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation"
+declare -r default_jvm_opts_common="-Xms512m -Xmx1536m -Xss2m $jit_opts $cms_opts"
declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy"
declare -r latest_28="2.8.2"
declare -r latest_29="2.9.3"
-declare -r latest_210="2.10.0"
+declare -r latest_210="2.10.4"
+declare -r latest_211="2.11.2"
-declare -r script_path=$(get_script_path "$BASH_SOURCE")
-declare -r script_dir="$(dirname $script_path)"
-declare -r script_name="$(basename $script_path)"
+declare -r script_path="$(get_script_path "$BASH_SOURCE")"
+declare -r script_name="${script_path##*/}"
# some non-read-onlies set with defaults
-declare java_cmd=java
-declare sbt_opts_file=$(init_default_option_file SBT_OPTS .sbtopts)
-declare jvm_opts_file=$(init_default_option_file JVM_OPTS .jvmopts)
+declare java_cmd="java"
+declare sbt_opts_file="$(init_default_option_file SBT_OPTS .sbtopts)"
+declare jvm_opts_file="$(init_default_option_file JVM_OPTS .jvmopts)"
+declare sbt_launch_repo="http://typesafe.artifactoryonline.com/typesafe/ivy-releases"
# pull -J and -D options to give to java.
declare -a residual_args
@@ -154,104 +132,68 @@ declare -a extra_jvm_opts extra_sbt_opts
# directory to store sbt launchers
declare sbt_launch_dir="$HOME/.sbt/launchers"
[[ -d "$sbt_launch_dir" ]] || mkdir -p "$sbt_launch_dir"
-[[ -w "$sbt_launch_dir" ]] || sbt_launch_dir="$(mktemp -d -t sbt_extras_launchers)"
+[[ -w "$sbt_launch_dir" ]] || sbt_launch_dir="$(mktemp -d -t sbt_extras_launchers.XXXXXX)"
+
+java_version () {
+ local version=$("$java_cmd" -version 2>&1 | grep -e 'java version' | awk '{ print $3 }' | tr -d \")
+ vlog "Detected Java version: $version"
+ echo "${version:2:1}"
+}
+
+# MaxPermSize critical on pre-8 jvms but incurs noisy warning on 8+
+default_jvm_opts () {
+ local v="$(java_version)"
+ if [[ $v -ge 8 ]]; then
+ echo "$default_jvm_opts_common"
+ else
+ echo "-XX:MaxPermSize=384m $default_jvm_opts_common"
+ fi
+}
build_props_scala () {
- if [[ -r project/build.properties ]]; then
- versionLine=$(grep ^build.scala.versions project/build.properties)
- versionString=${versionLine##build.scala.versions=}
- echo ${versionString%% .*}
+ if [[ -r "$buildProps" ]]; then
+ versionLine="$(grep '^build.scala.versions' "$buildProps")"
+ versionString="${versionLine##build.scala.versions=}"
+ echo "${versionString%% .*}"
fi
}
execRunner () {
# print the arguments one to a line, quoting any containing spaces
- [[ $verbose || $debug ]] && echo "# Executing command line:" && {
+ vlog "# Executing command line:" && {
for arg; do
if [[ -n "$arg" ]]; then
if printf "%s\n" "$arg" | grep -q ' '; then
- printf "\"%s\"\n" "$arg"
+ printf >&2 "\"%s\"\n" "$arg"
else
- printf "%s\n" "$arg"
+ printf >&2 "%s\n" "$arg"
fi
fi
done
- echo ""
+ vlog ""
}
- if [[ -n $batch ]]; then
- # the only effective way I've found to avoid sbt hanging when backgrounded.
- exec 0<&-
- ( "$@" & )
- # I'm sure there's some way to get our hands on the pid and wait for it
- # but it exceeds my present level of ambition.
- else
- { "$@"; }
- fi
-}
-
-sbt_groupid () {
- case $(sbt_version) in
- 0.7.*) echo org.scala-tools.sbt ;;
- 0.10.*) echo org.scala-tools.sbt ;;
- 0.11.[12]) echo org.scala-tools.sbt ;;
- *) echo org.scala-sbt ;;
- esac
-}
-
-sbt_artifactory_list () {
- local version0=$(sbt_version)
- local version=${version0%-SNAPSHOT}
- local url="http://typesafe.artifactoryonline.com/typesafe/ivy-snapshots/$(sbt_groupid)/sbt-launch/"
- dlog "Looking for snapshot list at: $url "
-
- curl -s --list-only "$url" | \
- grep -F $version | \
- perl -e 'print reverse <>' | \
- perl -pe 's#^/dev/null
- dlog "curl returned: $?"
- echo "$url"
- return
- done
+ [[ -n "$batch" ]] && exec /dev/null; then
curl --fail --silent "$url" --output "$jar"
elif which wget >/dev/null; then
@@ -261,8 +203,8 @@ download_url () {
}
acquire_sbt_jar () {
- sbt_url="$(jar_url)"
- sbt_jar="$(jar_file $(sbt_version))"
+ sbt_url="$(jar_url "$sbt_version")"
+ sbt_jar="$(jar_file "$sbt_version")"
[[ -r "$sbt_jar" ]] || download_url "$sbt_url" "$sbt_jar"
}
@@ -271,11 +213,23 @@ usage () {
cat < display stack traces with a max of frames (default: -1, traces suppressed)
+ -debug-inc enable debugging log for the incremental compiler
-no-colors disable ANSI color codes
-sbt-create start sbt even if current directory contains no sbt project
-sbt-dir path to global settings/plugins directory (default: ~/.sbt/)
@@ -287,19 +241,19 @@ Usage: $script_name [options]
-batch Disable interactive mode
-prompt Set the sbt prompt; in expr, 's' is the State and 'e' is Extracted
- # sbt version (default: from project/build.properties if present, else latest release)
- !!! The only way to accomplish this pre-0.12.0 if there is a build.properties file which
- !!! contains an sbt.version property is to update the file on disk. That's what this does.
+ # sbt version (default: sbt.version from $buildProps if present, otherwise $sbt_release_version)
+ -sbt-force-latest force the use of the latest release of sbt: $sbt_release_version
-sbt-version use the specified version of sbt (default: $sbt_release_version)
+ -sbt-dev use the latest pre-release version of sbt: $sbt_unreleased_version
-sbt-jar use the specified jar as the sbt launcher
- -sbt-beta use a beta version of sbt (currently: $sbt_beta_version)
- -sbt-snapshot use a snapshot version of sbt (currently: $sbt_snapshot_version)
- -sbt-launch-dir directory to hold sbt launchers (default: $sbt_launch_dir)
+ -sbt-launch-dir directory to hold sbt launchers (default: ~/.sbt/launchers)
+ -sbt-launch-repo repo url for downloading sbt launcher jar (default: $sbt_launch_repo)
# scala version (default: as chosen by sbt)
-28 use $latest_28
-29 use $latest_29
-210 use $latest_210
+ -211 use $latest_211
-scala-home use the scala build at the specified directory
-scala-version use the specified version of scala
-binary-version use the specified scala version when searching for dependencies
@@ -309,7 +263,7 @@ Usage: $script_name [options]
# passing options to the jvm - note it does NOT use JAVA_OPTS due to pollution
# The default set is used if JVM_OPTS is unset and no -jvm-opts file is found
- $default_jvm_opts
+ $(default_jvm_opts)
JVM_OPTS environment variable holding either the jvm args directly, or
the reference to a file containing jvm args if given path is prepended by '@' (e.g. '@/etc/jvmopts')
Note: "@"-file is overridden by local '.jvmopts' or '-jvm-opts' argument.
@@ -327,33 +281,37 @@ EOM
}
addJava () {
- dlog "[addJava] arg = '$1'"
+ vlog "[addJava] arg = '$1'"
java_args=( "${java_args[@]}" "$1" )
}
addSbt () {
- dlog "[addSbt] arg = '$1'"
+ vlog "[addSbt] arg = '$1'"
sbt_commands=( "${sbt_commands[@]}" "$1" )
}
+setThisBuild () {
+ vlog "[addBuild] args = '$@'"
+ local key="$1" && shift
+ addSbt "set $key in ThisBuild := $@"
+}
+
addScalac () {
- dlog "[addScalac] arg = '$1'"
+ vlog "[addScalac] arg = '$1'"
scalac_args=( "${scalac_args[@]}" "$1" )
}
addResidual () {
- dlog "[residual] arg = '$1'"
+ vlog "[residual] arg = '$1'"
residual_args=( "${residual_args[@]}" "$1" )
}
addResolver () {
- addSbt "set resolvers in ThisBuild += $1"
+ addSbt "set resolvers += $1"
}
addDebugger () {
addJava "-Xdebug"
addJava "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1"
}
setScalaVersion () {
- addSbt "set scalaVersion in ThisBuild := \"$1\""
- if [[ "$1" == *SNAPSHOT* ]]; then
- addResolver Opts.resolver.sonatypeSnapshots
- fi
+ [[ "$1" == *"-SNAPSHOT" ]] && addResolver 'Resolver.sonatypeRepo("snapshots")'
+ addSbt "++ $1"
}
process_args ()
@@ -369,94 +327,104 @@ process_args ()
}
while [[ $# -gt 0 ]]; do
case "$1" in
- -h|-help) usage; exit 1 ;;
- -v|-verbose) verbose=true && log_level=Info && shift ;;
- -d|-debug) debug=true && log_level=Debug && shift ;;
- -q|-quiet) quiet=true && log_level=Error && shift ;;
+ -h|-help) usage; exit 1 ;;
+ -v) verbose=true && shift ;;
+ -d) addSbt "--debug" && shift ;;
+ -w) addSbt "--warn" && shift ;;
+ -q) addSbt "--error" && shift ;;
+ -x) debugUs=true && shift ;;
+ -trace) require_arg integer "$1" "$2" && trace_level="$2" && shift 2 ;;
+ -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;;
+ -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;;
+ -no-share) noshare=true && shift ;;
+ -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;;
+ -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;;
+ -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;;
+ -offline) addSbt "set offline := true" && shift ;;
+ -jvm-debug) require_arg port "$1" "$2" && addDebugger "$2" && shift 2 ;;
+ -batch) batch=true && shift ;;
+ -prompt) require_arg "expr" "$1" "$2" && setThisBuild shellPrompt "(s => { val e = Project.extract(s) ; $2 })" && shift 2 ;;
- -trace) require_arg integer "$1" "$2" && trace_level=$2 && shift 2 ;;
- -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;;
- -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;;
- -no-share) noshare=true && shift ;;
- -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;;
- -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;;
- -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;;
- -offline) addSbt "set offline := true" && shift ;;
- -jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;;
- -batch) batch=true && shift ;;
- -prompt) require_arg "expr" "$1" "$2" && addSbt "set shellPrompt in ThisBuild := (s => { val e = Project.extract(s) ; $2 })" && shift 2 ;;
+ -sbt-create) sbt_create=true && shift ;;
+ -sbt-jar) require_arg path "$1" "$2" && sbt_jar="$2" && shift 2 ;;
+ -sbt-version) require_arg version "$1" "$2" && sbt_explicit_version="$2" && shift 2 ;;
+ -sbt-force-latest) sbt_explicit_version="$sbt_release_version" && shift ;;
+ -sbt-dev) sbt_explicit_version="$sbt_unreleased_version" && shift ;;
+ -sbt-launch-dir) require_arg path "$1" "$2" && sbt_launch_dir="$2" && shift 2 ;;
+ -sbt-launch-repo) require_arg path "$1" "$2" && sbt_launch_repo="$2" && shift 2 ;;
+ -scala-version) require_arg version "$1" "$2" && setScalaVersion "$2" && shift 2 ;;
+ -binary-version) require_arg version "$1" "$2" && setThisBuild scalaBinaryVersion "\"$2\"" && shift 2 ;;
+ -scala-home) require_arg path "$1" "$2" && setThisBuild scalaHome "Some(file(\"$2\"))" && shift 2 ;;
+ -java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;;
+ -sbt-opts) require_arg path "$1" "$2" && sbt_opts_file="$2" && shift 2 ;;
+ -jvm-opts) require_arg path "$1" "$2" && jvm_opts_file="$2" && shift 2 ;;
- -sbt-create) sbt_create=true && shift ;;
- -sbt-snapshot) sbt_explicit_version=$sbt_snapshot_version && shift ;;
- -sbt-beta) sbt_explicit_version=$sbt_beta_version && shift ;;
- -sbt-jar) require_arg path "$1" "$2" && sbt_jar="$2" && shift 2 ;;
- -sbt-version) require_arg version "$1" "$2" && sbt_explicit_version="$2" && shift 2 ;;
--sbt-launch-dir) require_arg path "$1" "$2" && sbt_launch_dir="$2" && shift 2 ;;
- -scala-version) require_arg version "$1" "$2" && setScalaVersion "$2" && shift 2 ;;
--binary-version) require_arg version "$1" "$2" && addSbt "set scalaBinaryVersion in ThisBuild := \"$2\"" && shift 2 ;;
- -scala-home) require_arg path "$1" "$2" && addSbt "set every scalaHome := Some(file(\"$2\"))" && shift 2 ;;
- -java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;;
- -sbt-opts) require_arg path "$1" "$2" && sbt_opts_file="$2" && shift 2 ;;
- -jvm-opts) require_arg path "$1" "$2" && jvm_opts_file="$2" && shift 2 ;;
+ -D*) addJava "$1" && shift ;;
+ -J*) addJava "${1:2}" && shift ;;
+ -S*) addScalac "${1:2}" && shift ;;
+ -28) setScalaVersion "$latest_28" && shift ;;
+ -29) setScalaVersion "$latest_29" && shift ;;
+ -210) setScalaVersion "$latest_210" && shift ;;
+ -211) setScalaVersion "$latest_211" && shift ;;
- -D*) addJava "$1" && shift ;;
- -J*) addJava "${1:2}" && shift ;;
- -S*) addScalac "${1:2}" && shift ;;
- -28) addSbt "++ $latest_28" && shift ;;
- -29) addSbt "++ $latest_29" && shift ;;
- -210) addSbt "++ $latest_210" && shift ;;
-
- *) addResidual "$1" && shift ;;
+ *) addResidual "$1" && shift ;;
esac
done
}
-
# process the direct command line arguments
process_args "$@"
-# skip #-styled comments
+# skip #-styled comments and blank lines
readConfigFile() {
- while read line; do echo ${line/\#*/} | grep -vE '^\s*$'; done < $1
+ while read line; do
+ [[ $line =~ ^# ]] || [[ -z $line ]] || echo "$line"
+ done < "$1"
}
# if there are file/environment sbt_opts, process again so we
# can supply args to this runner
if [[ -r "$sbt_opts_file" ]]; then
vlog "Using sbt options defined in file $sbt_opts_file"
- readarr extra_sbt_opts < <(readConfigFile "$sbt_opts_file")
-elif [[ -n "$SBT_OPTS" && !($SBT_OPTS =~ ^@.*) ]]; then
+ while read opt; do extra_sbt_opts+=("$opt"); done < <(readConfigFile "$sbt_opts_file")
+elif [[ -n "$SBT_OPTS" && ! ("$SBT_OPTS" =~ ^@.*) ]]; then
vlog "Using sbt options defined in variable \$SBT_OPTS"
extra_sbt_opts=( $SBT_OPTS )
else
vlog "No extra sbt options have been defined"
fi
-[[ -n $extra_sbt_opts ]] && process_args "${extra_sbt_opts[@]}"
+[[ -n "${extra_sbt_opts[*]}" ]] && process_args "${extra_sbt_opts[@]}"
# reset "$@" to the residual args
set -- "${residual_args[@]}"
argumentCount=$#
+# set sbt version
+set_sbt_version
+
# only exists in 0.12+
setTraceLevel() {
- case $(sbt_version) in
- 0.{7,10,11}.*) echoerr "Cannot set trace level in sbt version $(sbt_version)" ;;
- *) addSbt "set every traceLevel := $trace_level" ;;
+ case "$sbt_version" in
+ "0.7."* | "0.10."* | "0.11."* ) echoerr "Cannot set trace level in sbt version $sbt_version" ;;
+ *) setThisBuild traceLevel $trace_level ;;
esac
}
# set scalacOptions if we were given any -S opts
[[ ${#scalac_args[@]} -eq 0 ]] || addSbt "set scalacOptions in ThisBuild += \"${scalac_args[@]}\""
-# Update build.properties no disk to set explicit version - sbt gives us no choice
+# Update build.properties on disk to set explicit version - sbt gives us no choice
[[ -n "$sbt_explicit_version" ]] && update_build_props_sbt "$sbt_explicit_version"
-vlog "Detected sbt version $(sbt_version)"
+vlog "Detected sbt version $sbt_version"
-[[ -n "$scala_version" ]] && echoerr "Overriding scala version to $scala_version"
+[[ -n "$scala_version" ]] && vlog "Overriding scala version to $scala_version"
# no args - alert them there's stuff in here
-(( $argumentCount > 0 )) || vlog "Starting $script_name: invoke with -help for other options"
+(( argumentCount > 0 )) || {
+ vlog "Starting $script_name: invoke with -help for other options"
+ residual_args=( shell )
+}
# verify this is an sbt dir or -create was given
[[ -r ./build.sbt || -d ./project || -n "$sbt_create" ]] || {
@@ -479,40 +447,79 @@ EOM
exit 1
}
-if [[ -n $noshare ]]; then
- addJava "$noshare_opts"
+if [[ -n "$noshare" ]]; then
+ for opt in ${noshare_opts}; do
+ addJava "$opt"
+ done
else
- [[ -n "$sbt_dir" ]] || {
- sbt_dir=~/.sbt/$(sbt_version)
- vlog "Using $sbt_dir as sbt dir, -sbt-dir to override."
- }
- addJava "-Dsbt.global.base=$sbt_dir"
+ case "$sbt_version" in
+ "0.7."* | "0.10."* | "0.11."* | "0.12."* )
+ [[ -n "$sbt_dir" ]] || {
+ sbt_dir="$HOME/.sbt/$sbt_version"
+ vlog "Using $sbt_dir as sbt dir, -sbt-dir to override."
+ }
+ ;;
+ esac
+
+ if [[ -n "$sbt_dir" ]]; then
+ addJava "-Dsbt.global.base=$sbt_dir"
+ fi
fi
if [[ -r "$jvm_opts_file" ]]; then
vlog "Using jvm options defined in file $jvm_opts_file"
- readarr extra_jvm_opts < <(readConfigFile "$jvm_opts_file")
-elif [[ -n "$JVM_OPTS" && !($JVM_OPTS =~ ^@.*) ]]; then
+ while read opt; do extra_jvm_opts+=("$opt"); done < <(readConfigFile "$jvm_opts_file")
+elif [[ -n "$JVM_OPTS" && ! ("$JVM_OPTS" =~ ^@.*) ]]; then
vlog "Using jvm options defined in \$JVM_OPTS variable"
extra_jvm_opts=( $JVM_OPTS )
else
vlog "Using default jvm options"
- extra_jvm_opts=( $default_jvm_opts )
+ extra_jvm_opts=( $(default_jvm_opts) )
fi
-# since sbt 0.7 doesn't understand iflast
-[[ ${#residual_args[@]} -eq 0 ]] && [[ -z "$batch" ]] && residual_args=( "shell" )
-
# traceLevel is 0.12+
-[[ -n $trace_level ]] && setTraceLevel
+[[ -n "$trace_level" ]] && setTraceLevel
-[[ -n $log_level ]] && [[ $log_level != Info ]] && logLevalArg="set logLevel in Global := Level.$log_level"
+main () {
+ execRunner "$java_cmd" \
+ "${extra_jvm_opts[@]}" \
+ "${java_args[@]}" \
+ -jar "$sbt_jar" \
+ "${sbt_commands[@]}" \
+ "${residual_args[@]}"
+}
+
+# sbt inserts this string on certain lines when formatting is enabled:
+# val OverwriteLine = "\r\u001BM\u001B[2K"
+# ...in order not to spam the console with a million "Resolving" lines.
+# Unfortunately that makes it that much harder to work with when
+# we're not going to print those lines anyway. We strip that bit of
+# line noise, but leave the other codes to preserve color.
+mainFiltered () {
+ local ansiOverwrite='\r\x1BM\x1B[2K'
+ local excludeRegex=$(egrep -v '^#|^$' ~/.sbtignore | paste -sd'|' -)
+
+ echoLine () {
+ local line="$1"
+ local line1="$(echo "$line" | sed -r 's/\r\x1BM\x1B\[2K//g')" # This strips the OverwriteLine code.
+ local line2="$(echo "$line1" | sed -r 's/\x1B\[[0-9;]*[JKmsu]//g')" # This strips all codes - we test regexes against this.
+
+ if [[ $line2 =~ $excludeRegex ]]; then
+ [[ -n $debugUs ]] && echo "[X] $line1"
+ else
+ [[ -n $debugUs ]] && echo " $line1" || echo "$line1"
+ fi
+ }
+
+ echoLine "Starting sbt with output filtering enabled."
+ main | while read -r line; do echoLine "$line"; done
+}
+
+# Only filter if there's a filter file and we don't see a known interactive command.
+# Obviously this is super ad hoc but I don't know how to improve on it. Testing whether
+# stdin is a terminal is useless because most of my use cases for this filtering are
+# exactly when I'm at a terminal, running sbt non-interactively.
+shouldFilter () { [[ -f ~/.sbtignore ]] && ! egrep -q '\b(shell|console|consoleProject)\b' <<<"${residual_args[@]}"; }
# run sbt
-execRunner "$java_cmd" \
- "${extra_jvm_opts[@]}" \
- "${java_args[@]}" \
- -jar "$sbt_jar" \
- "$logLevalArg" \
- "${sbt_commands[@]}" \
- "${residual_args[@]}"
+if shouldFilter; then mainFiltered; else main; fi