1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-28 17:18:13 -07:00

Compare commits

...

122 commits

Author SHA1 Message Date
37a89d206b Centralized versions in main Gradle build file. 2019-03-30 11:17:29 -07:00
bf68749d3e
Merge pull request #501 from ethauvin/master
Grade build
2019-03-30 00:25:51 -07:00
12a0618a90 Ignore build directories. 2019-03-30 00:08:00 -07:00
4a477f5563 Made gradew executable. 2019-03-29 23:53:42 -07:00
a5c0bd921f Added Gradle project based on the POM. 2019-03-29 23:52:02 -07:00
Cedric Beust
200a81b9fc
Merge pull request #500 from pabl0rg/fix-unsafe-dependency-fetching
Fix unsafe dependency fetching
2019-03-29 09:29:53 -07:00
Juan Liska
a38a7187e8 add maven build dirs to classpath in “dev mode”
dev mode = when requested kobalt version jar not found
2019-03-29 10:21:22 -06:00
Juan Liska
ae6258acb8 use https to fetch artifacts 2019-03-29 10:21:22 -06:00
Juan Liska
4644b66d79 create maven build files for kobalt 2019-03-29 10:21:22 -06:00
Cedric Beust
f96e349608
Merge pull request #498 from pabl0rg/upgrade-guava-27.0.1
upgrade guava to 27.0.1 to resolve multimap ordering
2019-03-12 10:49:03 -07:00
Juan Liska
935a866f52 upgrade guava to 27.0.1 to resolve multimap ordering 2019-03-12 11:43:20 -06:00
Cedric Beust
5f7efabe20
Merge pull request #497 from pabl0rg/upgrade-guice-4.2.2
upgrade guice to 4.2.2
2019-03-12 10:40:22 -07:00
Juan Liska
a09594ea06 upgrade guice to 4.2.2 2019-03-12 11:34:21 -06:00
Cedric Beust
e06fc29190 1.0.122. 2018-11-23 14:19:17 -08:00
Cedric Beust
e6b72c282f
Merge pull request #494 from pabl0rg/improve-external-compiler-invocation
Improve external compiler invocation
2018-11-23 07:15:34 -08:00
Juan Liska
a0d33fcaae bump version to 1.0.121 2018-11-23 06:04:54 -06:00
Juan Liska
6934dec51a only add stdlib to classpath when project does not specify a kotlin version
when the project specifies a kotlin version, that version’s stdlib will be added to the classpath by other means
2018-11-23 06:04:48 -06:00
Juan Liska
c33800b189 don’t add deprecated kotlin runtime jar to project templates 2018-11-23 06:04:43 -06:00
Juan Liska
1ff46b5842 don’t add deprecated kotlin runtime jar to classpath 2018-11-23 06:04:38 -06:00
Juan Liska
0cc2c23a32 extend timeout to 2 mins, log error when process times out 2018-11-23 06:04:24 -06:00
Cedric Beust
0f0a780b43 1.0.120. 2018-11-10 08:13:27 -08:00
Cedric Beust
7827aeeb43 Fix project directory. 2018-11-10 08:13:02 -08:00
Cedric Beust
a6097dc136 Better test results. 2018-11-10 08:11:08 -08:00
Cedric Beust
e22b5b77e6 1.0.119. 2018-11-06 10:37:50 -08:00
Cedric Beust
2e73ece52c Fix bad test directory. 2018-11-06 10:37:42 -08:00
Cedric Beust
5c3642b7d7 1.0.118. 2018-10-30 13:37:02 -07:00
Cedric Beust
71540a4426 Fix test results being read in the wrong directory. 2018-10-30 13:36:51 -07:00
Cedric Beust
61534e1e81 1.0.117. 2018-10-15 14:46:41 -07:00
Cedric Beust
b7dd3afde7 Warning. 2018-10-15 14:46:09 -07:00
Cedric Beust
43bb71b486 Better JUnit 5 detection. 2018-10-15 14:46:04 -07:00
Cedric Beust
55bba514b3 Bump kotlinc version. 2018-10-12 13:46:10 -07:00
Cedric Beust
58aae0bfe3 1.0.116. 2018-10-10 13:38:09 -07:00
Cedric Beust
7b902eb673
Merge pull request #488 from pabl0rg/improve-kotlin-compiler-version-tests
Improve kotlin compiler version tests, upgrade to kotlin 1.2.70
2018-09-17 09:22:05 -07:00
Juan Liska
65aedfebdc bump version to 1.0.115 2018-09-17 05:09:43 -06:00
Juan Liska
7cf19b3f95 fix test assertion, enable kobalt logging for tests 2018-09-17 05:00:28 -06:00
Juan Liska
39801a5a24 upgrade default compiler to 1.2.70 2018-09-17 04:55:10 -06:00
Juan Liska
42bd2ecdf1 extend timeout, add logging 2018-09-16 10:01:59 -06:00
Juan Liska
3475377185 add Args parameter to newReposityrSystemSession call 2018-09-16 09:57:37 -06:00
Juan Liska
e1adc87281 add a test for kotlinCompiler version setting 2018-09-16 09:48:37 -06:00
Cedric Beust
cdd30873d0 1.0.114. 2018-03-21 15:17:41 -07:00
Cedric Beust
b368aedef2 MetaArchive fix. 2018-03-21 15:17:20 -07:00
Cedric Beust
8d938bac2e 1.0.113. 2018-03-21 10:15:44 -07:00
Cedric Beust
50b31114f6 Remove warning when failing to parse the version number.
Fixes https://github.com/cbeust/kobalt/issues/475
2018-03-21 10:15:44 -07:00
Cedric Beust
c6b180dd71
Merge pull request #478 from avently/master
Added "offline" argument to prevent remote resolving of dependencies
2018-03-21 10:15:29 -07:00
Avently
f1a025036f Added "offline" argument to prevent remote resolving of dependencies 2018-03-21 18:25:44 +03:00
Cedric Beust
2241323498 Bump JUnit 5 versions. 2018-03-17 12:52:54 -07:00
Cedric Beust
6c031cd3c1 1.0.112. 2018-02-23 00:59:25 -08:00
Cedric Beust
a6f36de6a6 Create directories before actual entries in the jar file. 2018-02-23 00:59:13 -08:00
Cedric Beust
df89933cc8 1.0.111. 2018-02-21 16:50:30 -08:00
Cedric Beust
f95075c1ae Update KobaltClient to the correct WebSocket library. 2018-02-21 16:47:32 -08:00
Cedric Beust
49bc2b3a15 1.0.110. 2018-02-13 16:07:44 -08:00
Cedric Beust
03e94157c7 Revert. 2018-02-13 16:07:40 -08:00
Cedric Beust
700a8fbca8 1.0.108. 2018-02-13 13:58:25 -08:00
Cedric Beust
7df320b4c7 Reverting to Kotlin 1.2.10.
Until https://youtrack.jetbrains.com/issue/KT-22542 is fixed.

Fixes https://github.com/cbeust/kobalt/issues/472
2018-02-13 13:58:13 -08:00
Cedric Beust
82fa2081fc Unused. 2018-02-13 13:57:05 -08:00
Cedric Beust
ae82395fdf Bump bndlib. 2018-02-13 12:53:57 -08:00
Cedric Beust
4af7e2d36a 1.0.107. 2018-02-13 12:53:50 -08:00
Cedric Beust
645901d988 Fix build directory for the application plug-in.
Fixes https://github.com/cbeust/kobalt/issues/473
2018-02-13 12:53:32 -08:00
Cedric Beust
3d23f38239 1.0.105. 2018-02-05 09:17:24 -08:00
Cedric Beust
c2174fe1e7 Warnings. 2018-02-05 09:16:47 -08:00
Cedric Beust
11a1f427a0 1.0.106. 2018-02-04 04:42:56 -08:00
Cedric Beust
4281a1cad8 Fix empty new line in manifest. 2018-02-04 04:39:02 -08:00
Cedric Beust
d7a95d0c0c Warnings 2018-02-03 11:40:07 -08:00
Cedric Beust
7d27cd144d Exclude MANIFESTS from other jar files. 2018-02-03 11:17:44 -08:00
Cedric Beust
c1364c82a0 1.4.0. 2018-02-03 10:33:33 -08:00
Cedric Beust
52f5ceb3d6 Add MANIFEST.MF at the top of the jar file 2018-02-03 10:28:45 -08:00
Cedric Beust
7a2c4f34da Merge branch 'master' of github.com:cbeust/kobalt 2018-01-26 23:59:54 -08:00
Cedric Beust
32bf92e8c8
Merge pull request #470 from ethauvin/master
No longer create directories, etc. when --help or --version are used.
2018-01-26 23:59:16 -08:00
Cedric Beust
d2d0c7603d 1.0.103. 2018-01-26 23:23:34 -08:00
Cedric Beust
7d3549ec27 Kotlin 1.2.21. 2018-01-26 23:23:24 -08:00
Cedric Beust
026b0e209f Reverting back to Kotlin 1.2.10. 2018-01-26 23:15:16 -08:00
Cedric Beust
cce09756af 1.0.101. 2018-01-26 16:43:18 -08:00
Cedric Beust
323bfae756 Fix the Osgi plug-in. 2018-01-26 16:41:15 -08:00
22d983d559 Added --version argument to app. 2018-01-20 17:04:56 -08:00
41ba68c630 No longer create directories, etc. when --help or --version are used. 2018-01-20 16:15:31 -08:00
Cedric Beust
18c6f38948 Kotlin 1.2.20. 2018-01-17 13:52:26 -08:00
Cedric Beust
964fa3bc0f 1.0.100. 2018-01-08 15:17:13 -08:00
Cedric Beust
576cd56f88 No longer used. 2018-01-08 15:16:57 -08:00
Cedric Beust
2806f5e11b Revert to 1.0.94 while investigating issues with Kotlin 1.2.10. 2018-01-04 15:01:20 -08:00
Cedric Beust
cfbf0143f4 1.0.100. 2018-01-04 14:29:37 -08:00
Cedric Beust
126e7fb500 Bump Kotlin to 1.2.10. 2018-01-04 14:19:41 -08:00
Cedric Beust
0d0dcbbc54 1.0.94. 2018-01-02 16:43:38 -08:00
Cedric Beust
96d11d3dbf 1.0.93. 2017-12-09 09:07:05 -08:00
Cedric Beust
ae59e1d7ff Merge branch 'master' of github.com:cbeust/kobalt 2017-12-09 09:00:09 -08:00
Cedric Beust
84ee57a979 Sign artifacts. 2017-12-09 08:59:51 -08:00
Cedric Beust
fdee66ab93 For 'run', don't use the error stream as an error indicator. 2017-12-09 08:59:23 -08:00
Cedric Beust
6d7490a34d 1.0.92. 2017-11-20 13:42:48 -08:00
Cedric Beust
3d2e5b069d BuildConfig not being generated. (#464). 2017-11-20 13:41:36 -08:00
Cedric Beust
294799ee5d 1.0.91. 2017-11-08 10:50:34 -08:00
Cedric Beust
6ede80e9ce
Merge pull request #463 from ethauvin/master
Added ignore parameters to the application plugin.
2017-11-08 09:16:10 -08:00
20a01f8de0 Added ignoreInputStream, ignoreErrorStream and ignoreExitvalue to the application plugin. 2017-11-08 01:05:16 -08:00
Cedric Beust
72740079ce
Merge pull request #461 from ethauvin/master
Fixed finding tools.jar under Windows when JAVA_HOME is set to JRE.
2017-11-07 09:47:18 -08:00
Cedric Beust
e39be51cb8
Merge pull request #462 from McPringle/master
Code Review Changes
2017-11-06 11:38:57 -08:00
Marcus Fihlon
f4f3827fd1
💬 Adding trimming of line in format string
Before:
    ***** WARNING Old profile syntax detected for "                val debug = false", please update to "val debug by profile()"

    After:
    ***** WARNING Old profile syntax detected for "val debug = false", please update to "val debug by profile()
2017-11-06 19:54:54 +01:00
Marcus Fihlon
70f01fa691
Merge branch 'master' of github.com:cbeust/kobalt 2017-11-06 19:51:32 +01:00
Marcus Fihlon
2e2444c2bc
👌 Code review change
Thanks to @ethauvin for his very good hint!
2017-11-06 19:49:28 +01:00
be40f5c81d Fixed finding tools.jar under Windows when JAVA_HOME is set to JRE. 2017-11-05 17:11:11 -08:00
Cedric Beust
05f8e2f41a
Merge pull request #458 from McPringle/master
Fixing the WAR filename could contain a `null` version #456
2017-11-05 07:02:08 -08:00
Marcus Fihlon
5aef25a4a7
🐛 Fixing the WAR filename contains if version information is missing #456 2017-11-05 03:08:12 -06:00
Cedric Beust
e7ae50fe81
Merge pull request #454 from ethauvin/master
Java 9 initial compatibility
2017-11-04 13:36:08 -07:00
702a34dd4b Made executable in git index. 2017-11-04 12:14:30 -07:00
bd8ba4c497 Added kobatw-test wrapper to build the kobalt project using the jar in kobaltBuild/libs for testing. 2017-11-03 19:03:21 -07:00
a115111168 Added missing jaxb dependency for plugin API. 2017-11-03 19:01:38 -07:00
a431f4850b Syntax fix. 2017-11-03 13:15:15 -07:00
a1aa6d8eea Resolving merge conflict. 2017-11-02 17:47:40 -07:00
49db5a798e Fixed coroutinesSate syntax. 2017-11-02 17:40:14 -07:00
82b89edaee
Merge pull request #455 from pabl0rg/upgrade-to-kotlinc-1-1-51
upgrade to kotlinc 1.1.51
2017-11-02 17:26:42 -07:00
Juan Liska
f6de041fd8 bump kotlin compiler version string const 2017-11-02 17:35:49 -06:00
Juan Liska
629949edd4 upgrade to kotlinc 1.1.51 2017-11-02 17:26:29 -06:00
e8dcfc6d4b More syntax fix. 2017-11-01 10:13:39 -07:00
05d0ff04fb Fixed various syntax. 2017-10-31 23:17:42 -07:00
c99a9eb6cd First try at running under Java 9. 2017-10-31 21:44:57 -07:00
Cedric Beust
86e39cbb58 1.0.90. 2017-09-16 18:25:57 -07:00
Cedric Beust
f92ac752c1 1.0.89/ 2017-07-25 10:40:08 -07:00
Cedric Beust
084f4b5385 Silly oversight, 2017-07-25 10:39:53 -07:00
Cedric Beust
b109674f1a Merge branch 'master' of github.com:cbeust/kobalt 2017-07-25 10:31:29 -07:00
Cedric Beust
f782fa2236 1.0.88. 2017-07-25 10:23:52 -07:00
Cedric Beust
4405cf154c OsgiPlugin bug. 2017-07-25 10:23:17 -07:00
Cedric Beust
aac60fa0a3 Merge pull request #452 from MrTact/kotlin-template-deps
Fixes #451 -- add stdlib and runtime deps to the Kotlin project template
2017-07-19 20:21:01 -07:00
Tim Keating
be29f2c0b3 PR feedback: use version constant instead of hard-coded strings 2017-07-19 22:05:45 -05:00
Tim Keating
9e6b3d26db Fixes #451 -- add stdlib and runtime deps to the Kotlin project template 2017-07-18 00:26:01 -05:00
Cedric Beust
76bd010168 1.0.87. 2017-05-31 09:07:52 -07:00
57 changed files with 1598 additions and 274 deletions

2
.gitignore vendored
View file

@ -11,3 +11,5 @@ libs
out out
.DS_Store .DS_Store
lib/kotlin-* lib/kotlin-*
build
.history

58
build.gradle Normal file
View file

@ -0,0 +1,58 @@
allprojects {
group = 'com.beust'
version = '1.1.0'
}
subprojects {
apply plugin: 'java'
apply plugin: 'maven-publish'
ext {
bndlib = '3.5.0'
findbugs = '3.0.2'
groovy = '2.4.12'
gson = '2.8.2'
guice = '4.2.2'
inject = '1'
jaxb = '2.3.0'
jcommander = '1.72'
kotlin = '1.2.71'
maven = '3.5.2'
mavenResolver = '1.1.0'
okhttp = '3.9.1'
okio = '1.13.0'
retrofit = '2.3.0'
slf4j = '1.7.3'
spark = '2.6.0'
testng = '6.12'
junit = '4.12'
junitJupiter = '5.1.0'
junitPlatform = '1.1.0'
}
repositories {
mavenCentral()
mavenLocal()
jcenter()
maven {
url = 'https://dl.bintray.com/cbeust/maven'
}
maven {
url = 'https://repo.maven.apache.org/maven2'
}
}
sourceCompatibility = '1.7'
task sourcesJar(type: Jar) {
from sourceSets.main.allJava
archiveClassifier = 'sources'
}
task javadocJar(type: Jar) {
from javadoc
archiveClassifier = 'javadoc'
}
}

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View file

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

188
gradlew vendored Executable file
View file

@ -0,0 +1,188 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

100
gradlew.bat vendored Normal file
View file

@ -0,0 +1,100 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem http://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View file

@ -21,26 +21,27 @@ import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream import java.util.zip.ZipOutputStream
val bs = buildScript { val bs = buildScript {
repos("http://dl.bintray.com/cbeust/maven") repos("https://dl.bintray.com/cbeust/maven")
} }
object Versions { object Versions {
val okhttp = "3.2.0" val kotlin = "1.2.71"
val okio = "1.6.0" val okhttp = "3.9.1"
val retrofit = "2.1.0" val okio = "1.13.0"
val gson = "2.6.2" val retrofit = "2.3.0"
val maven = "3.3.9" val gson = "2.8.2"
val mavenResolver = "1.0.3" val guice = "4.2.2"
val maven = "3.5.2"
val mavenResolver = "1.1.0"
val slf4j = "1.7.3" val slf4j = "1.7.3"
val kotlin = "1.1.2"
val aether = "1.0.2.v20150114" val aether = "1.0.2.v20150114"
val testng = "6.11" val testng = "6.12"
val jcommander = "1.72"
// JUnit 5 // JUnit 5
val junit = "4.12" val junit = "4.12"
val junitPlatform = "1.0.0-M4" val junitPlatform = "1.1.0"
val junitJupiter = "5.0.0-M4" val junitJupiter = "5.1.0"
val junitVintageVersion = "$junit.0-M4"
} }
fun mavenResolver(vararg m: String) fun mavenResolver(vararg m: String)
@ -78,6 +79,7 @@ val wrapper = project {
bintray { bintray {
publish = true publish = true
sign = true
} }
pom = createPom(name, "Wrapper for Kobalt") pom = createPom(name, "Wrapper for Kobalt")
@ -90,41 +92,42 @@ val kobaltPluginApi = project {
version = readVersion() version = readVersion()
directory = "modules/kobalt-plugin-api" directory = "modules/kobalt-plugin-api"
description = "A build system in Kotlin" description = "A build system in Kotlin"
url = "http://beust.com/kobalt" url = "https://beust.com/kobalt"
pom = createPom(name, "A build system in Kotlin") pom = createPom(name, "A build system in Kotlin")
dependencies { dependencies {
compile( compile(
"org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}", "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}",
"com.google.inject:guice:4.0", "com.google.inject:guice:${Versions.guice}",
"com.google.inject.extensions:guice-assistedinject:4.0", "com.google.inject.extensions:guice-assistedinject:4.1.0",
"javax.inject:javax.inject:1", "javax.inject:javax.inject:1",
"com.google.guava:guava:21.0", "com.google.guava:guava:27.0.1-jre",
"org.apache.maven:maven-model:${Versions.maven}", "org.apache.maven:maven-model:${Versions.maven}",
"io.reactivex:rxjava:1.1.5", "io.reactivex:rxjava:1.3.3",
"com.squareup.okio:okio:${Versions.okio}", "com.squareup.okio:okio:${Versions.okio}",
"com.google.code.gson:gson:${Versions.gson}", "com.google.code.gson:gson:${Versions.gson}",
"com.squareup.okhttp3:okhttp:${Versions.okhttp}", "com.squareup.okhttp3:okhttp:${Versions.okhttp}",
"com.squareup.retrofit2:retrofit:${Versions.retrofit}", "com.squareup.retrofit2:retrofit:${Versions.retrofit}",
"com.squareup.retrofit2:converter-gson:${Versions.retrofit}", "com.squareup.retrofit2:converter-gson:${Versions.retrofit}",
"com.beust:jcommander:1.48", "com.beust:jcommander:${Versions.jcommander}",
"org.eclipse.jgit:org.eclipse.jgit:4.5.0.201609210915-r", "org.eclipse.jgit:org.eclipse.jgit:4.9.0.201710071750-r",
"org.slf4j:slf4j-simple:${Versions.slf4j}", "org.slf4j:slf4j-simple:${Versions.slf4j}",
*mavenResolver("api", "spi", "util", "impl", "connector-basic", "transport-http", "transport-file"), *mavenResolver("api", "spi", "util", "impl", "connector-basic", "transport-http", "transport-file"),
"org.apache.maven:maven-aether-provider:3.3.9", "org.apache.maven:maven-aether-provider:3.3.9",
"org.testng.testng-remote:testng-remote:1.3.2", "org.testng.testng-remote:testng-remote:1.3.2",
"org.testng:testng:${Versions.testng}", "org.testng:testng:${Versions.testng}",
"commons-io:commons-io:2.5",
"org.junit.platform:junit-platform-surefire-provider:${Versions.junitPlatform}", "org.junit.platform:junit-platform-surefire-provider:${Versions.junitPlatform}",
"org.junit.platform:junit-platform-runner:${Versions.junitPlatform}", "org.junit.platform:junit-platform-runner:${Versions.junitPlatform}",
"org.junit.platform:junit-platform-engine:${Versions.junitPlatform}", "org.junit.platform:junit-platform-engine:${Versions.junitPlatform}",
"org.junit.platform:junit-platform-console:${Versions.junitPlatform}", "org.junit.platform:junit-platform-console:${Versions.junitPlatform}",
"org.junit.jupiter:junit-jupiter-engine:${Versions.junitJupiter}", "org.junit.jupiter:junit-jupiter-engine:${Versions.junitJupiter}",
"org.junit.vintage:junit-vintage-engine:${Versions.junitVintageVersion}", "org.junit.vintage:junit-vintage-engine:${Versions.junitJupiter}",
"org.apache.commons:commons-compress:1.15",
"commons-io:commons-io:2.6",
"org.apache.commons:commons-compress:1.13", // Java 9
"commons-io:commons-io:2.5" "javax.xml.bind:jaxb-api:2.3.0"
) )
exclude(*aether("impl", "spi", "util", "api")) exclude(*aether("impl", "spi", "util", "api"))
} }
@ -161,24 +164,30 @@ val kobaltApp = project(kobaltPluginApi, wrapper) {
// Used by the main app // Used by the main app
compile( compile(
"org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}", "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}",
"com.github.spullara.mustache.java:compiler:0.9.1", "com.github.spullara.mustache.java:compiler:0.9.5",
"javax.inject:javax.inject:1", "javax.inject:javax.inject:1",
"com.google.inject:guice:4.0", "com.google.inject:guice:${Versions.guice}",
"com.google.inject.extensions:guice-assistedinject:4.0", "com.google.inject.extensions:guice-assistedinject:${Versions.guice}",
"com.beust:jcommander:1.65", "com.beust:jcommander:${Versions.jcommander}",
"org.apache.maven:maven-model:${Versions.maven}", "org.apache.maven:maven-model:${Versions.maven}",
"com.google.code.findbugs:jsr305:3.0.1", "com.google.code.findbugs:jsr305:3.0.2",
"com.google.code.gson:gson:${Versions.gson}", "com.google.code.gson:gson:${Versions.gson}",
"com.squareup.retrofit2:retrofit:${Versions.retrofit}", "com.squareup.retrofit2:retrofit:${Versions.retrofit}",
"com.squareup.retrofit2:converter-gson:${Versions.retrofit}", "com.squareup.retrofit2:converter-gson:${Versions.retrofit}",
"com.squareup.okhttp3:okhttp-ws:${Versions.okhttp}", // "com.squareup.okhttp3:okhttp-ws:3.4.2",
"biz.aQute.bnd:bndlib:2.4.0", "biz.aQute.bnd:biz.aQute.bndlib:3.5.0",
*mavenResolver("spi"), *mavenResolver("spi"),
"com.squareup.okhttp3:logging-interceptor:3.2.0", "com.squareup.okhttp3:logging-interceptor:3.9.0",
"com.sparkjava:spark-core:2.5", "com.sparkjava:spark-core:2.6.0",
"org.codehaus.groovy:groovy:2.4.8" "org.codehaus.groovy:groovy:2.4.12",
// Java 9
"javax.xml.bind:jaxb-api:2.3.0",
"com.sun.xml.bind:jaxb-impl:2.3.0",
"com.sun.xml.bind:jaxb-core:2.3.0",
"com.sun.activation:javax.activation:1.2.0"
// "org.eclipse.jetty:jetty-server:${Versions.jetty}", // "org.eclipse.jetty:jetty-server:${Versions.jetty}",
// "org.eclipse.jetty:jetty-servlet:${Versions.jetty}", // "org.eclipse.jetty:jetty-servlet:${Versions.jetty}",
@ -194,7 +203,7 @@ val kobaltApp = project(kobaltPluginApi, wrapper) {
dependenciesTest { dependenciesTest {
compile("org.jetbrains.kotlin:kotlin-test:${Versions.kotlin}", compile("org.jetbrains.kotlin:kotlin-test:${Versions.kotlin}",
"org.testng:testng:${Versions.testng}", "org.testng:testng:${Versions.testng}",
"org.assertj:assertj-core:3.4.1", "org.assertj:assertj-core:3.8.0",
*mavenResolver("util") *mavenResolver("util")
) )
} }
@ -300,13 +309,13 @@ fun taskCopyVersionForWrapper(project: Project) : TaskResult {
fun createPom(projectName: String, projectDescription: String) = Model().apply { fun createPom(projectName: String, projectDescription: String) = Model().apply {
name = projectName name = projectName
description = projectDescription description = projectDescription
url = "http://beust.com/kobalt" url = "https://beust.com/kobalt"
licenses = listOf(License().apply { licenses = listOf(License().apply {
name = "Apache-2.0" name = "Apache-2.0"
url = "http://www.apache.org/licenses/LICENSE-2.0" url = "https://www.apache.org/licenses/LICENSE-2.0"
}) })
scm = Scm().apply { scm = Scm().apply {
url = "http://github.com/cbeust/kobalt" url = "https://github.com/cbeust/kobalt"
connection = "https://github.com/cbeust/kobalt.git" connection = "https://github.com/cbeust/kobalt.git"
developerConnection = "git@github.com:cbeust/kobalt.git" developerConnection = "git@github.com:cbeust/kobalt.git"
} }

View file

@ -1 +1 @@
kobalt.version=1.0.86 kobalt.version=1.0.122

8
kobaltw-test Executable file
View file

@ -0,0 +1,8 @@
#!/usr/bin/env sh
JAR=$(ls -1 -t kobaltBuild/libs/*.jar | grep -Ev "(sources|javadoc)" | head -1)
TEMPDIR=$(mktemp -d)
cp -pf "$JAR" "$TEMPDIR"
TEMPJAR=$TEMPDIR/$(basename "$JAR")
export KOBALT_JAR=$TEMPJAR
java -jar "$TEMPJAR" "$@"
rm -rf "$TEMPDIR"

View file

@ -0,0 +1,85 @@
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.2.71'
id 'com.github.johnrengelman.shadow' version '5.0.0'
}
dependencies {
implementation "biz.aQute.bnd:biz.aQute.bndlib:$bndlib"
implementation "com.google.code.findbugs:jsr305:$findbugs"
implementation "com.sparkjava:spark-core:$spark"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp"
implementation 'commons-io:commons-io:2.6'
implementation 'io.reactivex:rxjava:1.3.3'
implementation "javax.inject:javax.inject:$inject"
implementation "javax.xml.bind:jaxb-api:$jaxb"
implementation 'org.apache.commons:commons-compress:1.15'
implementation 'org.apache.maven:maven-aether-provider:3.3.9'
implementation "org.apache.maven.resolver:maven-resolver-api:$mavenResolver"
implementation "org.apache.maven.resolver:maven-resolver-connector-basic:$mavenResolver"
implementation "org.apache.maven.resolver:maven-resolver-impl:$mavenResolver"
implementation "org.apache.maven.resolver:maven-resolver-spi:$mavenResolver"
implementation "org.apache.maven.resolver:maven-resolver-transport-file:$mavenResolver"
implementation "org.apache.maven.resolver:maven-resolver-transport-http:$mavenResolver"
implementation "org.apache.maven.resolver:maven-resolver-util:$mavenResolver"
implementation "org.codehaus.groovy:groovy:$groovy"
implementation 'org.eclipse.jgit:org.eclipse.jgit:4.9.0.201710071750-r'
implementation "org.junit.jupiter:junit-jupiter-engine:$junitJupiter"
implementation "org.junit.platform:junit-platform-console:$junitPlatform"
implementation "org.junit.platform:junit-platform-engine:$junitPlatform"
implementation "org.junit.platform:junit-platform-runner:$junitPlatform"
implementation "org.junit.platform:junit-platform-surefire-provider:$junitPlatform"
implementation "org.junit.vintage:junit-vintage-engine:$junitJupiter"
implementation "org.slf4j:slf4j-simple:$slf4j"
implementation "org.testng:testng:$testng"
implementation 'org.testng.testng-remote:testng-remote:1.3.2'
implementation "com.beust:jcommander:$jcommander"
implementation "com.google.code.gson:gson:$gson"
implementation "com.google.inject:guice:$guice"
implementation "com.google.inject.extensions:guice-assistedinject:$guice"
implementation "com.squareup.okio:okio:$okio"
implementation "com.squareup.retrofit2:converter-gson:$retrofit"
implementation "com.squareup.retrofit2:retrofit:$retrofit"
implementation "org.apache.maven:maven-model:$maven"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin"
}
shadowJar {
classifier = null
}
test {
useTestNG()
}
publishing {
publications {
shadow(MavenPublication) { publication ->
project.shadow.component(publication)
artifact sourcesJar
artifact javadocJar
pom {
name = project.name
description = 'A build system in Kotlin'
url = 'https://beust.com/kobalt'
licenses {
license {
name = 'Apache-2.0'
url = 'https://www.apache.org/licenses/LICENSE-2.0'
}
}
developers {
developer {
name = 'Cedric Beust'
email = 'cedric@beust.com'
}
}
scm {
connection = 'scm:https://github.com/cbeust/kobalt.git'
developerConnection = 'scm:git@github.com:cbeust/kobalt.git'
url = 'https://github.com/cbeust/kobalt'
}
}
}
}
}

View file

@ -0,0 +1,279 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.beust</groupId>
<artifactId>kobalt-pom</artifactId>
<version>1.1.0</version>
<relativePath>../..</relativePath>
</parent>
<artifactId>kobalt-plugin-api</artifactId>
<packaging>jar</packaging>
<version>1.1.0</version>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-aether-provider</artifactId>
<version>3.3.9</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.aether</groupId>
<artifactId>impl</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.aether</groupId>
<artifactId>spi</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.aether</groupId>
<artifactId>util</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.aether</groupId>
<artifactId>api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-api</artifactId>
<version>${mavenresolver.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-spi</artifactId>
<version>${mavenresolver.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-util</artifactId>
<version>${mavenresolver.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-impl</artifactId>
<version>${mavenresolver.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-connector-basic</artifactId>
<version>${mavenresolver.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-transport-http</artifactId>
<version>${mavenresolver.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-transport-file</artifactId>
<version>${mavenresolver.version}</version>
</dependency>
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>${okio.version}</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-assistedinject</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.72</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-gson</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>biz.aQute.bnd</groupId>
<artifactId>biz.aQute.bndlib</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>${okhttp3.version}</version>
</dependency>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.12</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.15</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-engine</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-console</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junitJupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junitJupiter.version}</version>
</dependency>
<dependency>
<groupId>org.testng.testng-remote</groupId>
<artifactId>testng-remote</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>4.9.0.201710071750-r</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- java 9 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals> <goal>compile</goal> </goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<goals> <goal>test-compile</goal> </goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<executions>
<!-- Replacing default-compile as it is treated specially by maven -->
<execution>
<id>default-compile</id>
<phase>none</phase>
</execution>
<!-- Replacing default-testCompile as it is treated specially by maven -->
<execution>
<id>default-testCompile</id>
<phase>none</phase>
</execution>
<execution>
<id>java-compile</id>
<phase>compile</phase>
<goals> <goal>compile</goal> </goals>
</execution>
<execution>
<id>java-test-compile</id>
<phase>test-compile</phase>
<goals> <goal>testCompile</goal> </goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View file

@ -61,6 +61,9 @@ class Args {
@Parameter(names = arrayOf("--noIncremental"), description = "Turn off incremental builds") @Parameter(names = arrayOf("--noIncremental"), description = "Turn off incremental builds")
var noIncremental: Boolean = false var noIncremental: Boolean = false
@Parameter(names = arrayOf("--offline"), description = "Don't try to download dependencies even if there is no cached version")
var offline: Boolean = false
@Parameter(names = arrayOf("--plugins"), description = "Comma-separated list of plug-in Maven id's") @Parameter(names = arrayOf("--plugins"), description = "Comma-separated list of plug-in Maven id's")
var pluginIds: String? = null var pluginIds: String? = null
@ -101,5 +104,8 @@ class Args {
@Parameter(names = arrayOf("--update"), description = "Update to the latest version of Kobalt") @Parameter(names = arrayOf("--update"), description = "Update to the latest version of Kobalt")
var update: Boolean = false var update: Boolean = false
@Parameter(names = arrayOf("--version"), description = "Display the current version of Kobalt")
var version: Boolean = false
} }

View file

@ -9,13 +9,13 @@ object Constants {
val BUILD_FILE_NAME = "Build.kt" val BUILD_FILE_NAME = "Build.kt"
val BUILD_FILE_DIRECTORY = "kobalt/src" val BUILD_FILE_DIRECTORY = "kobalt/src"
val BUILD_FILE_PATH = KFiles.joinDir(BUILD_FILE_DIRECTORY, BUILD_FILE_NAME) val BUILD_FILE_PATH = KFiles.joinDir(BUILD_FILE_DIRECTORY, BUILD_FILE_NAME)
val KOTLIN_COMPILER_VERSION = "1.1.2" val KOTLIN_COMPILER_VERSION = "1.2.70"
internal val DEFAULT_REPOS = listOf<HostConfig>( internal val DEFAULT_REPOS = listOf<HostConfig>(
// "https://maven-central.storage.googleapis.com/", // "https://maven-central.storage.googleapis.com/",
HostConfig("http://repo1.maven.org/maven2/", "Maven"), HostConfig("https://repo1.maven.org/maven2/", "Maven"),
HostConfig("https://jcenter.bintray.com/", "JCenter") HostConfig("https://jcenter.bintray.com/", "JCenter")
// "http://repository.jetbrains.com/all/", // <-- contains snapshots // "https://repository.jetbrains.com/all/", // <-- contains snapshots
// snapshots // snapshots
// "https://oss.sonatype.org/content/repositories/snapshots/" // "https://oss.sonatype.org/content/repositories/snapshots/"

View file

@ -67,7 +67,7 @@ open class Jvm constructor(
return toolsJar return toolsJar
} }
if (javaHome!!.name.equals("jre", true)) { if (javaHome!!.name.equals("jre", true)) {
javaHome = javaHome!!.parentFile _javaHome = javaHome!!.parentFile
toolsJar = File(javaHome, "lib/tools.jar") toolsJar = File(javaHome, "lib/tools.jar")
if (toolsJar.exists()) { if (toolsJar.exists()) {
return toolsJar return toolsJar
@ -78,7 +78,7 @@ open class Jvm constructor(
val version = SystemProperties.Companion.javaVersion val version = SystemProperties.Companion.javaVersion
if (javaHome!!.name.toRegex().matches("jre\\d+") if (javaHome!!.name.toRegex().matches("jre\\d+")
|| javaHome!!.name == "jre$version") { || javaHome!!.name == "jre$version") {
javaHome = File(javaHome!!.parentFile, "jdk$version") _javaHome = File(javaHome!!.parentFile, "jdk$version")
toolsJar = File(javaHome, "lib/tools.jar") toolsJar = File(javaHome, "lib/tools.jar")
if (toolsJar.exists()) { if (toolsJar.exists()) {
return toolsJar return toolsJar

View file

@ -126,61 +126,62 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
var generatedSourceDirectory: File? = null var generatedSourceDirectory: File? = null
// private fun findBuildTypeBuildConfig(project: Project, variant: Variant?) : BuildConfig? { private fun findBuildTypeBuildConfig(project: Project, variant: Variant?) : BuildConfig? {
// val buildTypeName = variant?.buildType?.name val buildTypeName = variant?.buildType?.name
// return project.buildTypes[buildTypeName]?.buildConfig return project.buildTypes[buildTypeName]?.buildConfig
// } }
//
// private fun findProductFlavorBuildConfig(project: Project, variant: Variant?) : BuildConfig? { private fun findProductFlavorBuildConfig(project: Project, variant: Variant?) : BuildConfig? {
// val buildTypeName = variant?.productFlavor?.name val buildTypeName = variant?.productFlavor?.name
// return project.productFlavors[buildTypeName]?.buildConfig return project.productFlavors[buildTypeName]?.buildConfig
// } }
/** /**
* Return a list of the BuildConfigs found on the productFlavor{}, buildType{} and project{} (in that order). * Return a list of the BuildConfigs found on the productFlavor{}, buildType{} and project{} (in that order).
*/ */
// private fun findBuildConfigs(project: Project, variant: Variant?) : List<BuildConfig> { private fun findBuildConfigs(project: Project, variant: Variant?) : List<BuildConfig> {
// val result = listOf( val result = listOf(
// findBuildTypeBuildConfig(project, variant), findBuildTypeBuildConfig(project, variant),
// findProductFlavorBuildConfig(project, variant), findProductFlavorBuildConfig(project, variant),
// project.buildConfig) project.buildConfig)
// .filterNotNull() .filterNotNull()
//
// return result return result
// } }
/** /**
* Generate BuildConfig.java if requested. Also look up if any BuildConfig is defined on the current build type, * Generate BuildConfig.java if requested. Also look up if any BuildConfig is defined on the current build type,
* product flavor or main project, and use them to generateAndSave any additional field (in that order to * product flavor or main project, and use them to generateAndSave any additional field (in that order to
* respect the priorities). Return the generated file if it was generated, null otherwise. * respect the priorities). Return the generated file if it was generated, null otherwise.
*/ */
// fun maybeGenerateBuildConfig(project: Project, context: KobaltContext) : File? { fun maybeGenerateBuildConfig(project: Project, context: KobaltContext) : File? {
// val buildConfigs = findBuildConfigs(project, this) val buildConfigs = findBuildConfigs(project, this)
//
// if (buildConfigs.size > 0) { if (buildConfigs.size > 0) {
// val pkg = project.packageName ?: project.group val pkg = project.packageName ?: project.group
// ?: throw KobaltException( ?: throw KobaltException(
// "packageName needs to be defined on the project in order to generateAndSave BuildConfig") "packageName needs to be defined on the project in order to generateAndSave BuildConfig")
//
// val contributor = ActorUtils.selectAffinityActor(context.pluginInfo.buildConfigContributors, project) val contributor = ActorUtils.selectAffinityActor(project, context,
// if (contributor != null) { context.pluginInfo.buildConfigContributors)
// val code = contributor.generateBuildConfig(project, context, pkg, this, buildConfigs) if (contributor != null) {
// val result = KFiles.makeDir(KFiles.generatedSourceDir(project, this, "buildConfig")) val code = contributor.generateBuildConfig(project, context, pkg, this, buildConfigs)
// // Make sure the generatedSourceDirectory doesn't contain the project.directory since val result = KFiles.makeDir(KFiles.generatedSourceDir(project, this, "buildConfig"))
// // that directory will be added when trying to find recursively all the sources in it // Make sure the generatedSourceDirectory doesn't contain the project.directory since
// generatedSourceDirectory = result.relativeTo(File(project.directory)) // that directory will be added when trying to find recursively all the sources in it
// val outputGeneratedSourceDirectory = File(result, pkg.replace('.', File.separatorChar)) generatedSourceDirectory = result.relativeTo(File(project.directory))
// val outputDir = File(outputGeneratedSourceDirectory, "BuildConfig." + contributor.buildConfigSuffix) val outputGeneratedSourceDirectory = File(result, pkg.replace('.', File.separatorChar))
// KFiles.saveFile(outputDir, code) val outputDir = File(outputGeneratedSourceDirectory, "BuildConfig." + contributor.buildConfigSuffix)
// context.logger.log(project.name, 2, "Generated ${outputDir.path}") KFiles.saveFile(outputDir, code)
// return result context.logger.log(project.name, 2, "Generated ${outputDir.path}")
// } else { return result
// throw KobaltException("Couldn't find a contributor to generateAndSave BuildConfig") } else {
// } throw KobaltException("Couldn't find a contributor to generateAndSave BuildConfig")
// } else { }
// return null } else {
// } return null
// } }
}
override fun toString() = toTask("") override fun toString() = toTask("")

View file

@ -5,7 +5,7 @@ import com.beust.kobalt.Variant
/** /**
* Plug-ins that can generate a BuildConfig file. * Plug-ins that can generate a BuildConfig file.
*/ */
interface IBuildConfigContributor : ISimpleAffinity<Project> { interface IBuildConfigContributor : IProjectAffinity {
fun generateBuildConfig(project: Project, context: KobaltContext, packageName: String, variant: Variant, fun generateBuildConfig(project: Project, context: KobaltContext, packageName: String, variant: Variant,
buildConfigs: List<BuildConfig>) : String buildConfigs: List<BuildConfig>) : String

View file

@ -17,7 +17,8 @@ class Archives {
@ExportedProjectProperty(doc = "The name of the a jar file with a main() method", type = "String") @ExportedProjectProperty(doc = "The name of the a jar file with a main() method", type = "String")
const val JAR_NAME_WITH_MAIN_CLASS = "jarNameWithMainClass" const val JAR_NAME_WITH_MAIN_CLASS = "jarNameWithMainClass"
fun defaultArchiveName(project: Project) = project.name + "-" + project.version fun defaultArchiveName(project: Project) = project.name +
if (project.version.isNullOrBlank()) "" else "-${project.version}"
fun generateArchive(project: Project, fun generateArchive(project: Project,
context: KobaltContext, context: KobaltContext,

View file

@ -9,7 +9,6 @@ import java.io.Closeable
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileOutputStream import java.io.FileOutputStream
import java.nio.file.Files
import java.util.jar.Manifest import java.util.jar.Manifest
import org.apache.commons.compress.archivers.zip.ZipFile as ApacheZipFile import org.apache.commons.compress.archivers.zip.ZipFile as ApacheZipFile
@ -19,18 +18,39 @@ import org.apache.commons.compress.archivers.zip.ZipFile as ApacheZipFile
*/ */
class MetaArchive(outputFile: File, val manifest: Manifest?) : Closeable { class MetaArchive(outputFile: File, val manifest: Manifest?) : Closeable {
companion object { companion object {
val MANIFEST_MF = "META-INF/MANIFEST.MF" const val MANIFEST_MF = "META-INF/MANIFEST.MF"
} }
private val zos = ZipArchiveOutputStream(outputFile).apply { private val zos= ZipArchiveOutputStream(outputFile).apply {
encoding = "UTF-8" encoding = "UTF-8"
} }
init {
// If no manifest was passed, create an empty one so it's the first one in the archive
val m = manifest ?: Manifest()
val manifestFile = File.createTempFile("kobalt", "tmpManifest")
addEntry(ZipArchiveEntry("META-INF/"), null)
if (manifest != null) {
FileOutputStream(manifestFile).use { fos ->
m.write(fos)
}
}
val entry = zos.createArchiveEntry(manifestFile, MetaArchive.MANIFEST_MF)
addEntry(entry, FileInputStream(manifestFile))
}
fun addFile(f: File, entryFile: File, path: String?) { fun addFile(f: File, entryFile: File, path: String?) {
maybeCreateParentDirectories(f)
addFile2(f, entryFile, path)
}
private fun addFile2(f: File, entryFile: File, path: String?) {
val file = f.normalize() val file = f.normalize()
FileInputStream(file).use { inputStream -> FileInputStream(file).use { inputStream ->
val actualPath = KFiles.fixSlashes(if (path != null) path + entryFile.path else entryFile.path) val actualPath = KFiles.fixSlashes(if (path != null) path + entryFile.path else entryFile.path)
ZipArchiveEntry(actualPath).let { entry -> ZipArchiveEntry(actualPath).let { entry ->
maybeCreateParentDirectories(File(actualPath))
maybeAddEntry(entry) { maybeAddEntry(entry) {
addEntry(entry, inputStream) addEntry(entry, inputStream)
} }
@ -38,6 +58,30 @@ class MetaArchive(outputFile: File, val manifest: Manifest?) : Closeable {
} }
} }
private val createdDirs = hashSetOf<String>()
/**
* For an entry a/b/c/File, an entry needs to be created for each individual directory:
* a/
* a/b/
* a/b/c
* a/b/c/File
*/
private fun maybeCreateParentDirectories(file: File) {
val toCreate = arrayListOf<String>()
var current = file.parentFile
while (current != null && current.path != ".") {
if (!createdDirs.contains(current.path)) {
toCreate.add(0, KFiles.fixSlashes(current) + "/")
createdDirs.add(current.path)
}
current = current.parentFile
}
toCreate.forEach { dir ->
addEntry(ZipArchiveEntry(dir), null)
}
}
fun addArchive(jarFile: File) { fun addArchive(jarFile: File) {
ApacheZipFile(jarFile).use { jar -> ApacheZipFile(jarFile).use { jar ->
val jarEntries = jar.entries val jarEntries = jar.entries
@ -49,40 +93,33 @@ class MetaArchive(outputFile: File, val manifest: Manifest?) : Closeable {
} }
} }
private val DEFAULT_JAR_EXCLUDES =
Glob("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA")
private val seen = hashSetOf<String>()
private fun okToAdd(name: String): Boolean = ! seen.contains(name) private fun okToAdd(name: String) : Boolean {
&& ! KFiles.isExcluded(name, DEFAULT_JAR_EXCLUDES) val result = !KFiles.isExcluded(name,
Glob("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", MANIFEST_MF))
override fun close() { // if (name.startsWith("META-INF")) println((if (result) "ADDING" else "NOT ADDING") + " $name")
if (manifest != null) { return result
Files.createTempFile("aaa", "bbb").toFile().let { manifestFile ->
FileOutputStream(manifestFile).use { fos ->
manifest.write(fos)
} }
val entry = zos.createArchiveEntry(manifestFile, MetaArchive.MANIFEST_MF) override fun close() = zos.close()
addEntry(entry, FileInputStream(manifestFile))
}
}
zos.close()
}
private fun addEntry(entry: ArchiveEntry, inputStream: FileInputStream) { private fun addEntry(entry: ArchiveEntry, inputStream: FileInputStream?) {
zos.putArchiveEntry(entry) zos.putArchiveEntry(entry)
inputStream.use { ins -> inputStream?.use { ins ->
ins.copyTo(zos, 50 * 1024) ins.copyTo(zos, 50 * 1024)
} }
zos.closeArchiveEntry() zos.closeArchiveEntry()
} }
private val seen = hashSetOf<String>()
private fun maybeAddEntry(entry: ArchiveEntry, action:() -> Unit) { private fun maybeAddEntry(entry: ArchiveEntry, action:() -> Unit) {
if (okToAdd(entry.name)) { entry.name.let { name ->
if (!seen.contains(name) && okToAdd(name)) {
action() action()
} }
seen.add(entry.name) seen.add(name)
}
} }
} }

View file

@ -2,7 +2,7 @@ package com.beust.kobalt.internal
class DocUrl { class DocUrl {
companion object { companion object {
private const val HOST = "http://beust.com/kobalt/" private const val HOST = "https://beust.com/kobalt/"
private fun url(path: String) = HOST + path private fun url(path: String) = HOST + path
val PUBLISH_PLUGIN_URL = url("plug-ins/index.html#publishing") val PUBLISH_PLUGIN_URL = url("plug-ins/index.html#publishing")

View file

@ -112,10 +112,11 @@ abstract class GenericTestRunner: ITestRunnerContributor {
configName: String) : TestResult { configName: String) : TestResult {
var result = false var result = false
context.logger.log(project.name, 1, "Running tests with " + runnerName) context.logger.log(project.name, 1, "Running tests with $runnerName")
val testConfig = project.testConfigs.firstOrNull { it.name == configName } val testConfig = project.testConfigs.firstOrNull { it.name == configName }
var errorCode = -1
if (testConfig != null) { if (testConfig != null) {
val args = args(project, context, classpath, testConfig) val args = args(project, context, classpath, testConfig)
if (args.size > 0) { if (args.size > 0) {
@ -136,12 +137,7 @@ abstract class GenericTestRunner: ITestRunnerContributor {
context.logger.log(project.name, 2, "Running tests with classpath size ${classpath.size}") context.logger.log(project.name, 2, "Running tests with classpath size ${classpath.size}")
context.logger.log(project.name, 2, "Launching " + allArgs.joinToString(" ")) context.logger.log(project.name, 2, "Launching " + allArgs.joinToString(" "))
val process = pb.start() val process = pb.start()
val errorCode = process.waitFor() errorCode = process.waitFor()
if (errorCode == 0) {
context.logger.log(project.name, 1, "All tests passed")
} else {
context.logger.log(project.name, 1, "Test failures")
}
result = result || errorCode == 0 result = result || errorCode == 0
} else { } else {
context.logger.log(project.name, 1, " No tests to run") context.logger.log(project.name, 1, " No tests to run")
@ -152,6 +148,13 @@ abstract class GenericTestRunner: ITestRunnerContributor {
} }
onFinish(project) onFinish(project)
if (errorCode == 0) {
context.logger.log(project.name, 1, "All tests passed")
} else {
context.logger.log(project.name, 1, longMessage!!)
}
return TestResult(result, shortMessage, longMessage) return TestResult(result, shortMessage, longMessage)
} }

View file

@ -35,7 +35,8 @@ class JUnit5Runner @Inject constructor(kFiles: KFiles) : GenericTestRunner() {
override fun affinity(project: Project, context: KobaltContext) : Int { override fun affinity(project: Project, context: KobaltContext) : Int {
val result = val result =
if (project.testDependencies.any { it.id.contains("jupiter") }) IAffinity.DEFAULT_POSITIVE_AFFINITY + 100 if (project.testDependencies.any { it.id.contains("junit5") || it.id.contains("jupiter") })
IAffinity.DEFAULT_POSITIVE_AFFINITY + 100
else 0 else 0
return result return result

View file

@ -157,6 +157,10 @@ open class JvmCompilerPlugin @Inject constructor(
if (compilerContributors.isEmpty()) { if (compilerContributors.isEmpty()) {
throw KobaltException("Couldn't find any compiler for project ${project.name}") throw KobaltException("Couldn't find any compiler for project ${project.name}")
} else { } else {
// Generate BuildConfig if applicable
context.variant.maybeGenerateBuildConfig(project, context)
val allCompilers = compilerContributors.flatMap { it.compilersFor(project, context)}.sorted() val allCompilers = compilerContributors.flatMap { it.compilersFor(project, context)}.sorted()
/** /**
@ -183,8 +187,8 @@ open class JvmCompilerPlugin @Inject constructor(
var done = false var done = false
// The directory where the classes get compiled // The directory where the classes get compiled
val buildDirectory = val buildDirectory =
if (isTest) File(project.buildDirectory, KFiles.TEST_CLASSES_DIR) if (isTest) File(KFiles.joinDir(project.buildDirectory, KFiles.TEST_CLASSES_DIR))
else File(project.classesDir(context)) else File(KFiles.joinDir(project.classesDir(context)))
allCompilersSorted.doWhile({ ! done }) { compiler -> allCompilersSorted.doWhile({ ! done }) { compiler ->
val compilerResults = compilerUtils.invokeCompiler(project, context, compiler, val compilerResults = compilerUtils.invokeCompiler(project, context, compiler,

View file

@ -16,6 +16,5 @@ class KotlinJarFiles @Inject constructor(val dependencyManager: DependencyManage
} }
val stdlib: File get() = getKotlinCompilerJar("stdlib") val stdlib: File get() = getKotlinCompilerJar("stdlib")
val runtime: File get() = getKotlinCompilerJar("runtime")
val compiler: File get() = getKotlinCompilerJar("compiler-embeddable") val compiler: File get() = getKotlinCompilerJar("compiler-embeddable")
} }

View file

@ -14,11 +14,14 @@ import org.testng.remote.strprotocol.MessageHelper
import org.testng.remote.strprotocol.MessageHub import org.testng.remote.strprotocol.MessageHub
import org.testng.remote.strprotocol.TestResultMessage import org.testng.remote.strprotocol.TestResultMessage
import org.w3c.dom.Attr import org.w3c.dom.Attr
import org.w3c.dom.NodeList
import org.xml.sax.InputSource import org.xml.sax.InputSource
import java.io.File import java.io.File
import java.io.FileReader import java.io.FileReader
import java.io.IOException import java.io.IOException
import javax.xml.parsers.DocumentBuilderFactory import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.xpath.XPathConstants
import javax.xml.xpath.XPathFactory
class TestNgRunner : GenericTestRunner() { class TestNgRunner : GenericTestRunner() {
@ -27,7 +30,10 @@ class TestNgRunner : GenericTestRunner() {
override val annotationPackage = "org.testng" override val annotationPackage = "org.testng"
override val runnerName = "TestNG" override val runnerName = "TestNG"
fun defaultOutput(project: Project) = KFiles.joinDir(project.buildDirectory, "test-output") private fun defaultOutputWithoutProjectDir(project: Project)
= KFiles.joinDir(project.buildDirectory, "test-output")
private fun defaultOutput(project: Project)
= KFiles.joinDir(project.directory, project.buildDirectory, "test-output")
override fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>, override fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>,
testConfig: TestConfig) = arrayListOf<String>().apply { testConfig: TestConfig) = arrayListOf<String>().apply {
@ -39,7 +45,9 @@ class TestNgRunner : GenericTestRunner() {
if (testConfig.testArgs.none { it == "-d" }) { if (testConfig.testArgs.none { it == "-d" }) {
add("-d") add("-d")
add(defaultOutput(project)) // Don't include the project directory here since the generic runner will cd to that directory before
// running the tests
add(defaultOutputWithoutProjectDir(project))
} }
if (testConfig.testArgs.size == 0) { if (testConfig.testArgs.size == 0) {
@ -77,6 +85,15 @@ class TestNgRunner : GenericTestRunner() {
var failed = 0 var failed = 0
var skipped = 0 var skipped = 0
var passed = 0 var passed = 0
val xp = XPathFactory.newInstance().newXPath()
val testMethods = xp.compile("/testng-results/suite/test/class/test-method[@status='FAIL']")
.evaluate(doc, XPathConstants.NODESET)
as NodeList
val failedMethods = arrayListOf<String>()
repeat(testMethods.length) {
val tm = testMethods.item(it)
failedMethods.add(tm.attributes.getNamedItem("signature").textContent)
}
repeat(root.attributes.length) { repeat(root.attributes.length) {
val attribute = root.attributes.item(it) val attribute = root.attributes.item(it)
if (attribute is Attr) when (attribute.name) { if (attribute is Attr) when (attribute.name) {
@ -90,6 +107,7 @@ class TestNgRunner : GenericTestRunner() {
shortMessage = "$passed tests" shortMessage = "$passed tests"
} else if (failed > 0) { } else if (failed > 0) {
shortMessage = "$failed failed" + (if (skipped > 0) ", $skipped skipped" else "") + " tests" shortMessage = "$failed failed" + (if (skipped > 0) ", $skipped skipped" else "") + " tests"
longMessage = "Failed tests:\n " + failedMethods.joinToString("\n ")
} }
} }
} }

View file

@ -2,6 +2,7 @@ package com.beust.kobalt.maven.aether
import com.beust.kobalt.internal.KobaltSettings import com.beust.kobalt.internal.KobaltSettings
import com.google.common.eventbus.EventBus import com.google.common.eventbus.EventBus
import com.beust.kobalt.Args
import org.eclipse.aether.DefaultRepositorySystemSession import org.eclipse.aether.DefaultRepositorySystemSession
import org.eclipse.aether.RepositorySystem import org.eclipse.aether.RepositorySystem
import org.eclipse.aether.repository.LocalRepository import org.eclipse.aether.repository.LocalRepository
@ -32,8 +33,9 @@ object Booter {
// } // }
fun newRepositorySystemSession(system: RepositorySystem, repo: File, settings: KobaltSettings, fun newRepositorySystemSession(system: RepositorySystem, repo: File, settings: KobaltSettings,
eventBus: EventBus): DefaultRepositorySystemSession { args: Args, eventBus: EventBus): DefaultRepositorySystemSession {
val session = MavenRepositorySystemUtils.newSession(settings) val session = MavenRepositorySystemUtils.newSession(settings)
session.isOffline = args.offline
val localRepo = LocalRepository(repo.absolutePath) val localRepo = LocalRepository(repo.absolutePath)
session.localRepositoryManager = system.newLocalRepositoryManager(session, localRepo) session.localRepositoryManager = system.newLocalRepositoryManager(session, localRepo)

View file

@ -52,7 +52,7 @@ class KobaltMavenResolver @Inject constructor(val settings: KobaltSettings,
} }
fun error(s1: String, s2: String) { fun error(s1: String, s2: String) {
throw KobaltException("Found \"$s1\" but not \"$s2\" in local.properties for ${Kurl.KEY}.$host", throw KobaltException("Found \"$s1\" but not \"$s2\" in local.properties for ${Kurl.KEY}.$host",
docUrl = "http://beust.com/kobalt/documentation/index.html#maven-repos-authenticated") docUrl = "https://beust.com/kobalt/documentation/index.html#maven-repos-authenticated")
} }
if (! hostInfo.username.isNullOrBlank() && hostInfo.password.isNullOrBlank()) { if (! hostInfo.username.isNullOrBlank() && hostInfo.password.isNullOrBlank()) {
error("username", "password") error("username", "password")
@ -141,7 +141,7 @@ class KobaltMavenResolver @Inject constructor(val settings: KobaltSettings,
fun create(id: String, optional: Boolean) = AetherDependency(DefaultArtifact(id), optional, args) fun create(id: String, optional: Boolean) = AetherDependency(DefaultArtifact(id), optional, args)
private val system = Booter.newRepositorySystem() private val system = Booter.newRepositorySystem()
private val session = Booter.newRepositorySystemSession(system, localRepo.localRepo, settings, eventBus) private val session = Booter.newRepositorySystemSession(system, localRepo.localRepo, settings, args, eventBus)
private fun createRepo(hostConfig: HostConfig) : RemoteRepository { private fun createRepo(hostConfig: HostConfig) : RemoteRepository {
val builder = RemoteRepository.Builder(hostConfig.name, "default", hostConfig.url) val builder = RemoteRepository.Builder(hostConfig.name, "default", hostConfig.url)

View file

@ -86,12 +86,12 @@ class GithubApi2 @Inject constructor(
.execute() .execute()
val code = response.code() val code = response.code()
if (code != Http.CREATED) { if (code != Http.CREATED) {
val error = Gson().fromJson(response.errorBody().string(), RetrofitError::class.java) val error = Gson().fromJson(response.errorBody()?.string(), RetrofitError::class.java)
throw KobaltException("Couldn't upload release, ${error.message}: " + error.errors[0].code) throw KobaltException("Couldn't upload release, ${error.message}: " + error.errors[0].code)
} else { } else {
val body = response.body() val body = response.body()
uploadAsset(accessToken, body.uploadUrl!!, Http.TypedFile("application/zip", zipFile), tagName) uploadAsset(accessToken, body?.uploadUrl!!, Http.TypedFile("application/zip", zipFile), tagName)
.toBlocking() .toBlocking()
.forEach { action -> .forEach { action ->
kobaltLog(1, "\n${zipFile.name} successfully uploaded") kobaltLog(1, "\n${zipFile.name} successfully uploaded")
@ -138,8 +138,8 @@ class GithubApi2 @Inject constructor(
val releases = ex.body() val releases = ex.body()
if (releases != null) { if (releases != null) {
releases.firstOrNull()?.let { releases.firstOrNull()?.let {
try { result = try {
result = listOf(it.name, it.tagName).filterNotNull().first { !it.isBlank() } listOf(it.name, it.tagName).filterNotNull().first { !it.isBlank() }
} catch(ex: NoSuchElementException) { } catch(ex: NoSuchElementException) {
throw KobaltException("Couldn't find the latest release") throw KobaltException("Couldn't find the latest release")
} }

View file

@ -55,9 +55,12 @@ class KFiles {
val previousVersion = latestInstalledVersion().version val previousVersion = latestInstalledVersion().version
val previousJar = joinDir(distributionsDir, "kobalt-" + previousVersion, val previousJar = joinDir(distributionsDir, "kobalt-" + previousVersion,
"kobalt/wrapper/kobalt-$previousVersion.jar") "kobalt/wrapper/kobalt-$previousVersion.jar")
val v = latestInstalledVersion() latestInstalledVersion()
val result = listOf("", "modules/kobalt-plugin-api", "modules/wrapper").map { val result = listOf("", "modules/kobalt-plugin-api", "modules/wrapper").map {
File(homeDir(KFiles.joinDir("kotlin", "kobalt", it, "kobaltBuild", "classes"))) File(homeDir(KFiles.joinDir("kotlin", "kobalt", it, "kobaltBuild", "classes"))) //kobalt build dirs
.absolutePath
} + listOf("modules/kobalt", "modules/kobalt-plugin-api", "modules/wrapper").map {
File(homeDir(KFiles.joinDir("kotlin", "kobalt", it, "target", "classes"))) //maven build dirs
.absolutePath .absolutePath
} + listOf(previousJar) } + listOf(previousJar)
debug("Couldn't find ${jarFile.absolutePath}, using\n " + result.joinToString(" ")) debug("Couldn't find ${jarFile.absolutePath}, using\n " + result.joinToString(" "))

View file

@ -60,6 +60,14 @@ object KobaltLogger {
} else { } else {
Logger(false) Logger(false)
} }
fun setLogLevel(args: Args) {
LOG_LEVEL = when {
args.log < Constants.LOG_QUIET_LEVEL -> Constants.LOG_DEFAULT_LEVEL
args.log > Constants.LOG_MAX_LEVEL -> Constants.LOG_MAX_LEVEL
else -> args.log
}
}
} }
class Logger(val dev: Boolean) { class Logger(val dev: Boolean) {

View file

@ -24,7 +24,7 @@ class KobaltWrapperProperties @Inject constructor() {
} }
private fun defaultUrlFor(version: String) = private fun defaultUrlFor(version: String) =
"http://beust.com/kobalt/kobalt-$version.zip" "https://beust.com/kobalt/kobalt-$version.zip"
private val file: File private val file: File
get() = File("$WRAPPER_DIR/$KOBALT_WRAPPER_PROPERTIES") get() = File("$WRAPPER_DIR/$KOBALT_WRAPPER_PROPERTIES")

View file

@ -19,6 +19,7 @@ class RunCommandInfo {
*/ */
var useErrorStreamAsErrorIndicator : Boolean = true var useErrorStreamAsErrorIndicator : Boolean = true
var useInputStreamAsErrorIndicator : Boolean = false var useInputStreamAsErrorIndicator : Boolean = false
var ignoreExitValue : Boolean = false
var errorCallback: Function1<List<String>, Unit> = NewRunCommand.DEFAULT_ERROR var errorCallback: Function1<List<String>, Unit> = NewRunCommand.DEFAULT_ERROR
var successCallback: Function1<List<String>, Unit> = NewRunCommand.DEFAULT_SUCCESS var successCallback: Function1<List<String>, Unit> = NewRunCommand.DEFAULT_SUCCESS
@ -78,7 +79,11 @@ open class NewRunCommand(val info: RunCommandInfo) {
val process = pb.start() val process = pb.start()
// Run the command and collect the return code and streams // Run the command and collect the return code and streams
val returnCode = process.waitFor(30, TimeUnit.SECONDS) val processFinished = process.waitFor(120, TimeUnit.SECONDS)
if (!processFinished)
kobaltError("process timed out!")
val input = val input =
if (process.inputStream.available() > 0) fromStream(process.inputStream) if (process.inputStream.available() > 0) fromStream(process.inputStream)
else listOf() else listOf()
@ -86,13 +91,19 @@ open class NewRunCommand(val info: RunCommandInfo) {
if (process.errorStream.available() > 0) fromStream(process.errorStream) if (process.errorStream.available() > 0) fromStream(process.errorStream)
else listOf() else listOf()
kobaltLog(3, "info contains errors: " + (info.containsErrors != null))
// Check to see if the command succeeded // Check to see if the command succeeded
val isSuccess = val isSuccess =
if (info.containsErrors != null) ! info.containsErrors!!(error) if (info.containsErrors != null) ! info.containsErrors!!(error)
else isSuccess(returnCode, input, error) else isSuccess(if (info.ignoreExitValue) true else processFinished, input, error)
if (isSuccess) { if (isSuccess) {
if (!info.useErrorStreamAsErrorIndicator) {
info.successCallback(error + input)
} else {
info.successCallback(input) info.successCallback(input)
}
} else { } else {
info.errorCallback(error + input) info.errorCallback(error + input)
} }
@ -105,7 +116,7 @@ open class NewRunCommand(val info: RunCommandInfo) {
* have various ways to signal errors. * have various ways to signal errors.
*/ */
open protected fun isSuccess(isSuccess: Boolean, input: List<String>, error: List<String>) : Boolean { open protected fun isSuccess(isSuccess: Boolean, input: List<String>, error: List<String>) : Boolean {
var hasErrors = ! isSuccess var hasErrors: Boolean = ! isSuccess
if (info.useErrorStreamAsErrorIndicator && ! hasErrors) { if (info.useErrorStreamAsErrorIndicator && ! hasErrors) {
hasErrors = hasErrors || error.isNotEmpty() hasErrors = hasErrors || error.isNotEmpty()
} }

View file

@ -29,10 +29,14 @@ class StringVersion(val version: String) : Comparable<StringVersion> {
if (v1 < v2) return -1 if (v1 < v2) return -1
else if (v1 > v2) return 1 else if (v1 > v2) return 1
} catch(ex: NumberFormatException) { } catch(ex: NumberFormatException) {
warn("Couldn't parse version $version or $other") if (version == other.toString()) {
return 0
} else {
log(2, "Couldn't parse version $version or $other")
return -1 return -1
} }
} }
}
return 0 return 0
} }

View file

@ -0,0 +1,79 @@
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.2.71'
id 'com.github.johnrengelman.shadow' version '5.0.0'
}
dependencies {
implementation project(':wrapper')
implementation project(':kobalt-plugin-api')
implementation "biz.aQute.bnd:biz.aQute.bndlib:$bndlib"
implementation 'com.github.spullara.mustache.java:compiler:0.9.5'
implementation "com.google.code.findbugs:jsr305:$findbugs"
implementation "com.sparkjava:spark-core:$spark"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp"
implementation 'com.sun.activation:javax.activation:1.2.0'
implementation "com.sun.xml.bind:jaxb-core:$jaxb"
implementation "com.sun.xml.bind:jaxb-impl:$jaxb"
implementation "javax.inject:javax.inject:$inject"
implementation "javax.xml.bind:jaxb-api:$jaxb"
implementation "org.apache.maven.resolver:maven-resolver-spi:$mavenResolver"
implementation "org.codehaus.groovy:groovy:$groovy"
implementation "com.beust:jcommander:$jcommander"
implementation "com.google.code.gson:gson:$gson"
implementation "com.google.inject:guice:$guice"
implementation "com.google.inject.extensions:guice-assistedinject:$guice"
implementation "com.squareup.retrofit2:converter-gson:$retrofit"
implementation "com.squareup.retrofit2:retrofit:$retrofit"
implementation "org.apache.maven:maven-model:$maven"
implementation "org.jetbrains.kotlin:kotlin-compiler-embeddable:$kotlin"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin"
testImplementation 'org.assertj:assertj-core:3.8.0'
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin"
testImplementation "org.testng:testng:$testng"
}
sourceSets {
main.kotlin.srcDirs += "${rootProject.projectDir}../../src/main/kotlin"
test.kotlin.srcDirs += "${rootProject.projectDir}../../src/test/kotlin"
}
shadowJar {
classifier = null
}
test {
useTestNG()
}
publishing {
publications {
shadow(MavenPublication) { publication ->
project.shadow.component(publication)
artifact sourcesJar
artifact javadocJar
pom {
name = project.name
description = 'A build system in Kotlin'
url = 'https://beust.com/kobalt'
licenses {
license {
name = 'Apache-2.0'
url = 'https://www.apache.org/licenses/LICENSE-2.0'
}
}
developers {
developer {
name = 'Cedric Beust'
email = 'cedric@beust.com'
}
}
scm {
connection = 'scm:https://github.com/cbeust/kobalt.git'
developerConnection = 'scm:git@github.com:cbeust/kobalt.git'
url = 'https://github.com/cbeust/kobalt'
}
}
}
}
}

231
modules/kobalt/pom.xml Normal file
View file

@ -0,0 +1,231 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.beust</groupId>
<artifactId>kobalt-pom</artifactId>
<version>1.1.0</version>
<relativePath>../..</relativePath>
</parent>
<artifactId>kobalt</artifactId>
<packaging>jar</packaging>
<version>1.1.0</version>
<dependencies>
<dependency>
<groupId>com.beust</groupId>
<artifactId>kobalt-plugin-api</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.beust</groupId>
<artifactId>wrapper</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-compiler-embeddable</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>com.github.spullara.mustache.java</groupId>
<artifactId>compiler</artifactId>
<version>0.9.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-assistedinject</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.72</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-gson</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>biz.aQute.bnd</groupId>
<artifactId>biz.aQute.bndlib</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>${okhttp3.version}</version>
</dependency>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.12</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-spi</artifactId>
<version>${mavenresolver.version}</version>
</dependency>
<!-- java 9 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals> <goal>compile</goal> </goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}../../src/main/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<goals> <goal>test-compile</goal> </goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}../../src/test/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<executions>
<!-- Replacing default-compile as it is treated specially by maven -->
<execution>
<id>default-compile</id>
<phase>none</phase>
</execution>
<!-- Replacing default-testCompile as it is treated specially by maven -->
<execution>
<id>default-testCompile</id>
<phase>none</phase>
</execution>
<execution>
<id>java-compile</id>
<phase>compile</phase>
<goals> <goal>compile</goal> </goals>
</execution>
<execution>
<id>java-test-compile</id>
<phase>test-compile</phase>
<goals> <goal>testCompile</goal> </goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.beust.kobalt.MainKt</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,38 @@
jar {
manifest {
attributes 'Main-Class': 'com.beust.kobalt.wrapper.Main'
}
}
publishing {
publications {
maven(MavenPublication) {
from(components.java)
artifact sourcesJar
artifact javadocJar
pom {
name = project.name
description = 'Wrapper for Kobalt'
url = 'https://beust.com/kobalt'
licenses {
license {
name = 'Apache-2.0'
url = 'https://www.apache.org/licenses/LICENSE-2.0'
}
}
developers {
developer {
name = 'Cedric Beust'
email = 'cedric@beust.com'
}
}
scm {
connection = 'scm:https://github.com/cbeust/kobalt.git'
developerConnection = 'scm:git@github.com:cbeust/kobalt.git'
url = 'https://github.com/cbeust/kobalt'
}
}
}
}
}

28
modules/wrapper/pom.xml Normal file
View file

@ -0,0 +1,28 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.beust</groupId>
<artifactId>kobalt-pom</artifactId>
<version>1.1.0</version>
<relativePath>../..</relativePath>
</parent>
<artifactId>wrapper</artifactId>
<packaging>jar</packaging>
<version>1.1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -47,7 +47,6 @@ public class Main {
private int installAndLaunchMain(String[] argv) throws IOException, InterruptedException { private int installAndLaunchMain(String[] argv) throws IOException, InterruptedException {
String version = getVersion(); String version = getVersion();
initWrapperFile(version);
List<String> kobaltArgv = new ArrayList<>(); List<String> kobaltArgv = new ArrayList<>();
boolean noLaunch = false; boolean noLaunch = false;
@ -78,6 +77,7 @@ public class Main {
} }
int result = 0; int result = 0;
if (! exit) { if (! exit) {
initWrapperFile(version);
Path kobaltJarFile = installDistribution(); Path kobaltJarFile = installDistribution();
if (!noLaunch) { if (!noLaunch) {
result = launchMain(kobaltJarFile, kobaltArgv); result = launchMain(kobaltJarFile, kobaltArgv);
@ -118,7 +118,7 @@ public class Main {
} }
private static String downloadUrl(String version) { private static String downloadUrl(String version) {
return "http://beust.com/kobalt/kobalt-" + version + ".zip"; return "https://beust.com/kobalt/kobalt-" + version + ".zip";
} }
private void initWrapperFile(String version) throws IOException { private void initWrapperFile(String version) throws IOException {
@ -133,7 +133,7 @@ public class Main {
} }
private String getWrapperVersion() { private String getWrapperVersion() {
return wrapperProperties.getProperty(PROPERTY_VERSION); return wrapperProperties.getProperty(PROPERTY_VERSION, "N/A");
} }
private String getWrapperDownloadUrl(String version) { private String getWrapperDownloadUrl(String version) {

34
pom.xml Normal file
View file

@ -0,0 +1,34 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.beust</groupId>
<artifactId>kobalt-pom</artifactId>
<packaging>pom</packaging>
<version>1.1.0</version>
<modules>
<module>modules/kobalt-plugin-api</module>
<module>modules/wrapper</module>
<module>modules/kobalt</module>
</modules>
<repositories>
<repository>
<id>testng</id>
<url>https://dl.bintray.com/cbeust/maven</url>
</repository>
</repositories>
<properties>
<kotlin.version>1.2.71</kotlin.version>
<okio.version>1.13.0</okio.version>
<okhttp3.version>3.9.1</okhttp3.version>
<mavenresolver.version>1.1.0</mavenresolver.version>
<junit.version>1.1.0</junit.version>
<junitJupiter.version>5.1.0</junitJupiter.version>
<testng.version>6.12</testng.version>
<slf4j.version>1.7.3</slf4j.version>
</properties>
</project>

5
settings.gradle Normal file
View file

@ -0,0 +1,5 @@
rootProject.name = 'kobalt-pom'
include(':kobalt-plugin-api', ':wrapper', ':kobalt')
project(':kobalt-plugin-api').projectDir = file('modules/kobalt-plugin-api')
project(':wrapper').projectDir = file('modules/wrapper')
project(':kobalt').projectDir = file('modules/kobalt')

View file

@ -38,6 +38,14 @@ class Main @Inject constructor(
companion object { companion object {
fun mainNoExit(argv: Array<String>): Int { fun mainNoExit(argv: Array<String>): Int {
val (jc, args) = parseArgs(argv) val (jc, args) = parseArgs(argv)
if (args.usage) {
jc.usage()
return 0
}
if (args.version) {
println("Kobalt ${Kobalt.version}")
return 0
}
Kobalt.init(MainModule(args, KobaltSettings.readSettingsXml())) Kobalt.init(MainModule(args, KobaltSettings.readSettingsXml()))
val result = launchMain(Kobalt.INJECTOR.getInstance(Main::class.java), jc, args, argv) val result = launchMain(Kobalt.INJECTOR.getInstance(Main::class.java), jc, args, argv)
return result return result
@ -47,11 +55,7 @@ class Main @Inject constructor(
val args = Args() val args = Args()
val result = JCommander(args) val result = JCommander(args)
result.parse(*argv) result.parse(*argv)
KobaltLogger.LOG_LEVEL = if (args.log < Constants.LOG_QUIET_LEVEL) { KobaltLogger.setLogLevel(args)
Constants.LOG_DEFAULT_LEVEL
} else if (args.log > Constants.LOG_MAX_LEVEL) {
Constants.LOG_MAX_LEVEL
} else args.log
return Main.RunInfo(result, args) return Main.RunInfo(result, args)
} }

View file

@ -20,6 +20,8 @@ abstract class LanguageTemplateGenerator : ITemplate {
abstract val defaultSourceDirectories : HashSet<String> abstract val defaultSourceDirectories : HashSet<String>
abstract val defaultTestDirectories : HashSet<String> abstract val defaultTestDirectories : HashSet<String>
abstract val mainDependencies : ArrayList<Pom.Dependency>
abstract val testDependencies : ArrayList<Pom.Dependency>
abstract val directive : String abstract val directive : String
abstract val fileMatch : (String) -> Boolean abstract val fileMatch : (String) -> Boolean
abstract val fileMap: List<FileInfo> abstract val fileMap: List<FileInfo>
@ -131,20 +133,19 @@ abstract class LanguageTemplateGenerator : ITemplate {
put("directory", currentDir.absolutePath) put("directory", currentDir.absolutePath)
put("sourceDirectories", defaultSourceDirectories) put("sourceDirectories", defaultSourceDirectories)
put("sourceDirectoriesTest", defaultTestDirectories) put("sourceDirectoriesTest", defaultTestDirectories)
put("mainDependencies", mainDependencies)
put("testDependencies", testDependencies)
put("imports", "import com.beust.kobalt.plugin.$templateName.*") put("imports", "import com.beust.kobalt.plugin.$templateName.*")
put("directive", "project") put("directive", "project")
} }
var mainDeps = arrayListOf<Pom.Dependency>()
var testDeps = arrayListOf<Pom.Dependency>()
map.put("mainDependencies", mainDeps)
map.put("testDependencies", testDeps)
File("pom.xml").let { File("pom.xml").let {
if (it.absoluteFile.exists()) { if (it.absoluteFile.exists()) {
importPom(it, mainDeps, testDeps, map) importPom(it, mainDependencies, testDependencies, map)
} }
} }
val fileInputStream = javaClass.classLoader val fileInputStream = javaClass.classLoader
.getResource(ITemplateContributor.DIRECTORY_NAME + "/build.mustache").openStream() .getResource(ITemplateContributor.DIRECTORY_NAME + "/build.mustache").openStream()
val sw = StringWriter() val sw = StringWriter()

View file

@ -56,7 +56,7 @@ class Profiles(val context: KobaltContext) {
val variable = if (match.first) match.second else oldMatch.second val variable = if (match.first) match.second else oldMatch.second
if (oldMatch.first) { if (oldMatch.first) {
warn("Old profile syntax detected for \"$line\"," + warn("Old profile syntax detected for \"${line.trim()}\"," +
" please update to \"val $variable by profile()\"") " please update to \"val $variable by profile()\"")
} }

View file

@ -1,11 +1,14 @@
package com.beust.kobalt.app.java package com.beust.kobalt.app.java
import com.beust.kobalt.app.LanguageTemplateGenerator import com.beust.kobalt.app.LanguageTemplateGenerator
import com.beust.kobalt.maven.Pom
/** /**
* Template for the "java" generator. * Template for the "java" generator.
*/ */
class JavaTemplateGenerator : LanguageTemplateGenerator() { class JavaTemplateGenerator : LanguageTemplateGenerator() {
override val mainDependencies = arrayListOf<Pom.Dependency>()
override val testDependencies = arrayListOf<Pom.Dependency>()
override val defaultSourceDirectories = hashSetOf("src/main/java") override val defaultSourceDirectories = hashSetOf("src/main/java")
override val defaultTestDirectories = hashSetOf("src/test/java") override val defaultTestDirectories = hashSetOf("src/test/java")
override val directive = "project" override val directive = "project"

View file

@ -1,10 +1,16 @@
package com.beust.kobalt.app.kotlin package com.beust.kobalt.app.kotlin
import com.beust.kobalt.Constants
import com.beust.kobalt.app.LanguageTemplateGenerator import com.beust.kobalt.app.LanguageTemplateGenerator
import com.beust.kobalt.maven.Pom
class KotlinTemplateGenerator : LanguageTemplateGenerator() { class KotlinTemplateGenerator : LanguageTemplateGenerator() {
override val defaultSourceDirectories = hashSetOf("src/main/kotlin") override val defaultSourceDirectories = hashSetOf("src/main/kotlin")
override val defaultTestDirectories = hashSetOf("src/test/kotlin") override val defaultTestDirectories = hashSetOf("src/test/kotlin")
override val mainDependencies = arrayListOf(
Pom.Dependency("org.jetbrains.kotlin", "kotlin-stdlib", null, Constants.KOTLIN_COMPILER_VERSION)
)
override val testDependencies = arrayListOf<Pom.Dependency>()
override val directive = "project" override val directive = "project"
override val templateName = "kotlin" override val templateName = "kotlin"
override val templateDescription = "Generate a simple Kotlin project" override val templateDescription = "Generate a simple Kotlin project"

View file

@ -12,15 +12,7 @@ import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.warn import com.beust.kobalt.misc.warn
import com.google.gson.Gson import com.google.gson.Gson
import com.google.inject.Guice import com.google.inject.Guice
import okhttp3.OkHttpClient import okhttp3.*
import okhttp3.Request
import okhttp3.Response
import okhttp3.ResponseBody
import okhttp3.ws.WebSocket
import okhttp3.ws.WebSocketCall
import okhttp3.ws.WebSocketListener
import okio.Buffer
import java.io.IOException
fun main(argv: Array<String>) { fun main(argv: Array<String>) {
Kobalt.INJECTOR = Guice.createInjector(MainModule(Args(), KobaltSettings.readSettingsXml())) Kobalt.INJECTOR = Guice.createInjector(MainModule(Args(), KobaltSettings.readSettingsXml()))
@ -39,26 +31,22 @@ class KobaltClient : Runnable {
.url("$url?projectRoot=$projectRoot&buildFile=$buildFile") .url("$url?projectRoot=$projectRoot&buildFile=$buildFile")
.build() .build()
var webSocket: WebSocket? = null var webSocket: WebSocket? = null
val ws = WebSocketCall.create(client, request).enqueue(object: WebSocketListener { val socketListener = object: WebSocketListener() {
override fun onOpen(ws: WebSocket, response: Response) { override fun onFailure(webSocket: WebSocket, ex: Throwable, response: Response?) {
webSocket = ws
}
override fun onPong(p0: Buffer?) {
println("WebSocket pong")
}
override fun onClose(p0: Int, p1: String?) {
println("WebSocket closed")
}
override fun onFailure(ex: IOException, response: Response?) {
Exceptions.printStackTrace(ex) Exceptions.printStackTrace(ex)
error("WebSocket failure: ${ex.message} response: $response") error("WebSocket failure: ${ex.message} response: $response")
} }
override fun onMessage(body: ResponseBody) { override fun onOpen(ws: WebSocket, response: Response) {
val json = body.string() webSocket = ws
}
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
println("Closing socket")
}
override fun onMessage(webSocket: WebSocket, text: String) {
val json = text
val wsCommand = Gson().fromJson(json, WebSocketCommand::class.java) val wsCommand = Gson().fromJson(json, WebSocketCommand::class.java)
if (wsCommand.errorMessage != null) { if (wsCommand.errorMessage != null) {
warn("Received error message from server: " + wsCommand.errorMessage) warn("Received error message from server: " + wsCommand.errorMessage)
@ -87,7 +75,10 @@ class KobaltClient : Runnable {
} }
} }
} }
}) }
val ws = client.newWebSocket(request, socketListener)
ws.close(1000, "All good")
} }
} }

View file

@ -17,7 +17,6 @@ import com.beust.kobalt.plugin.packaging.PackageConfig
import com.beust.kobalt.plugin.packaging.PackagingPlugin import com.beust.kobalt.plugin.packaging.PackagingPlugin
import com.google.inject.Inject import com.google.inject.Inject
import com.google.inject.Singleton import com.google.inject.Singleton
import org.jetbrains.kotlin.config.TargetPlatformVersion.NoVersion.description
import java.io.File import java.io.File
class ApplicationConfig { class ApplicationConfig {
@ -34,6 +33,15 @@ class ApplicationConfig {
@Directive @Directive
fun args(vararg argv: String) = argv.forEach { args.add(it) } fun args(vararg argv: String) = argv.forEach { args.add(it) }
val args = arrayListOf<String>() val args = arrayListOf<String>()
@Directive
var ignoreErrorStream: Boolean = false
@Directive
var ignoreInputStream: Boolean = true
@Directive
var ignoreExitValue: Boolean = false
} }
@Directive @Directive
@ -139,6 +147,7 @@ class ApplicationPlugin @Inject constructor(val configActor: ConfigsActor<Applic
val exitCode = runCommand { val exitCode = runCommand {
command = "java" command = "java"
args = allArgs args = allArgs
useErrorStreamAsErrorIndicator = false
directory = File(project.directory) directory = File(project.directory)
successCallback = { output: List<String> -> successCallback = { output: List<String> ->
kobaltLog(1, output.joinToString("\n")) kobaltLog(1, output.joinToString("\n"))
@ -147,6 +156,9 @@ class ApplicationPlugin @Inject constructor(val configActor: ConfigsActor<Applic
kobaltLog(1, "ERROR") kobaltLog(1, "ERROR")
kobaltLog(1, output.joinToString("\n")) kobaltLog(1, output.joinToString("\n"))
} }
useErrorStreamAsErrorIndicator = !config.ignoreErrorStream
useInputStreamAsErrorIndicator = !config.ignoreInputStream
ignoreExitValue = config.ignoreExitValue
} }
return TaskResult(exitCode == 0) return TaskResult(exitCode == 0)
} }

View file

@ -8,10 +8,12 @@ import com.beust.kobalt.maven.dependency.FileDependency
import com.beust.kobalt.misc.* import com.beust.kobalt.misc.*
import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.incremental.ICReporter import org.jetbrains.kotlin.incremental.ICReporter
import org.jetbrains.kotlin.incremental.makeIncrementally import org.jetbrains.kotlin.incremental.makeIncrementally
@ -72,29 +74,18 @@ class KotlinCompiler @Inject constructor(
File(outputDir).parentFile.mkdirs() File(outputDir).parentFile.mkdirs()
} }
val classpath = cp.joinToString(File.pathSeparator) val classpath = cp.joinToString(File.pathSeparator)
val allArgs = arrayListOf(
"-d", outputDir,
"-classpath", classpath,
*(info.compilerArgs.toTypedArray()),
*(info.sourceFiles.toTypedArray())
)
// Get rid of annoying and useless warning
if (! info.compilerArgs.contains("-no-stdlib")) {
allArgs.add("-no-stdlib")
}
// If the Kotlin compiler version in settings.xml is different from the default, we // If the Kotlin compiler version in settings.xml is different from the default, we
// need to spawn a Kotlin compiler in a separate process. Otherwise, we can just invoke // need to spawn a Kotlin compiler in a separate process. Otherwise, we can just invoke
// the K2JVMCompiler class directly // the K2JVMCompiler class directly
val actualVersion = kotlinVersion(project) val actualVersion = kotlinVersion(project)
if (settings.kobaltCompilerSeparateProcess || actualVersion != Constants.KOTLIN_COMPILER_VERSION return if (settings.kobaltCompilerSeparateProcess || actualVersion != Constants.KOTLIN_COMPILER_VERSION
|| info.compilerSeparateProcess) { || info.compilerSeparateProcess) {
return invokeCompilerInSeparateProcess(classpath, info, actualVersion, project) invokeCompilerInSeparateProcess(classpath, info, actualVersion, project)
} else { } else {
return invokeCompilerDirectly(project, projectName ?: "kobalt-" + Random().nextInt(), outputDir, invokeCompilerDirectly(project, projectName ?: "kobalt-" + Random().nextInt(), outputDir,
info, classpath, filesToCompile) info, classpath, filesToCompile)
} }
} }
@ -111,13 +102,22 @@ class KotlinCompiler @Inject constructor(
.filterNotNull() .filterNotNull()
.joinToString(" ") .joinToString(" ")
val xFlagsArray = xFlagsString.split(" ").toTypedArray() ?: emptyArray() val infoDir = info.directory
val outputDir =
if (infoDir != null) {
KFiles.joinDir(infoDir, info.outputDir.path)
} else {
info.outputDir.path
}
val xFlagsArray = xFlagsString.split(" ").toTypedArray()
val newArgs = listOf( val newArgs = listOf(
"-classpath", compilerClasspath, "-classpath", compilerClasspath,
K2JVMCompiler::class.java.name, K2JVMCompiler::class.java.name,
*info.compilerArgs.toTypedArray(), *info.compilerArgs.toTypedArray(),
"-classpath", classpath, "-classpath", classpath,
"-d", info.outputDir.absolutePath, "-d", outputDir,
*xFlagsArray, *xFlagsArray,
*info.sourceFiles.toTypedArray()) *info.sourceFiles.toTypedArray())
.filter { ! it.isEmpty() } .filter { ! it.isEmpty() }
@ -145,17 +145,17 @@ class KotlinCompiler @Inject constructor(
// Collect the compiler args from kotlinCompiler{} and from settings.xml and parse them // Collect the compiler args from kotlinCompiler{} and from settings.xml and parse them
val args2 = val args2 =
info.compilerArgs + info.compilerArgs +
(settings.kobaltCompilerFlags?.split(" ") ?: listOf<String>()) (settings.kobaltCompilerFlags?.split(" ") ?: listOf())
val args = K2JVMCompilerArguments() val args = K2JVMCompilerArguments()
val compiler = K2JVMCompiler() val compiler = K2JVMCompiler()
compiler.parseArguments(args2.toTypedArray(), args) parseCommandLineArguments(args2, args)
// Override important arguments with our values // Override important arguments with our values
args.apply { args.apply {
moduleName = projectName moduleName = projectName
destination = outputDir destination = outputDir
classpath = classpathString classpath = classpathString
freeArgs = sourceFiles freeArgs = sourceFiles.toMutableList()
friendPaths = friends friendPaths = friends
} }
@ -179,12 +179,12 @@ class KotlinCompiler @Inject constructor(
"single-module" -> args.singleModule = true "single-module" -> args.singleModule = true
"load-builtins-from-dependencies" -> args.loadBuiltInsFromDependencies = true "load-builtins-from-dependencies" -> args.loadBuiltInsFromDependencies = true
"coroutines=enable" -> args.coroutinesEnable = true "coroutines=enable" -> args.coroutinesState = LanguageFeature.State.ENABLED.name
"coroutines=warn" -> args.coroutinesWarn = true "coroutines=warn" -> args.coroutinesState = LanguageFeature.State.ENABLED_WITH_WARNING.name
"coroutines=error" -> args.coroutinesError = true "coroutines=error" -> args.coroutinesState = LanguageFeature.State.ENABLED_WITH_ERROR.name
"no-inline" -> args.noInline = true "no-inline" -> args.noInline = true
"multi-platform" -> args.multiPlatform = true "multi-platform" -> args.multiPlatform = true
"no-check-impl" -> args.noCheckImpl = true // "no-check-impl" -> args.noCheckImpl = true
else -> warn("Unknown Kotlin compiler flag found in config.xml: $it") else -> warn("Unknown Kotlin compiler flag found in config.xml: $it")
} }
} }
@ -214,7 +214,7 @@ class KotlinCompiler @Inject constructor(
+ " " + sourceFiles.joinToString(" ")) + " " + sourceFiles.joinToString(" "))
logk(2, " Additional kotlinc arguments: " logk(2, " Additional kotlinc arguments: "
+ " -moduleName " + args.moduleName + " -moduleName " + args.moduleName
+ " -friendPaths " + args.friendPaths.joinToString(";")) + " -friendPaths " + args.friendPaths?.joinToString(";"))
val collector = object : MessageCollector { val collector = object : MessageCollector {
override fun clear() { override fun clear() {
throw UnsupportedOperationException("not implemented") throw UnsupportedOperationException("not implemented")
@ -225,7 +225,7 @@ class KotlinCompiler @Inject constructor(
} }
fun dump(location: CompilerMessageLocation?, s: String) = fun dump(location: CompilerMessageLocation?, s: String) =
if (location != null && location.lineContent != null) { if (location?.lineContent != null) {
with(location) { with(location) {
"$lineContent\n$path:$line:$column $s" "$lineContent\n$path:$line:$column $s"
} }
@ -233,11 +233,13 @@ class KotlinCompiler @Inject constructor(
s s
} }
override fun report(severity: CompilerMessageSeverity, override fun report(severity: CompilerMessageSeverity, message: String,
message: String, location: CompilerMessageLocation) { location: CompilerMessageLocation?) {
if (severity.isError) { if (severity.isError) {
"Couldn't compile file: ${dump(location, message)}".let { fullMessage -> "Couldn't compile file: ${dump(location, message)}".let { fullMessage ->
throw KobaltException(fullMessage) error(fullMessage)
val ex = KobaltException(fullMessage)
throw ex
} }
} else if (severity == CompilerMessageSeverity.WARNING && KobaltLogger.LOG_LEVEL >= 2) { } else if (severity == CompilerMessageSeverity.WARNING && KobaltLogger.LOG_LEVEL >= 2) {
warn(dump(location, message)) warn(dump(location, message))
@ -251,8 +253,7 @@ class KotlinCompiler @Inject constructor(
// // TODO: experimental should be removed as soon as it becomes standard // // TODO: experimental should be removed as soon as it becomes standard
// System.setProperty("kotlin.incremental.compilation.experimental", "true") // System.setProperty("kotlin.incremental.compilation.experimental", "true")
val result = return if (cliArgs.noIncrementalKotlin || Kobalt.context?.internalContext?.noIncrementalKotlin ?: false) {
if (cliArgs.noIncrementalKotlin || Kobalt.context?.internalContext?.noIncrementalKotlin ?: false) {
log(2, " Kotlin incremental compilation is disabled") log(2, " Kotlin incremental compilation is disabled")
val duration = benchmarkMillis { val duration = benchmarkMillis {
compiler.exec(collector, Services.Builder().build(), args) compiler.exec(collector, Services.Builder().build(), args)
@ -261,14 +262,13 @@ class KotlinCompiler @Inject constructor(
TaskResult(duration.second == ExitCode.OK) TaskResult(duration.second == ExitCode.OK)
} else { } else {
log(1, " Kotlin incremental compilation is enabled") log(1, " Kotlin incremental compilation is enabled")
val start = System.currentTimeMillis() //val start = System.currentTimeMillis()
val duration = benchmarkMillis { val duration = benchmarkMillis {
compileIncrementally(filesToCompile, sourceFiles, outputDir, info, args, collector) compileIncrementally(filesToCompile, sourceFiles, outputDir, info, args, collector)
} }
log(1, " Incremental compilation time: ${duration.first} ms") log(1, " Incremental compilation time: ${duration.first} ms")
TaskResult() TaskResult()
} }
return result
} }
private fun compileIncrementally(filesToCompile: Int, sourceFiles: List<String>, outputDir: String?, private fun compileIncrementally(filesToCompile: Int, sourceFiles: List<String>, outputDir: String?,
@ -382,8 +382,7 @@ class KotlinCompiler @Inject constructor(
= dependencyManager.create("org.jetbrains" + ".kotlin:kotlin-compiler-embeddable:$version") = dependencyManager.create("org.jetbrains" + ".kotlin:kotlin-compiler-embeddable:$version")
fun compilerEmbeddableDependencies(project: Project?, version: String): List<IClasspathDependency> { fun compilerEmbeddableDependencies(project: Project?, version: String): List<IClasspathDependency> {
val deps = dependencyManager.transitiveClosure(listOf(compilerDep(version)), requiredBy = project?.name ?: "") return dependencyManager.transitiveClosure(listOf(compilerDep(version)), requiredBy = project?.name ?: "")
return deps
} }
/** /**
@ -416,7 +415,7 @@ class KotlinCompiler @Inject constructor(
if (project != null) { if (project != null) {
listOf(KFiles.joinDir(project.directory, project.buildDirectory, KFiles.CLASSES_DIR)) listOf(KFiles.joinDir(project.directory, project.buildDirectory, KFiles.CLASSES_DIR))
} else { } else {
emptyList<String>() emptyList()
} }
val info = CompilerActionInfo(project?.directory, dependencies, sourceFiles, listOf("kt"), outputDir, args, val info = CompilerActionInfo(project?.directory, dependencies, sourceFiles, listOf("kt"), outputDir, args,
friendPaths, context?.internalContext?.forceRecompile ?: false, compilerSeparateProcess) friendPaths, context?.internalContext?.forceRecompile ?: false, compilerSeparateProcess)

View file

@ -99,9 +99,10 @@ class KotlinPlugin @Inject constructor(val executors: KobaltExecutors, val depen
// IClasspathContributor // IClasspathContributor
override fun classpathEntriesFor(project: Project?, context: KobaltContext): List<IClasspathDependency> = override fun classpathEntriesFor(project: Project?, context: KobaltContext): List<IClasspathDependency> =
if (project == null || accept(project)) { if (project == null ||
context.pluginInfo.plugins.any { it is KotlinPlugin && it.settings.kobaltCompilerVersion == null }) {
// All Kotlin projects automatically get the Kotlin runtime added to their class path // All Kotlin projects automatically get the Kotlin runtime added to their class path
listOf(kotlinJarFiles.stdlib, kotlinJarFiles.runtime) listOf(kotlinJarFiles.stdlib)
.map { FileDependency(it.absolutePath) } .map { FileDependency(it.absolutePath) }
} else { } else {
emptyList() emptyList()

View file

@ -14,11 +14,8 @@ import com.google.inject.Inject
import com.google.inject.Singleton import com.google.inject.Singleton
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
import java.net.URI
import java.net.URLClassLoader import java.net.URLClassLoader
import java.nio.file.FileSystems import java.nio.file.*
import java.nio.file.Files
import java.nio.file.StandardOpenOption
import java.time.LocalDate import java.time.LocalDate
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
import java.util.jar.JarFile import java.util.jar.JarFile
@ -57,6 +54,7 @@ class OsgiPlugin @Inject constructor(val configActor: ConfigActor<OsgiConfig>, v
it + ";version=\"" + project.version + "\"" it + ";version=\"" + project.version + "\""
}.joinToString(",") }.joinToString(",")
val toFile = Files.createTempFile(null, ".jar")
val analyzer = Analyzer().apply { val analyzer = Analyzer().apply {
jar = aQute.bnd.osgi.Jar(jarName) jar = aQute.bnd.osgi.Jar(jarName)
val dependencies = project.compileDependencies + project.compileRuntimeDependencies val dependencies = project.compileDependencies + project.compileRuntimeDependencies
@ -87,11 +85,12 @@ class OsgiPlugin @Inject constructor(val configActor: ConfigActor<OsgiConfig>, v
// //
// Update or create META-INF/MANIFEST.MF // Update or create META-INF/MANIFEST.MF
// //
val uri = URI.create("jar:file:" + jarFile.absolutePath) KFiles.copy(Paths.get(jarFile.toURI()), Paths.get(toFile.toUri()))
val options = hashMapOf<String, String>()
val fileSystem = FileSystems.newFileSystem(uri, options) val fileSystem = FileSystems.newFileSystem(toFile, null)
fileSystem.use { fs -> fileSystem.use { fs ->
val mf = JarFile(jarFile).getEntry(MetaArchive.MANIFEST_MF) JarFile(jarFile).use { jf ->
val mf = jf.getEntry(MetaArchive.MANIFEST_MF)
if (mf == null) { if (mf == null) {
Files.createDirectories(fs.getPath("META-INF/")) Files.createDirectories(fs.getPath("META-INF/"))
} }
@ -99,6 +98,8 @@ class OsgiPlugin @Inject constructor(val configActor: ConfigActor<OsgiConfig>, v
Files.write(jarManifest, listOf(lines2), Files.write(jarManifest, listOf(lines2),
if (mf != null) StandardOpenOption.APPEND else StandardOpenOption.CREATE) if (mf != null) StandardOpenOption.APPEND else StandardOpenOption.CREATE)
} }
}
Files.copy(Paths.get(toFile.toUri()), Paths.get(jarFile.toURI()), StandardCopyOption.REPLACE_EXISTING)
return TaskResult() return TaskResult()
} }
} }

View file

@ -105,7 +105,7 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana
val outputFile = jarGenerator.fullArchiveName(project, context, it.name) val outputFile = jarGenerator.fullArchiveName(project, context, it.name)
outputFiles.add(outputFile) outputFiles.add(outputFile)
allIncludedFiles.addAll(files) allIncludedFiles.addAll(files)
zipToFiles[it.name] = files zipToFiles[outputFile.name] = files
} }
} }
} }

View file

@ -80,12 +80,12 @@ class BintrayApi @Inject constructor(val http: Http,
// level = HttpLoggingInterceptor.Level.BASIC // level = HttpLoggingInterceptor.Level.BASIC
// }) // })
builder.interceptors().add(Interceptor { chain -> builder.interceptors().add(Interceptor { chain ->
val original = chain.request(); val original = chain.request()
chain.proceed(original.newBuilder() chain.proceed(original.newBuilder()
.header("Authorization", Credentials.basic(username, password)) .header("Authorization", Credentials.basic(username, password))
.method(original.method(), original.body()) .method(original.method(), original.body())
.build()); .build())
}) })
val okHttpClient = builder.build() val okHttpClient = builder.build()
@ -101,12 +101,12 @@ class BintrayApi @Inject constructor(val http: Http,
val pkgName = config.name ?: project.name val pkgName = config.name ?: project.name
val execute = service.getPackage(org ?: username!!, pkgName).execute() val execute = service.getPackage(org ?: username!!, pkgName).execute()
if (execute.errorBody()?.string()?.contains("'$pkgName' was not found") ?: false) { if (execute.errorBody()?.string()?.contains("'$pkgName' was not found") == true) {
warn("Package does not exist on bintray. Creating now.") warn("Package does not exist on bintray. Creating now.")
val result = service.createPackage(org ?: username!!, buildPackageInfo(project, config)) val result = service.createPackage(org ?: username!!, buildPackageInfo(project, config))
.execute() .execute()
if (result.errorBody() != null) { if (result.errorBody() != null) {
throw KobaltException("Error while creating package:\n" + result.errorBody().string()) throw KobaltException("Error while creating package:\n" + result.errorBody()!!.string())
} }
} }
} }
@ -163,7 +163,7 @@ class BintrayApi @Inject constructor(val http: Http,
fun dots(total: Int, list: List<Boolean>, file: File? = null): String { fun dots(total: Int, list: List<Boolean>, file: File? = null): String {
val spaces: String = Array(total - list.size, { " " }).joinToString("") val spaces: String = Array(total - list.size, { " " }).joinToString("")
return "|" + list.map { if (it) "." else "X" }.joinToString("") + spaces + return "|" + list.joinToString("") { if (it) "." else "X" } + spaces +
(if (file != null) "| [ $file ]" else "|") (if (file != null) "| [ $file ]" else "|")
} }
@ -208,7 +208,7 @@ class BintrayApi @Inject constructor(val http: Http,
return TaskResult() return TaskResult()
} else { } else {
error(" Errors while uploading:\n" + errorMessages.map { " $it" }.joinToString("\n")) error(" Errors while uploading:\n" + errorMessages.joinToString("\n") { " $it" })
return TaskResult(false, errorMessage = errorMessages.joinToString("\n")) return TaskResult(false, errorMessage = errorMessages.joinToString("\n"))
} }
} else { } else {
@ -221,7 +221,7 @@ class BintrayApi @Inject constructor(val http: Http,
fun JsonObject.addNonNull(name: String, value: String?) { fun JsonObject.addNonNull(name: String, value: String?) {
if (value != null) { if (value != null) {
addProperty(name, value); addProperty(name, value)
} }
} }
@ -236,20 +236,16 @@ class ConverterFactory : Converter.Factory() {
override fun requestBodyConverter(type: Type, parameterAnnotations: Array<out Annotation>, override fun requestBodyConverter(type: Type, parameterAnnotations: Array<out Annotation>,
methodAnnotations: Array<out Annotation>, methodAnnotations: Array<out Annotation>,
retrofit: Retrofit?): Converter<*, RequestBody>? { retrofit: Retrofit?): Converter<*, RequestBody>? {
val result = return if (type.typeName == File::class.java.name) FileBodyConverter()
if (type.typeName == File::class.java.name) FileBodyConverter()
else GsonBodyConverter() else GsonBodyConverter()
return result
} }
} }
class GsonResponseBodyConverter(private val gson: Gson, private val adapter: TypeAdapter<out Any>) : Converter<ResponseBody, Any> { class GsonResponseBodyConverter(private val gson: Gson, private val adapter: TypeAdapter<out Any>) : Converter<ResponseBody, Any> {
override fun convert(value: ResponseBody): Any { override fun convert(value: ResponseBody): Any {
val jsonReader = gson.newJsonReader(value.charStream()) val jsonReader = gson.newJsonReader(value.charStream())
try { value.use {
return adapter.read(jsonReader) return adapter.read(jsonReader)
} finally {
value.close()
} }
} }
} }

View file

@ -1 +1 @@
kobalt.version=1.0.86 kobalt.version=1.0.122

View file

@ -1,12 +1,12 @@
<component name="libraryTable"> <component name="libraryTable">
<library name="KotlinJavaRuntime"> <library name="KotlinJavaRuntime">
<CLASSES> <CLASSES>
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-runtime.jar!/" /> <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib.jar!/" />
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-reflect.jar!/" /> <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-reflect.jar!/" />
</CLASSES> </CLASSES>
<JAVADOC /> <JAVADOC />
<SOURCES> <SOURCES>
<root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-runtime-sources.jar!/" /> <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-stdlib-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
</component> </component>

View file

@ -9,6 +9,7 @@ import com.beust.kobalt.internal.KobaltPluginXml
import com.beust.kobalt.internal.PluginInfo import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.internal.build.SingleFileBuildSources import com.beust.kobalt.internal.build.SingleFileBuildSources
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.KobaltLogger
import com.beust.kobalt.misc.log import com.beust.kobalt.misc.log
import org.testng.annotations.BeforeClass import org.testng.annotations.BeforeClass
import org.testng.annotations.Guice import org.testng.annotations.Guice
@ -121,6 +122,9 @@ open class BaseTest(val compilerFactory: BuildFileCompiler.IFactory? = null) {
val main = Kobalt.INJECTOR.getInstance(Main::class.java) val main = Kobalt.INJECTOR.getInstance(Main::class.java)
val args = Args() val args = Args()
val jc = JCommander(args).apply { parse(*commandLine) } val jc = JCommander(args).apply { parse(*commandLine) }
KobaltLogger.setLogLevel(args)
args.buildFile = KFiles.fixSlashes(project.file.absolutePath) + "/kobalt/src/Build.kt" args.buildFile = KFiles.fixSlashes(project.file.absolutePath) + "/kobalt/src/Build.kt"
val result = Main.launchMain(main, jc, args, arrayOf("assemble")) val result = Main.launchMain(main, jc, args, arrayOf("assemble"))
return LaunchProjectResult(project, result) return LaunchProjectResult(project, result)

View file

@ -67,7 +67,7 @@ class VerifyKobaltZipTest : KobaltTest() {
} else if (entry.name.endsWith("kobalt-wrapper.jar")) { } else if (entry.name.endsWith("kobalt-wrapper.jar")) {
val ins = zipFile.getInputStream(entry) val ins = zipFile.getInputStream(entry)
foundWrapperJar = true foundWrapperJar = true
assertExistence(ins, listOf("kobalt.properties")) assertExistence(ins, listOf("kobalt.properties", "com/beust/kobalt/wrapper/Main.class"))
} }
entry = stream.nextEntry entry = stream.nextEntry
} }

View file

@ -0,0 +1,58 @@
package com.beust.kobalt.internal
import com.beust.kobalt.BaseTest
import com.beust.kobalt.BuildFile
import com.beust.kobalt.ProjectFile
import com.beust.kobalt.ProjectInfo
import com.beust.kobalt.misc.KFiles
import org.assertj.core.api.Assertions.assertThat
import org.testng.annotations.Test
import java.io.File
class KotlinCompilerVersionTest : BaseTest() {
@Test
fun shouldCompileWithExternalKotlin() {
val projectInfo = ProjectInfo(
BuildFile(
listOf("com.beust.kobalt.plugin.packaging.*", "com.beust.kobalt.plugin.kotlin.kotlinCompiler"),
"""
kotlinCompiler {
version = "1.2.60"
}
assemble{ jar{} }
"""
),
listOf(
ProjectFile("src/main/kotlin/A.kt", "val a = Bob()"),
ProjectFile("src/main/kotlin/Bob.java", "class Bob { }")
)
)
val result = launchProject(projectInfo, arrayOf("assemble", "--log", "2"))
val project = result.projectDescription
val jarFile = File(KFiles.joinDir(project.file.absolutePath, "kobaltBuild/libs", project.name + "-"
+ project.version + ".jar"))
assertThat(jarFile).exists()
}
@Test
fun shouldFailWhenKotlinVersionDoesNotExist() {
val projectInfo = ProjectInfo(
BuildFile(
listOf("com.beust.kobalt.plugin.packaging.*", "com.beust.kobalt.plugin.kotlin.kotlinCompiler"),
"""
kotlinCompiler { version = "1.1.20" }
assemble{ jar{} }
"""
),
listOf(ProjectFile("src/main/kotlin/A.kt", "val a = \"foo\""))
)
val result = launchProject(projectInfo, arrayOf("assemble", "--log", "2"))
assertThat(result.result).isEqualTo(1)
}
}

View file

@ -1,5 +1,6 @@
package com.beust.kobalt.misc package com.beust.kobalt.misc
import com.beust.kobalt.Args
import com.beust.kobalt.BaseTest import com.beust.kobalt.BaseTest
import com.beust.kobalt.internal.KobaltSettings import com.beust.kobalt.internal.KobaltSettings
import com.beust.kobalt.internal.KobaltSettingsXml import com.beust.kobalt.internal.KobaltSettingsXml
@ -95,7 +96,7 @@ class MavenResolverTest : BaseTest() {
private fun resolve(id: String): List<ArtifactResult> { private fun resolve(id: String): List<ArtifactResult> {
val system = Booter.newRepositorySystem() val system = Booter.newRepositorySystem()
val session = Booter.newRepositorySystemSession(system, val session = Booter.newRepositorySystemSession(system,
localRepo.localRepo, KobaltSettings(KobaltSettingsXml()), EventBus()) localRepo.localRepo, KobaltSettings(KobaltSettingsXml()), Args(), EventBus())
val artifact = DefaultArtifact(id) val artifact = DefaultArtifact(id)
val collectRequest = CollectRequest().apply { val collectRequest = CollectRequest().apply {