6
6
7
7
set -o pipefail
8
8
9
- declare -r sbt_release_version=" 0.13.17 "
10
- declare -r sbt_unreleased_version=" 0.13.17 "
9
+ declare -r sbt_release_version=" 1.2.8 "
10
+ declare -r sbt_unreleased_version=" 1.3.0-RC1 "
11
11
12
- declare -r latest_213=" 2.13.0-M5 "
13
- declare -r latest_212=" 2.12.7 "
12
+ declare -r latest_213=" 2.13.0"
13
+ declare -r latest_212=" 2.12.9 "
14
14
declare -r latest_211=" 2.11.12"
15
15
declare -r latest_210=" 2.10.7"
16
16
declare -r latest_29=" 2.9.3"
17
17
declare -r latest_28=" 2.8.2"
18
18
19
19
declare -r buildProps=" project/build.properties"
20
20
21
- declare -r sbt_launch_ivy_release_repo=" http ://repo.typesafe.com/typesafe/ivy-releases"
21
+ declare -r sbt_launch_ivy_release_repo=" https ://repo.typesafe.com/typesafe/ivy-releases"
22
22
declare -r sbt_launch_ivy_snapshot_repo=" https://repo.scala-sbt.org/scalasbt/ivy-snapshots"
23
- declare -r sbt_launch_mvn_release_repo=" http ://repo.scala-sbt.org/scalasbt/maven-releases"
24
- declare -r sbt_launch_mvn_snapshot_repo=" http ://repo.scala-sbt.org/scalasbt/maven-snapshots"
23
+ declare -r sbt_launch_mvn_release_repo=" https ://repo.scala-sbt.org/scalasbt/maven-releases"
24
+ declare -r sbt_launch_mvn_snapshot_repo=" https ://repo.scala-sbt.org/scalasbt/maven-snapshots"
25
25
26
26
declare -r default_jvm_opts_common=" -Xms512m -Xss2m"
27
27
declare -r noshare_opts=" -Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy"
@@ -43,11 +43,12 @@ declare -a extra_jvm_opts extra_sbt_opts
43
43
44
44
echoerr () { echo >&2 " $@ " ; }
45
45
vlog () { [[ -n " $verbose " ]] && echoerr " $@ " ; }
46
- die () { echo " Aborting: $@ " ; exit 1; }
46
+ die () { echo " Aborting: $* " ; exit 1; }
47
47
48
48
setTrapExit () {
49
49
# save stty and trap exit, to ensure echo is re-enabled if we are interrupted.
50
- export SBT_STTY=" $( stty -g 2> /dev/null) "
50
+ SBT_STTY=" $( stty -g 2> /dev/null) "
51
+ export SBT_STTY
51
52
52
53
# restore stty settings (echo in particular)
53
54
onSbtRunnerExit () {
@@ -67,16 +68,18 @@ get_script_path () {
67
68
local path=" $1 "
68
69
[[ -L " $path " ]] || { echo " $path " ; return ; }
69
70
70
- local target=" $( readlink " $path " ) "
71
+ local -r target=" $( readlink " $path " ) "
71
72
if [[ " ${target: 0: 1} " == " /" ]]; then
72
73
echo " $target "
73
74
else
74
75
echo " ${path%/* } /$target "
75
76
fi
76
77
}
77
78
78
- declare -r script_path=" $( get_script_path " $BASH_SOURCE " ) "
79
- declare -r script_name=" ${script_path##*/ } "
79
+ script_path=" $( get_script_path " ${BASH_SOURCE[0]} " ) "
80
+ declare -r script_path
81
+ script_name=" ${script_path##*/ } "
82
+ declare -r script_name
80
83
81
84
init_default_option_file () {
82
85
local overriding_var=" ${! 1} "
@@ -90,8 +93,8 @@ init_default_option_file () {
90
93
echo " $default_file "
91
94
}
92
95
93
- declare sbt_opts_file=" $( init_default_option_file SBT_OPTS .sbtopts) "
94
- declare jvm_opts_file=" $( init_default_option_file JVM_OPTS .jvmopts) "
96
+ sbt_opts_file=" $( init_default_option_file SBT_OPTS .sbtopts) "
97
+ jvm_opts_file=" $( init_default_option_file JVM_OPTS .jvmopts) "
95
98
96
99
build_props_sbt () {
97
100
[[ -r " $buildProps " ]] && \
@@ -108,7 +111,7 @@ url_base () {
108
111
local version=" $1 "
109
112
110
113
case " $version " in
111
- 0.7.* ) echo " http ://simple-build-tool.googlecode.com" ;;
114
+ 0.7.* ) echo " https ://simple-build-tool.googlecode.com" ;;
112
115
0.10.* ) echo " $sbt_launch_ivy_release_repo " ;;
113
116
0.11.[12]) echo " $sbt_launch_ivy_release_repo " ;;
114
117
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"
@@ -130,7 +133,7 @@ make_url () {
130
133
0.10.* ) echo " $base /org.scala-tools.sbt/sbt-launch/$version /sbt-launch.jar" ;;
131
134
0.11.[12]) echo " $base /org.scala-tools.sbt/sbt-launch/$version /sbt-launch.jar" ;;
132
135
0.* ) echo " $base /org.scala-sbt/sbt-launch/$version /sbt-launch.jar" ;;
133
- * ) echo " $base /org/scala-sbt/sbt-launch/$version /sbt-launch.jar" ;;
136
+ * ) echo " $base /org/scala-sbt/sbt-launch/$version /sbt-launch- ${version} .jar" ;;
134
137
esac
135
138
}
136
139
@@ -142,9 +145,9 @@ addResidual () { vlog "[residual] arg = '$1'" ; residual_args+=("$1"); }
142
145
addResolver () { addSbt " set resolvers += $1 " ; }
143
146
addDebugger () { addJava " -Xdebug" ; addJava " -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1 " ; }
144
147
setThisBuild () {
145
- vlog " [addBuild] args = '$@ '"
148
+ vlog " [addBuild] args = '$* '"
146
149
local key=" $1 " && shift
147
- addSbt " set $key in ThisBuild := $@ "
150
+ addSbt " set $key in ThisBuild := $* "
148
151
}
149
152
setScalaVersion () {
150
153
[[ " $1 " == * " -SNAPSHOT" ]] && addResolver ' Resolver.sonatypeRepo("snapshots")'
@@ -159,7 +162,7 @@ setJavaHome () {
159
162
}
160
163
161
164
getJavaVersion () {
162
- local str=$( " $1 " -version 2>&1 | grep -E -e ' (java|openjdk) version' | awk ' { print $3 }' | tr -d ' "' )
165
+ local -r str=$( " $1 " -version 2>&1 | grep -E -e ' (java|openjdk) version' | awk ' { print $3 }' | tr -d ' "' )
163
166
164
167
# java -version on java8 says 1.8.x
165
168
# but on 9 and 10 it's 9.x.y and 10.x.y.
@@ -191,14 +194,14 @@ checkJava() {
191
194
}
192
195
193
196
java_version () {
194
- local version=$( getJavaVersion " $java_cmd " )
197
+ local -r version=$( getJavaVersion " $java_cmd " )
195
198
vlog " Detected Java version: $version "
196
199
echo " $version "
197
200
}
198
201
199
202
# MaxPermSize critical on pre-8 JVMs but incurs noisy warning on 8+
200
203
default_jvm_opts () {
201
- local v=" $( java_version) "
204
+ local -r v=" $( java_version) "
202
205
if [[ $v -ge 8 ]]; then
203
206
echo " $default_jvm_opts_common "
204
207
else
@@ -240,22 +243,18 @@ execRunner () {
240
243
241
244
jar_url () { make_url " $1 " ; }
242
245
243
- is_cygwin () [[ " $( uname -a) " == " CYGWIN" * ]]
246
+ is_cygwin () { [[ " $( uname -a) " == " CYGWIN" * ]]; }
244
247
245
248
jar_file () {
246
249
is_cygwin \
247
- && echo " $( cygpath -w $sbt_launch_dir /" $1 " /sbt-launch.jar) " \
250
+ && cygpath -w " $sbt_launch_dir /$1 /sbt-launch.jar" \
248
251
|| echo " $sbt_launch_dir /$1 /sbt-launch.jar"
249
252
}
250
253
251
254
download_url () {
252
255
local url=" $1 "
253
256
local jar=" $2 "
254
257
255
- echoerr " Downloading sbt launcher for $sbt_version :"
256
- echoerr " From $url "
257
- echoerr " To $jar "
258
-
259
258
mkdir -p " ${jar%/* } " && {
260
259
if command -v curl > /dev/null 2>&1 ; then
261
260
curl --fail --silent --location " $url " --output " $jar "
@@ -274,10 +273,57 @@ acquire_sbt_jar () {
274
273
[[ -r " $sbt_jar " ]]
275
274
} || {
276
275
sbt_jar=" $( jar_file " $sbt_version " ) "
277
- download_url " $( make_url " $sbt_version " ) " " $sbt_jar "
276
+ jar_url=" $( make_url " $sbt_version " ) "
277
+
278
+ echoerr " Downloading sbt launcher for ${sbt_version} :"
279
+ echoerr " From ${jar_url} "
280
+ echoerr " To ${sbt_jar} "
281
+
282
+ download_url " ${jar_url} " " ${sbt_jar} "
283
+
284
+ case " ${sbt_version} " in
285
+ 0.* ) vlog " SBT versions < 1.0 do not have published MD5 checksums, skipping check" ; echo " " ;;
286
+ * ) verify_sbt_jar " ${sbt_jar} " ;;
287
+ esac
278
288
}
279
289
}
280
290
291
+ verify_sbt_jar () {
292
+ local jar=" ${1} "
293
+ local md5=" ${jar} .md5"
294
+
295
+ download_url " $( make_url " ${sbt_version} " ) .md5" " ${md5} " > /dev/null 2>&1
296
+
297
+ if command -v md5sum > /dev/null 2>&1 ; then
298
+ if echo " $( cat " ${md5} " ) ${jar} " | md5sum -c -; then
299
+ rm -rf " ${md5} "
300
+ return 0
301
+ else
302
+ echoerr " Checksum does not match"
303
+ return 1
304
+ fi
305
+ elif command -v md5 > /dev/null 2>&1 ; then
306
+ if [ " $( md5 -q " ${jar} " ) " == " $( cat " ${md5} " ) " ]; then
307
+ rm -rf " ${md5} "
308
+ return 0
309
+ else
310
+ echoerr " Checksum does not match"
311
+ return 1
312
+ fi
313
+ elif command -v openssl > /dev/null 2>&1 ; then
314
+ if [ " $( openssl md5 -r " ${jar} " | awk ' {print $1}' ) " == " $( cat " ${md5} " ) " ]; then
315
+ rm -rf " ${md5} "
316
+ return 0
317
+ else
318
+ echoerr " Checksum does not match"
319
+ return 1
320
+ fi
321
+ else
322
+ echoerr " Could not find an MD5 command"
323
+ return 1
324
+ fi
325
+ }
326
+
281
327
usage () {
282
328
set_sbt_version
283
329
cat << EOM
@@ -420,7 +466,7 @@ process_args "$@"
420
466
readConfigFile () {
421
467
local end=false
422
468
until $end ; do
423
- read || end=true
469
+ read -r || end=true
424
470
[[ $REPLY =~ ^# ]] || [[ -z $REPLY ]] || echo "$REPLY"
425
471
done < " $1 "
426
472
}
@@ -429,10 +475,10 @@ readConfigFile() {
429
475
# can supply args to this runner
430
476
if [[ -r " $sbt_opts_file " ]]; then
431
477
vlog " Using sbt options defined in file $sbt_opts_file "
432
- while read opt; do extra_sbt_opts+=(" $opt " ); done < <( readConfigFile " $sbt_opts_file " )
478
+ while read -r opt; do extra_sbt_opts+=(" $opt " ); done < <( readConfigFile " $sbt_opts_file " )
433
479
elif [[ -n " $SBT_OPTS " && ! (" $SBT_OPTS " =~ ^@.* ) ]]; then
434
480
vlog " Using sbt options defined in variable \$ SBT_OPTS"
435
- extra_sbt_opts=( $SBT_OPTS )
481
+ IFS= " " read -r -a extra_sbt_opts <<< " $SBT_OPTS"
436
482
else
437
483
vlog " No extra sbt options have been defined"
438
484
fi
@@ -452,18 +498,18 @@ checkJava
452
498
setTraceLevel () {
453
499
case " $sbt_version " in
454
500
" 0.7." * | " 0.10." * | " 0.11." * ) echoerr " Cannot set trace level in sbt version $sbt_version " ;;
455
- * ) setThisBuild traceLevel $trace_level ;;
501
+ * ) setThisBuild traceLevel " $trace_level " ;;
456
502
esac
457
503
}
458
504
459
505
# set scalacOptions if we were given any -S opts
460
- [[ ${# scalac_args[@]} -eq 0 ]] || addSbt " set scalacOptions in ThisBuild += \" ${scalac_args[@ ]} \" "
506
+ [[ ${# scalac_args[@]} -eq 0 ]] || addSbt " set scalacOptions in ThisBuild += \" ${scalac_args[* ]} \" "
461
507
462
508
[[ -n " $sbt_explicit_version " && -z " $sbt_new " ]] && addJava " -Dsbt.version=$sbt_explicit_version "
463
509
vlog " Detected sbt version $sbt_version "
464
510
465
511
if [[ -n " $sbt_script " ]]; then
466
- residual_args=( $sbt_script ${residual_args[@]} )
512
+ residual_args=( " $sbt_script " " ${residual_args[@]} " )
467
513
else
468
514
# no args - alert them there's stuff in here
469
515
(( argumentCount > 0 )) || {
484
530
}
485
531
486
532
# pick up completion if present; todo
533
+ # shellcheck disable=SC1091
487
534
[[ -r .sbt_completion.sh ]] && source .sbt_completion.sh
488
535
489
536
# directory to store sbt launchers
493
540
# no jar? download it.
494
541
[[ -r " $sbt_jar " ]] || acquire_sbt_jar || {
495
542
# still no jar? uh-oh.
496
- echo " Download failed . Obtain the jar manually and place it at $sbt_jar "
543
+ echo " Could not download and verify the launcher . Obtain the jar manually and place it at $sbt_jar "
497
544
exit 1
498
545
}
499
546
518
565
519
566
if [[ -r " $jvm_opts_file " ]]; then
520
567
vlog " Using jvm options defined in file $jvm_opts_file "
521
- while read opt; do extra_jvm_opts+=(" $opt " ); done < <( readConfigFile " $jvm_opts_file " )
568
+ while read -r opt; do extra_jvm_opts+=(" $opt " ); done < <( readConfigFile " $jvm_opts_file " )
522
569
elif [[ -n " $JVM_OPTS " && ! (" $JVM_OPTS " =~ ^@.* ) ]]; then
523
570
vlog " Using jvm options defined in \$ JVM_OPTS variable"
524
- extra_jvm_opts=( $JVM_OPTS )
571
+ IFS= " " read -r -a extra_jvm_opts <<< " $JVM_OPTS"
525
572
else
526
573
vlog " Using default jvm options"
527
- extra_jvm_opts=( $( default_jvm_opts) )
574
+ IFS= " " read -r -a extra_jvm_opts <<< " $(default_jvm_opts)"
528
575
fi
529
576
530
577
# traceLevel is 0.12+
@@ -546,13 +593,12 @@ main () {
546
593
# we're not going to print those lines anyway. We strip that bit of
547
594
# line noise, but leave the other codes to preserve color.
548
595
mainFiltered () {
549
- local ansiOverwrite=' \r\x1BM\x1B[2K'
550
- local excludeRegex=$( egrep -v ' ^#|^$' ~ /.sbtignore | paste -sd' |' -)
596
+ local -r excludeRegex=$( grep -E -v ' ^#|^$' ~ /.sbtignore | paste -sd' |' -)
551
597
552
598
echoLine () {
553
- local line=" $1 "
554
- local line1=" $( echo " $ line" | sed ' s/ \r\x1BM\x1B\[2K//g' ) " # This strips the OverwriteLine code.
555
- local line2=" $( echo " $ line1" | sed ' s/ \x1B\[[0-9;]*[JKmsu]//g' ) " # This strips all codes - we test regexes against this.
599
+ local -r line=" $1 "
600
+ local -r line1=" ${ line// \r\x 1BM\x 1B\[ 2K// g} " # This strips the OverwriteLine code.
601
+ local -r line2=" ${ line1// \x 1B\[ [0-9;]* [JKmsu]// g} " # This strips all codes - we test regexes against this.
556
602
557
603
if [[ $line2 =~ $excludeRegex ]]; then
558
604
[[ -n $debugUs ]] && echo " [X] $line1 "
@@ -569,7 +615,7 @@ mainFiltered () {
569
615
# Obviously this is super ad hoc but I don't know how to improve on it. Testing whether
570
616
# stdin is a terminal is useless because most of my use cases for this filtering are
571
617
# exactly when I'm at a terminal, running sbt non-interactively.
572
- shouldFilter () { [[ -f ~ /.sbtignore ]] && ! egrep -q ' \b(shell|console|consoleProject)\b' <<< " ${residual_args[@]}" ; }
618
+ shouldFilter () { [[ -f ~ /.sbtignore ]] && ! grep -E -q ' \b(shell|console|consoleProject)\b' <<< " ${residual_args[@]}" ; }
573
619
574
620
# run sbt
575
621
if shouldFilter; then mainFiltered; else main; fi
0 commit comments