4
4
# Author: Paul Phillips <[email protected] >
5
5
6
6
# todo - make this dynamic
7
- declare -r sbt_release_version=0.12.2
7
+ declare -r sbt_release_version=0.12.4
8
+ declare -r sbt_beta_version=0.13.0-RC4
8
9
declare -r sbt_snapshot_version=0.13.0-SNAPSHOT
9
10
10
11
declare sbt_jar sbt_dir sbt_create sbt_snapshot sbt_launch_dir
11
12
declare scala_version java_home sbt_explicit_version
12
13
declare verbose debug quiet noshare batch trace_level log_level
14
+ declare sbt_saved_stty
13
15
16
+ echoerr () { [[ -z $quiet ]] && echo " $@ " >&2 ; }
17
+ vlog () { [[ -n " $verbose$debug " ]] && echoerr " $@ " ; }
18
+ dlog () { [[ -n $debug ]] && echoerr " $@ " ; }
19
+
20
+ # we'd like these set before we get around to properly processing arguments
14
21
for arg in " $@ " ; do
15
22
case $arg in
16
- -q|-quiet) quiet=true ;;
17
- * ) ;;
23
+ -q|-quiet) quiet=true ;;
24
+ -d|-debug) debug=true ;;
25
+ -v|-verbose) verbose=true ;;
26
+ * ) ;;
18
27
esac
19
28
done
20
29
21
30
build_props_sbt () {
22
31
if [[ -r project/build.properties ]]; then
23
- versionLine=$( grep ^sbt.version project/build.properties)
32
+ versionLine=$( grep ^sbt.version project/build.properties | tr -d ' \r ' )
24
33
versionString=${versionLine## sbt.version=}
25
34
echo " $versionString "
26
35
fi
@@ -36,10 +45,10 @@ update_build_props_sbt () {
36
45
perl -pi -e " s/^sbt\.version=.*\$ /sbt.version=${ver} /" project/build.properties
37
46
grep -q ' ^sbt.version=' project/build.properties || echo " sbt.version=${ver} " >> project/build.properties
38
47
39
- echo !!!
40
- echo !!! Updated file project/build.properties setting sbt.version to: $ver
41
- echo !!! Previous value was: $old
42
- echo !!!
48
+ echoerr !!!
49
+ echoerr !!! Updated file project/build.properties setting sbt.version to: $ver
50
+ echoerr !!! Previous value was: $old
51
+ echoerr !!!
43
52
fi
44
53
}
45
54
@@ -56,16 +65,20 @@ sbt_version () {
56
65
fi
57
66
}
58
67
59
- echoerr () {
60
- [[ -z $quiet ]] && echo " $@ " >&2
61
- }
62
- vlog () {
63
- [[ $verbose || $debug ]] && echoerr " $@ "
64
- }
65
- dlog () {
66
- [[ $debug ]] && echoerr " $@ "
68
+ # restore stty settings (echo in particular)
69
+ onSbtRunnerExit () {
70
+ [[ -n $sbt_saved_stty ]] || return
71
+ dlog " "
72
+ dlog " restoring stty: $sbt_saved_stty "
73
+ stty $sbt_saved_stty
74
+ unset sbt_saved_stty
67
75
}
68
76
77
+ # save stty and trap exit, to ensure echo is reenabled if we are interrupted.
78
+ trap onSbtRunnerExit EXIT
79
+ sbt_saved_stty=$( stty -g 2> /dev/null)
80
+ dlog " Saved stty: $sbt_saved_stty "
81
+
69
82
# this seems to cover the bases on OSX, and someone will
70
83
# have to tell me about the others.
71
84
get_script_path () {
@@ -93,6 +106,24 @@ make_url () {
93
106
echo " http://typesafe.artifactoryonline.com/typesafe/ivy-$category /$groupid /sbt-launch/$version /sbt-launch.jar"
94
107
}
95
108
109
+ readarr () {
110
+ while read ; do
111
+ eval " $1 +=(\" $REPLY \" )"
112
+ done
113
+ }
114
+
115
+ init_default_option_file () {
116
+ local overriding_var=${! 1}
117
+ local default_file=$2
118
+ if [[ ! -r " $default_file " && $overriding_var =~ ^@ (.* )$ ]]; then
119
+ local envvar_file=${BASH_REMATCH[1]}
120
+ if [[ -r $envvar_file ]]; then
121
+ default_file=$envvar_file
122
+ fi
123
+ fi
124
+ echo $default_file
125
+ }
126
+
96
127
declare -r default_jvm_opts=" -Dfile.encoding=UTF8 -XX:MaxPermSize=256m -Xms512m -Xmx1g -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC"
97
128
declare -r noshare_opts=" -Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy"
98
129
declare -r latest_28=" 2.8.2"
@@ -105,11 +136,8 @@ declare -r script_name="$(basename $script_path)"
105
136
106
137
# some non-read-onlies set with defaults
107
138
declare java_cmd=java
108
- declare sbt_launch_dir=" $script_dir /.lib"
109
- declare sbt_universal_launcher=" $script_dir /lib/sbt-launch.jar"
110
- declare sbt_jar=$sbt_universal_launcher
111
- declare sbt_opts_file=.sbtopts
112
- declare jvm_opts_file=.jvmopts
139
+ declare sbt_opts_file=$( init_default_option_file SBT_OPTS .sbtopts)
140
+ declare jvm_opts_file=$( init_default_option_file JVM_OPTS .jvmopts)
113
141
114
142
# pull -J and -D options to give to java.
115
143
declare -a residual_args
@@ -123,8 +151,10 @@ declare -a extra_jvm_opts extra_sbt_opts
123
151
# if set, use JAVA_HOME over java found in path
124
152
[[ -e " $JAVA_HOME /bin/java" ]] && java_cmd=" $JAVA_HOME /bin/java"
125
153
126
- # use ~/.sbt/launch to store sbt jars if script_dir is not writable
127
- [[ -w " $sbt_launch_dir " ]] || sbt_launch_dir=" $HOME /.sbt/launch"
154
+ # directory to store sbt launchers
155
+ declare sbt_launch_dir=" $HOME /.sbt/launchers"
156
+ [[ -d " $sbt_launch_dir " ]] || mkdir -p " $sbt_launch_dir "
157
+ [[ -w " $sbt_launch_dir " ]] || sbt_launch_dir=" $( mktemp -d -t sbt_extras_launchers) "
128
158
129
159
build_props_scala () {
130
160
if [[ -r project/build.properties ]]; then
@@ -156,7 +186,7 @@ execRunner () {
156
186
# I'm sure there's some way to get our hands on the pid and wait for it
157
187
# but it exceeds my present level of ambition.
158
188
else
159
- exec " $@ "
189
+ { " $@ " ; }
160
190
fi
161
191
}
162
192
@@ -207,7 +237,10 @@ jar_url () {
207
237
}
208
238
209
239
jar_file () {
210
- echo " $sbt_launch_dir /$1 /sbt-launch.jar"
240
+ case $1 in
241
+ 0.13.* ) echo " $sbt_launch_dir /$1 /sbt-launch.jar" ;;
242
+ * ) echo " $sbt_launch_dir /$sbt_release_version /sbt-launch.jar" ;;
243
+ esac
211
244
}
212
245
213
246
download_url () {
@@ -257,9 +290,10 @@ Usage: $script_name [options]
257
290
# sbt version (default: from project/build.properties if present, else latest release)
258
291
!!! The only way to accomplish this pre-0.12.0 if there is a build.properties file which
259
292
!!! contains an sbt.version property is to update the file on disk. That's what this does.
260
- -sbt-version <version> use the specified version of sbt
293
+ -sbt-version <version> use the specified version of sbt (default: $sbt_release_version )
261
294
-sbt-jar <path> use the specified jar as the sbt launcher
262
- -sbt-snapshot use a snapshot version of sbt
295
+ -sbt-beta use a beta version of sbt (currently: $sbt_beta_version )
296
+ -sbt-snapshot use a snapshot version of sbt (currently: $sbt_snapshot_version )
263
297
-sbt-launch-dir <path> directory to hold sbt launchers (default: $sbt_launch_dir )
264
298
265
299
# scala version (default: as chosen by sbt)
@@ -270,19 +304,23 @@ Usage: $script_name [options]
270
304
-scala-version <version> use the specified version of scala
271
305
-binary-version <version> use the specified scala version when searching for dependencies
272
306
273
- # java version (default: java from PATH, currently $( java -version | & grep version) )
307
+ # java version (default: java from PATH, currently $( java -version 2>&1 | grep version) )
274
308
-java-home <path> alternate JAVA_HOME
275
309
276
310
# passing options to the jvm - note it does NOT use JAVA_OPTS due to pollution
277
311
# The default set is used if JVM_OPTS is unset and no -jvm-opts file is found
278
312
<default> $default_jvm_opts
279
- JVM_OPTS environment variable holding jvm args
313
+ JVM_OPTS environment variable holding either the jvm args directly, or
314
+ the reference to a file containing jvm args if given path is prepended by '@' (e.g. '@/etc/jvmopts')
315
+ Note: "@"-file is overridden by local '.jvmopts' or '-jvm-opts' argument.
280
316
-jvm-opts <path> file containing jvm args (if not given, .jvmopts in project root is used if present)
281
317
-Dkey=val pass -Dkey=val directly to the jvm
282
318
-J-X pass option -X directly to the jvm (-J is stripped)
283
319
284
320
# passing options to sbt, OR to this runner
285
- SBT_OPTS environment variable holding sbt args
321
+ SBT_OPTS environment variable holding either the sbt args directly, or
322
+ the reference to a file containing sbt args if given path is prepended by '@' (e.g. '@/etc/sbtopts')
323
+ Note: "@"-file is overridden by local '.sbtopts' or '-sbt-opts' argument.
286
324
-sbt-opts <path> file containing sbt args (if not given, .sbtopts in project root is used if present)
287
325
-S-X add -X to sbt's scalacOptions (-S is stripped)
288
326
EOM
@@ -308,7 +346,8 @@ addResolver () {
308
346
addSbt " set resolvers in ThisBuild += $1 "
309
347
}
310
348
addDebugger () {
311
- addJava " -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1 "
349
+ addJava " -Xdebug"
350
+ addJava " -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1 "
312
351
}
313
352
setScalaVersion () {
314
353
addSbt " set scalaVersion in ThisBuild := \" $1 \" "
@@ -349,6 +388,7 @@ process_args ()
349
388
350
389
-sbt-create) sbt_create=true && shift ;;
351
390
-sbt-snapshot) sbt_explicit_version=$sbt_snapshot_version && shift ;;
391
+ -sbt-beta) sbt_explicit_version=$sbt_beta_version && shift ;;
352
392
-sbt-jar) require_arg path " $1 " " $2 " && sbt_jar=" $2 " && shift 2 ;;
353
393
-sbt-version) require_arg version " $1 " " $2 " && sbt_explicit_version=" $2 " && shift 2 ;;
354
394
-sbt-launch-dir) require_arg path " $1 " " $2 " && sbt_launch_dir=" $2 " && shift 2 ;;
@@ -375,12 +415,21 @@ process_args ()
375
415
# process the direct command line arguments
376
416
process_args " $@ "
377
417
418
+ # skip #-styled comments
419
+ readConfigFile () {
420
+ while read line; do echo ${line/ \# */ } | grep -vE ' ^\s*$' ; done < $1
421
+ }
422
+
378
423
# if there are file/environment sbt_opts, process again so we
379
424
# can supply args to this runner
380
425
if [[ -r " $sbt_opts_file " ]]; then
381
- readarray -t extra_sbt_opts < " $sbt_opts_file "
382
- elif [[ -n " $SBT_OPTS " ]]; then
426
+ vlog " Using sbt options defined in file $sbt_opts_file "
427
+ readarr extra_sbt_opts < <( readConfigFile " $sbt_opts_file " )
428
+ elif [[ -n " $SBT_OPTS " && ! ($SBT_OPTS =~ ^@.* ) ]]; then
429
+ vlog " Using sbt options defined in variable \$ SBT_OPTS"
383
430
extra_sbt_opts=( $SBT_OPTS )
431
+ else
432
+ vlog " No extra sbt options have been defined"
384
433
fi
385
434
386
435
[[ -n $extra_sbt_opts ]] && process_args " ${extra_sbt_opts[@]} "
@@ -402,12 +451,12 @@ setTraceLevel() {
402
451
403
452
# Update build.properties no disk to set explicit version - sbt gives us no choice
404
453
[[ -n " $sbt_explicit_version " ]] && update_build_props_sbt " $sbt_explicit_version "
405
- echoerr " Detected sbt version $( sbt_version) "
454
+ vlog " Detected sbt version $( sbt_version) "
406
455
407
- [[ -n " $scala_version " ]] && echo " Overriding scala version to $scala_version "
456
+ [[ -n " $scala_version " ]] && echoerr " Overriding scala version to $scala_version "
408
457
409
458
# no args - alert them there's stuff in here
410
- (( $argumentCount > 0 )) || echo " Starting $script_name : invoke with -help for other options"
459
+ (( $argumentCount > 0 )) || vlog " Starting $script_name : invoke with -help for other options"
411
460
412
461
# verify this is an sbt dir or -create was given
413
462
[[ -r ./build.sbt || -d ./project || -n " $sbt_create " ]] || {
@@ -441,10 +490,13 @@ else
441
490
fi
442
491
443
492
if [[ -r " $jvm_opts_file " ]]; then
444
- readarray -t extra_jvm_opts < " $jvm_opts_file "
445
- elif [[ -n " $JVM_OPTS " ]]; then
493
+ vlog " Using jvm options defined in file $jvm_opts_file "
494
+ readarr extra_jvm_opts < <( readConfigFile " $jvm_opts_file " )
495
+ elif [[ -n " $JVM_OPTS " && ! ($JVM_OPTS =~ ^@.* ) ]]; then
496
+ vlog " Using jvm options defined in \$ JVM_OPTS variable"
446
497
extra_jvm_opts=( $JVM_OPTS )
447
498
else
499
+ vlog " Using default jvm options"
448
500
extra_jvm_opts=( $default_jvm_opts )
449
501
fi
450
502
0 commit comments