1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-29 09:38:11 -07:00

Compare commits

..

No commits in common. "master" and "1.0.73" have entirely different histories.

82 changed files with 448 additions and 2696 deletions

2
.gitignore vendored
View file

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

View file

@ -1,6 +1,6 @@
# Kobalt # Kobalt
[<img src="https://teamcity.jetbrains.com/app/rest/builds/buildType:(id:OpenSourceProjects_Kobalt_Build)/statusIcon.svg">](https://teamcity.jetbrains.com/project.html?projectId=OpenSourceProjects_Kobalt&tab=projectOverview) [<img src="https://teamcity.jetbrains.com/app/rest/builds/buildType:(id:OpenSourceProjects_Kobalt_Build)/statusIcon">](https://teamcity.jetbrains.com/project.html?projectId=OpenSourceProjects_Kobalt&tab=projectOverview)
Kobalt is a universal build system. Kobalt is a universal build system.
@ -8,7 +8,7 @@ Kobalt is a universal build system.
To build it: To build it:
``` ```
$ ./kobaltw assemble ./kobaltw assemble
``` ```
Please see [the web site](http://beust.com/kobalt/) for the full documentation. Please see [the web site](http://beust.com/kobalt/) for the full documentation.

View file

@ -1,58 +0,0 @@
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'
}
}

Binary file not shown.

View file

@ -1,5 +0,0 @@
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
View file

@ -1,188 +0,0 @@
#!/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
View file

@ -1,100 +0,0 @@
@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,27 +21,26 @@ import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream import java.util.zip.ZipOutputStream
val bs = buildScript { val bs = buildScript {
repos("https://dl.bintray.com/cbeust/maven") repos("http://dl.bintray.com/cbeust/maven")
} }
object Versions { object Versions {
val kotlin = "1.2.71" val okhttp = "3.2.0"
val okhttp = "3.9.1" val okio = "1.6.0"
val okio = "1.13.0" val retrofit = "2.1.0"
val retrofit = "2.3.0" val gson = "2.6.2"
val gson = "2.8.2" val maven = "3.3.9"
val guice = "4.2.2" val mavenResolver = "1.0.3"
val maven = "3.5.2"
val mavenResolver = "1.1.0"
val slf4j = "1.7.3" val slf4j = "1.7.3"
val kotlin = "1.1.1"
val aether = "1.0.2.v20150114" val aether = "1.0.2.v20150114"
val testng = "6.12" val testng = "6.11"
val jcommander = "1.72"
// JUnit 5 // JUnit 5
val junit = "4.12" val junit = "4.12"
val junitPlatform = "1.1.0" val junitPlatform = "1.0.0-M4"
val junitJupiter = "5.1.0" val junitJupiter = "5.0.0-M4"
val junitVintageVersion = "$junit.0-M4"
} }
fun mavenResolver(vararg m: String) fun mavenResolver(vararg m: String)
@ -79,7 +78,6 @@ val wrapper = project {
bintray { bintray {
publish = true publish = true
sign = true
} }
pom = createPom(name, "Wrapper for Kobalt") pom = createPom(name, "Wrapper for Kobalt")
@ -92,42 +90,41 @@ 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 = "https://beust.com/kobalt" url = "http://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:${Versions.guice}", "com.google.inject:guice:4.0",
"com.google.inject.extensions:guice-assistedinject:4.1.0", "com.google.inject.extensions:guice-assistedinject:4.0",
"javax.inject:javax.inject:1", "javax.inject:javax.inject:1",
"com.google.guava:guava:27.0.1-jre", "com.google.guava:guava:19.0",
"org.apache.maven:maven-model:${Versions.maven}", "org.apache.maven:maven-model:${Versions.maven}",
"io.reactivex:rxjava:1.3.3", "io.reactivex:rxjava:1.1.5",
"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:${Versions.jcommander}", "com.beust:jcommander:1.48",
"org.eclipse.jgit:org.eclipse.jgit:4.9.0.201710071750-r", "org.eclipse.jgit:org.eclipse.jgit:4.5.0.201609210915-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.junitJupiter}", "org.junit.vintage:junit-vintage-engine:${Versions.junitVintageVersion}",
"org.apache.commons:commons-compress:1.15",
"commons-io:commons-io:2.6",
// Java 9 "org.apache.commons:commons-compress:1.13",
"javax.xml.bind:jaxb-api:2.3.0" "commons-io:commons-io:2.5"
) )
exclude(*aether("impl", "spi", "util", "api")) exclude(*aether("impl", "spi", "util", "api"))
} }
@ -164,30 +161,24 @@ 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.5", "com.github.spullara.mustache.java:compiler:0.9.1",
"javax.inject:javax.inject:1", "javax.inject:javax.inject:1",
"com.google.inject:guice:${Versions.guice}", "com.google.inject:guice:4.0",
"com.google.inject.extensions:guice-assistedinject:${Versions.guice}", "com.google.inject.extensions:guice-assistedinject:4.0",
"com.beust:jcommander:${Versions.jcommander}", "com.beust:jcommander:1.65",
"org.apache.maven:maven-model:${Versions.maven}", "org.apache.maven:maven-model:${Versions.maven}",
"com.google.code.findbugs:jsr305:3.0.2", "com.google.code.findbugs:jsr305:3.0.1",
"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:3.4.2", "com.squareup.okhttp3:okhttp-ws:${Versions.okhttp}",
"biz.aQute.bnd:biz.aQute.bndlib:3.5.0", "biz.aQute.bnd:bndlib:2.4.0",
*mavenResolver("spi"), *mavenResolver("spi"),
"com.squareup.okhttp3:logging-interceptor:3.9.0", "com.squareup.okhttp3:logging-interceptor:3.2.0",
"com.sparkjava:spark-core:2.6.0", "com.sparkjava:spark-core:2.5",
"org.codehaus.groovy:groovy:2.4.12", "org.codehaus.groovy:groovy:2.4.8"
// 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}",
@ -203,7 +194,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.8.0", "org.assertj:assertj-core:3.4.1",
*mavenResolver("util") *mavenResolver("util")
) )
} }
@ -309,13 +300,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 = "https://beust.com/kobalt" url = "http://beust.com/kobalt"
licenses = listOf(License().apply { licenses = listOf(License().apply {
name = "Apache-2.0" name = "Apache-2.0"
url = "https://www.apache.org/licenses/LICENSE-2.0" url = "http://www.apache.org/licenses/LICENSE-2.0"
}) })
scm = Scm().apply { scm = Scm().apply {
url = "https://github.com/cbeust/kobalt" url = "http://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"
} }
@ -323,4 +314,4 @@ fun createPom(projectName: String, projectDescription: String) = Model().apply {
name = "Cedric Beust" name = "Cedric Beust"
email = "cedric@beust.com" email = "cedric@beust.com"
}) })
} }

View file

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

View file

@ -1,8 +0,0 @@
#!/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

@ -1,85 +0,0 @@
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

@ -1,279 +0,0 @@
<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,9 +61,6 @@ 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
@ -104,8 +101,5 @@ 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.2.70" val KOTLIN_COMPILER_VERSION = "1.1.1"
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("https://repo1.maven.org/maven2/", "Maven"), HostConfig("http://repo1.maven.org/maven2/", "Maven"),
HostConfig("https://jcenter.bintray.com/", "JCenter") HostConfig("https://jcenter.bintray.com/", "JCenter")
// "https://repository.jetbrains.com/all/", // <-- contains snapshots // "http://repository.jetbrains.com/all/", // <-- contains snapshots
// snapshots // snapshots
// "https://oss.sonatype.org/content/repositories/snapshots/" // "https://oss.sonatype.org/content/repositories/snapshots/"

View file

@ -3,7 +3,6 @@ package com.beust.kobalt
import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.archive.Archives import com.beust.kobalt.archive.Archives
import com.beust.kobalt.archive.MetaArchive
import com.beust.kobalt.archive.Zip import com.beust.kobalt.archive.Zip
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.aether.Scope import com.beust.kobalt.maven.aether.Scope
@ -142,7 +141,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
val allFiles = includedFiles.flatMap { file -> val allFiles = includedFiles.flatMap { file ->
file.allFromFiles(project.directory).map { file.from(it.path) } file.allFromFiles(project.directory).map { file.from(it.path) }
} }
val manifestFiles = allFiles.filter { it.path.contains(MetaArchive.MANIFEST_MF) } val manifestFiles = allFiles.filter { it.path.contains("META-INF/MANIFEST.MF") }
return if (manifestFiles.any()) manifestFiles[0] else null return if (manifestFiles.any()) manifestFiles[0] else null
} }
@ -151,7 +150,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
context.logger.log(project.name, 2, "Including MANIFEST.MF file $manifestFile") context.logger.log(project.name, 2, "Including MANIFEST.MF file $manifestFile")
Manifest(FileInputStream(manifestFile)) Manifest(FileInputStream(manifestFile))
} else { } else {
null Manifest()
} }
} }

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

@ -2,16 +2,10 @@ package com.beust.kobalt
class SystemProperties { class SystemProperties {
companion object { companion object {
val javaBase : String val javaBase =
get() { System.getenv("JAVA_HOME")
val jh = System.getenv("JAVA_HOME") ?: System.getProperty("java.home")
?: System.getProperty("java.home") ?: throw IllegalArgumentException("JAVA_HOME not defined")
?: throw IllegalArgumentException("JAVA_HOME not defined")
val result =
if (jh.toLowerCase().endsWith("jre")) jh.substring(0, jh.length - 4)
else jh
return result
}
val javaVersion = System.getProperty("java.version") val javaVersion = System.getProperty("java.version")
val homeDir = System.getProperty("user.home") val homeDir = System.getProperty("user.home")
val tmpDir = System.getProperty("java.io.tmpdir") val tmpDir = System.getProperty("java.io.tmpdir")

View file

@ -126,62 +126,61 @@ 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(project, context, // val contributor = ActorUtils.selectAffinityActor(context.pluginInfo.buildConfigContributors, project)
context.pluginInfo.buildConfigContributors) // if (contributor != null) {
if (contributor != null) { // val code = contributor.generateBuildConfig(project, context, pkg, this, buildConfigs)
val code = contributor.generateBuildConfig(project, context, pkg, this, buildConfigs) // val result = KFiles.makeDir(KFiles.generatedSourceDir(project, this, "buildConfig"))
val result = KFiles.makeDir(KFiles.generatedSourceDir(project, this, "buildConfig")) // // Make sure the generatedSourceDirectory doesn't contain the project.directory since
// Make sure the generatedSourceDirectory doesn't contain the project.directory since // // that directory will be added when trying to find recursively all the sources in it
// that directory will be added when trying to find recursively all the sources in it // generatedSourceDirectory = result.relativeTo(File(project.directory))
generatedSourceDirectory = result.relativeTo(File(project.directory)) // val outputGeneratedSourceDirectory = File(result, pkg.replace('.', File.separatorChar))
val outputGeneratedSourceDirectory = File(result, pkg.replace('.', File.separatorChar)) // val outputDir = File(outputGeneratedSourceDirectory, "BuildConfig." + contributor.buildConfigSuffix)
val outputDir = File(outputGeneratedSourceDirectory, "BuildConfig." + contributor.buildConfigSuffix) // KFiles.saveFile(outputDir, code)
KFiles.saveFile(outputDir, code) // context.logger.log(project.name, 2, "Generated ${outputDir.path}")
context.logger.log(project.name, 2, "Generated ${outputDir.path}") // return result
return result // } else {
} else { // throw KobaltException("Couldn't find a contributor to generateAndSave BuildConfig")
throw KobaltException("Couldn't find a contributor to generateAndSave BuildConfig") // }
} // } else {
} else { // return null
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 : IProjectAffinity { interface IBuildConfigContributor : ISimpleAffinity<Project> {
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

@ -1,11 +1,10 @@
package com.beust.kobalt.api package com.beust.kobalt.api
import com.beust.kobalt.TaskResult import com.beust.kobalt.TaskResult
import com.beust.kobalt.api.IClasspathDependency
/** /**
* Plugins that can run a project (task "run" or "test") should implement this interface. * Plugins that can run a project (task "run" or "test") should implement this interface.
*
* Currently not used.
*/ */
interface IRunnerContributor : IContributor, IProjectAffinity { interface IRunnerContributor : IContributor, IProjectAffinity {
/** /**

View file

@ -26,7 +26,6 @@ class DynamicTask(override val plugin: IPlugin, override val name: String, overr
return TaskResult2(taskResult.success, errorMessage = taskResult.errorMessage, value = this) return TaskResult2(taskResult.success, errorMessage = taskResult.errorMessage, value = this)
} }
override fun toString() = override fun toString() = "[DynamicTask $name dependsOn=$dependsOn reverseDependsOn=$reverseDependsOn]"
"[DynamicTask ${project.name}:$name dependsOn=$dependsOn reverseDependsOn=$reverseDependsOn]"
} }

View file

@ -44,25 +44,6 @@ class TaskContributor @Inject constructor(val incrementalManagerFactory: Increme
} }
} }
fun addTask(plugin: IPlugin, project: Project, taskName: String, description: String,
group: String = AnnotationDefault.GROUP,
dependsOn: List<String> = emptyList(),
reverseDependsOn : List<String> = emptyList(),
runBefore : List<String> = emptyList(),
runAfter : List<String> = emptyList(),
alwaysRunAfter: List<String> = emptyList(),
runTask: (Project) -> TaskResult) {
dynamicTasks.add(DynamicTask(plugin, taskName, description, group, project,
dependsOn = dependsOn,
reverseDependsOn = reverseDependsOn,
runBefore = runBefore,
runAfter = runAfter,
alwaysRunAfter = alwaysRunAfter,
closure = { p: Project ->
runTask(project)
}))
}
fun addIncrementalVariantTasks(plugin: IPlugin, project: Project, context: KobaltContext, taskName: String, fun addIncrementalVariantTasks(plugin: IPlugin, project: Project, context: KobaltContext, taskName: String,
group: String = AnnotationDefault.GROUP, group: String = AnnotationDefault.GROUP,
dependsOn: List<String> = emptyList(), dependsOn: List<String> = emptyList(),

View file

@ -17,8 +17,7 @@ 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 + fun defaultArchiveName(project: Project) = project.name + "-" + project.version
if (project.version.isNullOrBlank()) "" else "-${project.version}"
fun generateArchive(project: Project, fun generateArchive(project: Project,
context: KobaltContext, context: KobaltContext,

View file

@ -9,6 +9,7 @@ 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
@ -17,40 +18,15 @@ import org.apache.commons.compress.archivers.zip.ZipFile as ApacheZipFile
* Uses ZipArchiveOutputStream for fast inclusion of expanded jar files. * Uses ZipArchiveOutputStream for fast inclusion of expanded jar files.
*/ */
class MetaArchive(outputFile: File, val manifest: Manifest?) : Closeable { class MetaArchive(outputFile: File, val manifest: Manifest?) : Closeable {
companion object { private val zos = ZipArchiveOutputStream(outputFile).apply {
const val MANIFEST_MF = "META-INF/MANIFEST.MF"
}
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 = 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)
} }
@ -58,30 +34,6 @@ 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
@ -93,33 +45,40 @@ 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 { private fun okToAdd(name: String): Boolean = ! seen.contains(name)
val result = !KFiles.isExcluded(name, && ! KFiles.isExcluded(name, DEFAULT_JAR_EXCLUDES)
Glob("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", MANIFEST_MF))
// if (name.startsWith("META-INF")) println((if (result) "ADDING" else "NOT ADDING") + " $name") override fun close() {
return result if (manifest != null) {
Files.createTempFile("aaa", "bbb").toFile().let { manifestFile ->
FileOutputStream(manifestFile).use { fos ->
manifest.write(fos)
}
val entry = zos.createArchiveEntry(manifestFile, "META-INF/MANIFEST.MF")
addEntry(entry, FileInputStream(manifestFile))
}
}
zos.close()
} }
override fun close() = 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) {
entry.name.let { name -> if (okToAdd(entry.name)) {
if (!seen.contains(name) && okToAdd(name)) { action()
action()
}
seen.add(name)
} }
seen.add(entry.name)
} }
} }

View file

@ -2,7 +2,7 @@ package com.beust.kobalt.internal
class DocUrl { class DocUrl {
companion object { companion object {
private const val HOST = "https://beust.com/kobalt/" private const val HOST = "http://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,11 +112,10 @@ 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) {
@ -137,7 +136,12 @@ 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()
errorCode = process.waitFor() val 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")
@ -148,13 +152,6 @@ 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,8 +35,7 @@ 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("junit5") || it.id.contains("jupiter") }) if (project.testDependencies.any { it.id.contains("jupiter") }) IAffinity.DEFAULT_POSITIVE_AFFINITY + 100
IAffinity.DEFAULT_POSITIVE_AFFINITY + 100
else 0 else 0
return result return result

View file

@ -28,6 +28,7 @@ class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager)
.distinct() .distinct()
// Plugins that add flags to the compiler // Plugins that add flags to the compiler
val currentFlags = arrayListOf<String>().apply { addAll(info.compilerArgs) }
val contributorFlags : List<String> = if (project != null) flags else emptyList() val contributorFlags : List<String> = if (project != null) flags else emptyList()
val addedFlags = contributorFlags + ArrayList(info.compilerArgs) val addedFlags = contributorFlags + ArrayList(info.compilerArgs)

View file

@ -9,6 +9,7 @@ import com.beust.kobalt.api.annotation.ExportedProjectProperty
import com.beust.kobalt.api.annotation.IncrementalTask import com.beust.kobalt.api.annotation.IncrementalTask
import com.beust.kobalt.api.annotation.Task import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.LocalRepo
import com.beust.kobalt.maven.Md5 import com.beust.kobalt.maven.Md5
import com.beust.kobalt.maven.aether.Scope import com.beust.kobalt.maven.aether.Scope
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
@ -26,6 +27,7 @@ import javax.inject.Singleton
*/ */
@Singleton @Singleton
open class JvmCompilerPlugin @Inject constructor( open class JvmCompilerPlugin @Inject constructor(
open val localRepo: LocalRepo,
open val files: KFiles, open val files: KFiles,
open val dependencyManager: DependencyManager, open val dependencyManager: DependencyManager,
open val executors: KobaltExecutors, open val executors: KobaltExecutors,
@ -157,10 +159,6 @@ 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()
/** /**
@ -174,10 +172,7 @@ open class JvmCompilerPlugin @Inject constructor(
if (wi.value.sourceSuffixes.contains("java")) ij = wi.index if (wi.value.sourceSuffixes.contains("java")) ij = wi.index
if (wi.value.sourceSuffixes.contains("kt")) ik = wi.index if (wi.value.sourceSuffixes.contains("kt")) ik = wi.index
} }
Collections.swap(result, ik, ij)
if (ik >= 0 && ij >= 0) {
Collections.swap(result, ik, ij)
}
return result return result
} }
@ -187,8 +182,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(KFiles.joinDir(project.buildDirectory, KFiles.TEST_CLASSES_DIR)) if (isTest) File(project.buildDirectory, KFiles.TEST_CLASSES_DIR)
else File(KFiles.joinDir(project.classesDir(context))) else File(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,
@ -226,7 +221,7 @@ open class JvmCompilerPlugin @Inject constructor(
} }
@Task(name = "doc", description = "Generate the documentation for the project", group = GROUP_DOCUMENTATION, @Task(name = "doc", description = "Generate the documentation for the project", group = GROUP_DOCUMENTATION,
runBefore = arrayOf("assemble"), runAfter = arrayOf("clean")) runBefore = arrayOf("assemble"))
fun taskJavadoc(project: Project): TaskResult { fun taskJavadoc(project: Project): TaskResult {
val docGenerator = ActorUtils.selectAffinityActor(project, context, context.pluginInfo.docContributors) val docGenerator = ActorUtils.selectAffinityActor(project, context, context.pluginInfo.docContributors)
if (docGenerator != null) { if (docGenerator != null) {

View file

@ -78,7 +78,7 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
val compilerInterceptors = arrayListOf<ICompilerInterceptor>() val compilerInterceptors = arrayListOf<ICompilerInterceptor>()
val sourceDirectoriesInterceptors = arrayListOf<ISourceDirectoryInterceptor>() val sourceDirectoriesInterceptors = arrayListOf<ISourceDirectoryInterceptor>()
val buildDirectoryInterceptors = arrayListOf<IBuildDirectoryInterceptor>() val buildDirectoryInterceptors = arrayListOf<IBuildDirectoryInterceptor>()
// val runnerContributors = arrayListOf<IRunnerContributor>() val runnerContributors = arrayListOf<IRunnerContributor>()
val testRunnerContributors = arrayListOf<ITestRunnerContributor>() val testRunnerContributors = arrayListOf<ITestRunnerContributor>()
val classpathInterceptors = arrayListOf<IClasspathInterceptor>() val classpathInterceptors = arrayListOf<IClasspathInterceptor>()
val compilerContributors = arrayListOf<ICompilerContributor>() val compilerContributors = arrayListOf<ICompilerContributor>()
@ -197,7 +197,7 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
if (this is IPlugin) plugins.add(this) if (this is IPlugin) plugins.add(this)
if (this is IProjectContributor) projectContributors.add(this) if (this is IProjectContributor) projectContributors.add(this)
if (this is IRepoContributor) repoContributors.add(this) if (this is IRepoContributor) repoContributors.add(this)
// if (this is IRunnerContributor) runnerContributors.add(this) if (this is IRunnerContributor) runnerContributors.add(this)
if (this is ISourceDirectoryContributor) sourceDirContributors.add(this) if (this is ISourceDirectoryContributor) sourceDirContributors.add(this)
if (this is ISourceDirectoryInterceptor) sourceDirectoriesInterceptors.add(this) if (this is ISourceDirectoryInterceptor) sourceDirectoriesInterceptors.add(this)
if (this is ITaskContributor) taskContributors.add(this) if (this is ITaskContributor) taskContributors.add(this)
@ -225,7 +225,7 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
listOf(projectContributors, classpathContributors, templateContributors, listOf(projectContributors, classpathContributors, templateContributors,
repoContributors, compilerFlagContributors, compilerInterceptors, repoContributors, compilerFlagContributors, compilerInterceptors,
sourceDirectoriesInterceptors, buildDirectoryInterceptors, sourceDirectoriesInterceptors, buildDirectoryInterceptors,
/* runnerContributors, */ testRunnerContributors, classpathInterceptors, runnerContributors, testRunnerContributors, classpathInterceptors,
compilerContributors, docContributors, sourceDirContributors, compilerContributors, docContributors, sourceDirContributors,
testSourceDirContributors, buildConfigFieldContributors, testSourceDirContributors, buildConfigFieldContributors,
taskContributors, incrementalTaskContributors, assemblyContributors, taskContributors, incrementalTaskContributors, assemblyContributors,
@ -252,7 +252,7 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
compilerInterceptors.addAll(pluginInfo.compilerInterceptors) compilerInterceptors.addAll(pluginInfo.compilerInterceptors)
sourceDirectoriesInterceptors.addAll(pluginInfo.sourceDirectoriesInterceptors) sourceDirectoriesInterceptors.addAll(pluginInfo.sourceDirectoriesInterceptors)
buildDirectoryInterceptors.addAll(pluginInfo.buildDirectoryInterceptors) buildDirectoryInterceptors.addAll(pluginInfo.buildDirectoryInterceptors)
// runnerContributors.addAll(pluginInfo.runnerContributors) runnerContributors.addAll(pluginInfo.runnerContributors)
testRunnerContributors.addAll(pluginInfo.testRunnerContributors) testRunnerContributors.addAll(pluginInfo.testRunnerContributors)
classpathInterceptors.addAll(pluginInfo.classpathInterceptors) classpathInterceptors.addAll(pluginInfo.classpathInterceptors)
compilerContributors.addAll(pluginInfo.compilerContributors) compilerContributors.addAll(pluginInfo.compilerContributors)

View file

@ -16,5 +16,6 @@ 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

@ -320,9 +320,7 @@ class TaskWorker(val tasks: List<ITask>, val dryRun: Boolean, val pluginInfo: Pl
val tr = if (dryRun) TaskResult() else it.call() val tr = if (dryRun) TaskResult() else it.call()
BaseProjectRunner.runBuildListenersForTask(it.project, context, name, start = false, success = tr.success) BaseProjectRunner.runBuildListenersForTask(it.project, context, name, start = false, success = tr.success)
success = success and tr.success success = success and tr.success
tr.errorMessage?.let { if (tr.errorMessage != null) errorMessages.add(tr.errorMessage)
errorMessages.add(it)
}
} }
return TaskResult2(success, errorMessage = errorMessages.joinToString("\n"), value = tasks[0]) return TaskResult2(success, errorMessage = errorMessages.joinToString("\n"), value = tasks[0])
} }

View file

@ -14,14 +14,11 @@ 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() {
@ -30,10 +27,7 @@ class TestNgRunner : GenericTestRunner() {
override val annotationPackage = "org.testng" override val annotationPackage = "org.testng"
override val runnerName = "TestNG" override val runnerName = "TestNG"
private fun defaultOutputWithoutProjectDir(project: Project) fun defaultOutput(project: Project) = KFiles.joinDir(project.buildDirectory, "test-output")
= 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 {
@ -45,9 +39,7 @@ class TestNgRunner : GenericTestRunner() {
if (testConfig.testArgs.none { it == "-d" }) { if (testConfig.testArgs.none { it == "-d" }) {
add("-d") add("-d")
// Don't include the project directory here since the generic runner will cd to that directory before add(defaultOutput(project))
// running the tests
add(defaultOutputWithoutProjectDir(project))
} }
if (testConfig.testArgs.size == 0) { if (testConfig.testArgs.size == 0) {
@ -85,15 +77,6 @@ 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) {
@ -107,7 +90,6 @@ 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

@ -1,18 +1,16 @@
package com.beust.kobalt.maven package com.beust.kobalt.maven
import com.beust.kobalt.OperatingSystem import com.beust.kobalt.OperatingSystem
import com.beust.kobalt.misc.LocalProperties
import com.beust.kobalt.misc.error import com.beust.kobalt.misc.error
import com.beust.kobalt.misc.kobaltLog import com.beust.kobalt.misc.kobaltLog
import com.beust.kobalt.misc.warn import com.beust.kobalt.misc.warn
import com.google.inject.Inject
import com.google.inject.Singleton import com.google.inject.Singleton
import java.io.BufferedReader import java.io.BufferedReader
import java.io.File import java.io.File
import java.io.InputStreamReader import java.io.InputStreamReader
@Singleton @Singleton
class Gpg @Inject constructor(val localProperties: LocalProperties) { class Gpg {
val COMMANDS = listOf("gpg", "gpg2") val COMMANDS = listOf("gpg", "gpg2")
fun findGpgCommand() : String? { fun findGpgCommand() : String? {
@ -44,21 +42,6 @@ class Gpg @Inject constructor(val localProperties: LocalProperties) {
ascFile.delete() ascFile.delete()
val allArgs = arrayListOf<String>() val allArgs = arrayListOf<String>()
allArgs.add(gpg) allArgs.add(gpg)
fun maybeAdd(prop: String, f: (String) -> Unit) = localProperties.getNoThrows(prop)?.let {
f(it)
}
maybeAdd("gpg.password") {
allArgs.addAll(listOf("--passphrase", it, "--batch", "--yes"))
}
maybeAdd("gpg.keyId") {
allArgs.addAll(listOf("--local-user", it))
}
maybeAdd("gpg.secretKeyRingFile") {
allArgs.addAll(listOf("--secret-keyring", "\"$it\""))
}
allArgs.add("-ab") allArgs.add("-ab")
allArgs.add(file.absolutePath) allArgs.add(file.absolutePath)

View file

@ -2,7 +2,6 @@ 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
@ -33,9 +32,8 @@ object Booter {
// } // }
fun newRepositorySystemSession(system: RepositorySystem, repo: File, settings: KobaltSettings, fun newRepositorySystemSession(system: RepositorySystem, repo: File, settings: KobaltSettings,
args: Args, eventBus: EventBus): DefaultRepositorySystemSession { 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 = "https://beust.com/kobalt/documentation/index.html#maven-repos-authenticated") docUrl = "http://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")
@ -76,13 +76,9 @@ class KobaltMavenResolver @Inject constructor(val settings: KobaltSettings,
val artifact = DefaultArtifact(mavenId) val artifact = DefaultArtifact(mavenId)
val request = VersionRangeRequest(artifact, createRepos(repos), null) val request = VersionRangeRequest(artifact, createRepos(repos), null)
val rr = system.resolveVersionRange(session, request) val rr = system.resolveVersionRange(session, request)
if (rr.highestVersion != null) { val newArtifact = DefaultArtifact(artifact.groupId, artifact.artifactId, artifact.classifier,
val newArtifact = DefaultArtifact(artifact.groupId, artifact.artifactId, artifact.classifier, artifact.extension, rr.highestVersion.toString())
artifact.extension, rr.highestVersion.toString()) artifactToId(newArtifact)
artifactToId(newArtifact)
} else {
throw KobaltException("Couldn't resolve $passedId")
}
} else { } else {
passedId passedId
} }
@ -141,7 +137,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, args, eventBus) private val session = Booter.newRepositorySystemSession(system, localRepo.localRepo, settings, 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

@ -6,11 +6,10 @@ import com.google.inject.Inject
import java.io.File import java.io.File
class Git @Inject constructor() { class Git @Inject constructor() {
fun maybeTagRelease(project: Project, uploadResult: TaskResult, enabled: Boolean, annotated: Boolean, fun maybeTagRelease(project: Project, uploadResult: TaskResult, enabled: Boolean, annotated: Boolean, tag: String, message: String) : TaskResult {
push: Boolean, tag: String, message: String) : TaskResult {
val result = val result =
if (uploadResult.success && enabled) { if (uploadResult.success && enabled) {
val tagSuccess = tagRelease(project, annotated, push, tag, message) val tagSuccess = tagRelease(project, annotated, tag, message)
if (! tagSuccess) { if (! tagSuccess) {
TaskResult(false, errorMessage = "Couldn't tag the project") TaskResult(false, errorMessage = "Couldn't tag the project")
} else { } else {
@ -22,7 +21,7 @@ class Git @Inject constructor() {
return result return result
} }
private fun tagRelease(project: Project, annotated: Boolean, push: Boolean, tag: String, message: String) : Boolean { private fun tagRelease(project: Project, annotated: Boolean, tag: String, message: String) : Boolean {
val version = if (tag.isNullOrBlank()) project.version else tag val version = if (tag.isNullOrBlank()) project.version else tag
val success = try { val success = try {
log(2, "Tagging this release as \"$version\"") log(2, "Tagging this release as \"$version\"")
@ -38,9 +37,7 @@ class Git @Inject constructor() {
} else { } else {
git.tag().setName(version).setMessage(message).call() git.tag().setName(version).setMessage(message).call()
} }
if (push) { git.push().setPushTags().call()
git.push().setPushTags().call()
}
true true
} catch(ex: Exception) { } catch(ex: Exception) {
warn("Couldn't create tag ${version}: ${ex.message}", ex) warn("Couldn't create tag ${version}: ${ex.message}", ex)

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")
@ -120,8 +120,8 @@ class GithubApi2 @Inject constructor(
Duration.between(VersionCheckTimestampFile.timestamp, Instant.now())) { Duration.between(VersionCheckTimestampFile.timestamp, Instant.now())) {
kobaltLog(2, "Skipping GitHub latest release check, too soon.") kobaltLog(2, "Skipping GitHub latest release check, too soon.")
} else { } else {
val username = localProperties.getNoThrows(PROPERTY_USERNAME) val username = localProperties.getNoThrows(PROPERTY_USERNAME, DOC_URL)
val accessToken = localProperties.getNoThrows(PROPERTY_ACCESS_TOKEN) val accessToken = localProperties.getNoThrows(PROPERTY_ACCESS_TOKEN, DOC_URL)
try { try {
val req = val req =
if (username != null && accessToken != null) { if (username != null && accessToken != null) {
@ -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 {
result = try { try {
listOf(it.name, it.tagName).filterNotNull().first { !it.isBlank() } result = 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,6 +55,7 @@ class JarUtils {
kobaltLog(2, " Writing contents of jar file $foundFile") kobaltLog(2, " Writing contents of jar file $foundFile")
metaArchive.addArchive(foundFile) metaArchive.addArchive(foundFile)
} else { } else {
val fp = foundFile.path
val toPath = File(file.to).normalize().path val toPath = File(file.to).normalize().path
val finalPath = if (toPath.isEmpty()) null else (toPath + "/") val finalPath = if (toPath.isEmpty()) null else (toPath + "/")
metaArchive.addFile(File(directory, fromFile.path), foundFile, finalPath) metaArchive.addFile(File(directory, fromFile.path), foundFile, finalPath)

View file

@ -10,9 +10,7 @@ import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
import java.nio.file.StandardCopyOption import java.nio.file.StandardCopyOption
import java.util.*
import java.util.jar.JarInputStream import java.util.jar.JarInputStream
import java.util.regex.Pattern
class KFiles { class KFiles {
@ -22,20 +20,6 @@ class KFiles {
*/ */
val kobaltJar : List<String> val kobaltJar : List<String>
get() { get() {
val PATTERN = Pattern.compile("kobalt-([-.0-9]+)")
fun latestInstalledVersion() : StringVersion {
val versions = File(distributionsDir).listFiles().map { it.name }.map {
val matcher = PATTERN.matcher(it)
val result =
if (matcher.matches()) matcher.group(1)
else null
result
}.filterNotNull().map(::StringVersion)
Collections.sort(versions, reverseOrder())
return versions[0]
}
val envJar = System.getenv("KOBALT_JAR") val envJar = System.getenv("KOBALT_JAR")
if (envJar != null) { if (envJar != null) {
debug("Using kobalt jar $envJar") debug("Using kobalt jar $envJar")
@ -47,21 +31,19 @@ class KFiles {
if (jarFile.exists()) { if (jarFile.exists()) {
return listOf(jarFile.absolutePath) return listOf(jarFile.absolutePath)
} else { } else {
// In development mode, keep your kobalt.properties version to a nonexistent version // In development mode, keep your kobalt.properties version one above kobalt-wrapper.properties:
// kobalt.properties: kobalt.version=0.828 // kobalt.properties: kobalt.version=0.828
// kobalt-wrapper.properties: kobalt.version=0.827 // kobalt-wrapper.properties: kobalt.version=0.827
// When Kobalt can't find the newest jar file, it will instead use the classes produced by IDEA // When Kobalt can't find the newest jar file, it will instead use the classes produced by IDEA
// in the directories specified here: // in the directories specified here:
val previousVersion = latestInstalledVersion().version val leftSuffix = Kobalt.version.substring(0, Kobalt.version.lastIndexOf(".") + 1)
val previousVersion = leftSuffix +
(Kobalt.version.split(".").let { it[it.size - 1] }.toInt() - 1).toString()
val previousJar = joinDir(distributionsDir, "kobalt-" + previousVersion, val previousJar = joinDir(distributionsDir, "kobalt-" + previousVersion,
"kobalt/wrapper/kobalt-$previousVersion.jar") "kobalt/wrapper/kobalt-$previousVersion.jar")
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"))) //kobalt build dirs File(homeDir(KFiles.joinDir("kotlin", "kobalt", it, "kobaltBuild", "classes")))
.absolutePath .absolutePath
} + listOf("modules/kobalt", "modules/kobalt-plugin-api", "modules/wrapper").map {
File(homeDir(KFiles.joinDir("kotlin", "kobalt", it, "target", "classes"))) //maven build dirs
.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(" "))
return result.filter { File(it).exists() } return result.filter { File(it).exists() }
@ -137,7 +119,7 @@ class KFiles {
fun joinFileAndMakeDir(vararg ts: String) = joinDir(joinAndMakeDir(ts.slice(0..ts.size - 2)), ts[ts.size - 1]) fun joinFileAndMakeDir(vararg ts: String) = joinDir(joinAndMakeDir(ts.slice(0..ts.size - 2)), ts[ts.size - 1])
fun fixSlashes(f: File) = f.normalize().path.replace('\\', '/') fun fixSlashes(f: File) = f.normalize().path.replace('\\', '/')
fun fixSlashes(s: String) = s.replace('\\', '/') fun fixSlashes(s: String) = fixSlashes(File(s))
fun makeDir(dir: String, s: String? = null) = fun makeDir(dir: String, s: String? = null) =
(if (s != null) File(dir, s) else File(dir)).apply { mkdirs() } (if (s != null) File(dir, s) else File(dir)).apply { mkdirs() }
@ -245,18 +227,22 @@ class KFiles {
private fun isWindows() = System.getProperty("os.name").contains("Windows") private fun isWindows() = System.getProperty("os.name").contains("Windows")
fun copy(from: Path?, to: Path?, option: StandardCopyOption = StandardCopyOption.REPLACE_EXISTING) { fun copy(from: Path?, to: Path?, option: StandardCopyOption = StandardCopyOption.REPLACE_EXISTING) {
try { if (isWindows() && to!!.toFile().exists()) {
if (from != null && to != null) { kobaltLog(2, "Windows detected, not overwriting $to")
if (!Files.exists(to) || Md5.toMd5(from.toFile()) != Md5.toMd5(to.toFile())) { } else {
kobaltLog(3, "Copy from $from to $to") try {
Files.copy(from, to, option) if (from != null && to != null) {
} else { if (!Files.exists(to) || Md5.toMd5(from.toFile()) != Md5.toMd5(to.toFile())) {
kobaltLog(3, " Not copying, indentical files: $from $to") kobaltLog(3, "Copy from $from to $to")
Files.copy(from, to, option)
} else {
kobaltLog(3, " Not copying, indentical files: $from $to")
}
} }
} catch(ex: IOException) {
// Windows is anal about this
kobaltLog(1, "Couldn't copy $from to $to: ${ex.message}")
} }
} catch(ex: IOException) {
// Windows is anal about this
kobaltLog(1, "Couldn't copy $from to $to: ${ex.message}")
} }
} }

View file

@ -1,9 +1,6 @@
package com.beust.kobalt.misc package com.beust.kobalt.misc
import com.beust.kobalt.Args import com.beust.kobalt.*
import com.beust.kobalt.AsciiArt
import com.beust.kobalt.Constants
import com.beust.kobalt.KobaltException
import com.beust.kobalt.api.Kobalt import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.maven.aether.Exceptions import com.beust.kobalt.maven.aether.Exceptions
import java.lang.Exception import java.lang.Exception
@ -51,7 +48,7 @@ fun Any.error(text: CharSequence, e: Throwable? = null) {
object KobaltLogger { object KobaltLogger {
var LOG_LEVEL: Int = 1 var LOG_LEVEL: Int = 1
val isQuiet: Boolean get() = (LOG_LEVEL == Constants.LOG_QUIET_LEVEL) val isQuiet: Boolean get() = (LOG_LEVEL == Constants.LOG_QUIET_LEVEL)
val logger: Logger get() = val logger: Logger get() =
@ -60,14 +57,6 @@ 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) {
@ -86,8 +75,7 @@ class Logger(val dev: Boolean) {
fun error(tag: String, message: CharSequence, e: Throwable? = null) { fun error(tag: String, message: CharSequence, e: Throwable? = null) {
val docUrl = if (e is KobaltException && e.docUrl != null) e.docUrl else null val docUrl = if (e is KobaltException && e.docUrl != null) e.docUrl else null
val text = val text = if (! message.isBlank()) message
if (message.isNotBlank()) message
else if (e != null && (! e.message.isNullOrBlank())) e.message else if (e != null && (! e.message.isNullOrBlank())) e.message
else { e?.toString() } else { e?.toString() }
val shortMessage = "***** E $text " + if (docUrl != null) " Documentation: $docUrl" else "" val shortMessage = "***** E $text " + if (docUrl != null) " Documentation: $docUrl" else ""
@ -100,10 +88,7 @@ class Logger(val dev: Boolean) {
} }
fun warn(tag: String, message: CharSequence, e: Throwable? = null) { fun warn(tag: String, message: CharSequence, e: Throwable? = null) {
val fullMessage = "***** WARNING " + val fullMessage = "***** WARNING " + (e?.message ?: message)
if (message.isNotBlank()) message
else if (e != null && (!e.message.isNullOrBlank())) e.message
else e?.toString()
println(AsciiArt.Companion.warnColor(getPattern("W", fullMessage, fullMessage, tag))) println(AsciiArt.Companion.warnColor(getPattern("W", fullMessage, fullMessage, tag)))
if (KobaltLogger.LOG_LEVEL > 1 && e != null) { if (KobaltLogger.LOG_LEVEL > 1 && e != null) {
Exceptions.printStackTrace(e) Exceptions.printStackTrace(e)

View file

@ -24,7 +24,7 @@ class KobaltWrapperProperties @Inject constructor() {
} }
private fun defaultUrlFor(version: String) = private fun defaultUrlFor(version: String) =
"https://beust.com/kobalt/kobalt-$version.zip" "http://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

@ -6,9 +6,6 @@ import java.nio.file.Files
import java.nio.file.Paths import java.nio.file.Paths
import java.util.* import java.util.*
/**
* Encapsulate read access to local.properties.
*/
@Singleton @Singleton
class LocalProperties { class LocalProperties {
val localProperties: Properties by lazy { val localProperties: Properties by lazy {
@ -25,11 +22,11 @@ class LocalProperties {
result result
} }
fun getNoThrows(name: String): String? = localProperties.getProperty(name) fun getNoThrows(name: String, docUrl: String? = null) = localProperties.getProperty(name)
fun get(name: String, docUrl: String? = null) : String { fun get(name: String, docUrl: String? = null) : String {
val result = getNoThrows(name) val result = getNoThrows(name, docUrl)
?: throw KobaltException("Couldn't find $name in local.properties", docUrl = docUrl) ?: throw KobaltException("Couldn't find $name in local.properties", docUrl = docUrl)
return result return result as String
} }
} }

View file

@ -19,7 +19,6 @@ 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
@ -79,11 +78,7 @@ 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 processFinished = process.waitFor(120, TimeUnit.SECONDS) val returnCode = process.waitFor(30, 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()
@ -91,19 +86,13 @@ 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(if (info.ignoreExitValue) true else processFinished, input, error) else isSuccess(returnCode, input, error)
if (isSuccess) { if (isSuccess) {
if (!info.useErrorStreamAsErrorIndicator) { info.successCallback(input)
info.successCallback(error + input)
} else {
info.successCallback(input)
}
} else { } else {
info.errorCallback(error + input) info.errorCallback(error + input)
} }
@ -116,7 +105,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: Boolean = ! isSuccess var hasErrors = ! isSuccess
if (info.useErrorStreamAsErrorIndicator && ! hasErrors) { if (info.useErrorStreamAsErrorIndicator && ! hasErrors) {
hasErrors = hasErrors || error.isNotEmpty() hasErrors = hasErrors || error.isNotEmpty()
} }

View file

@ -29,12 +29,8 @@ 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) {
if (version == other.toString()) { warn("Couldn't parse version $version or $other")
return 0 return -1
} else {
log(2, "Couldn't parse version $version or $other")
return -1
}
} }
} }
return 0 return 0

View file

@ -1,79 +0,0 @@
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'
}
}
}
}
}

View file

@ -1,231 +0,0 @@
<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

@ -1,38 +0,0 @@
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'
}
}
}
}
}

View file

@ -1,28 +0,0 @@
<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,6 +47,7 @@ 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;
@ -77,7 +78,6 @@ 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 "https://beust.com/kobalt/kobalt-" + version + ".zip"; return "http://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, "N/A"); return wrapperProperties.getProperty(PROPERTY_VERSION);
} }
private String getWrapperDownloadUrl(String version) { private String getWrapperDownloadUrl(String version) {

34
pom.xml
View file

@ -1,34 +0,0 @@
<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>

View file

@ -1,5 +0,0 @@
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,14 +38,6 @@ 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
@ -55,7 +47,11 @@ 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.setLogLevel(args) KobaltLogger.LOG_LEVEL = if (args.log < Constants.LOG_QUIET_LEVEL) {
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

@ -1,9 +1,8 @@
package com.beust.kobalt package com.beust.kobalt
import com.beust.jcommander.JCommander import com.beust.jcommander.JCommander
import com.beust.kobalt.api.ITask
import com.beust.kobalt.api.Kobalt import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.PluginTask
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.app.ProjectFinder import com.beust.kobalt.app.ProjectFinder
import com.beust.kobalt.app.ProjectGenerator import com.beust.kobalt.app.ProjectGenerator
@ -110,7 +109,7 @@ class Options @Inject constructor(
Option( { args.tasks }, { Option( { args.tasks }, {
// --tasks // --tasks
runIfSuccessfulBuild(buildError) { runIfSuccessfulBuild(buildError) {
displayTasks(allProjects, Kobalt.context!!) displayTasks()
} }
}), }),
Option( { args.checkVersions }, { Option( { args.checkVersions }, {
@ -178,29 +177,19 @@ class Options @Inject constructor(
} }
} }
private fun displayTasks(projects: List<Project>, context: KobaltContext) { private fun displayTasks() {
// //
// List of tasks, --tasks // List of tasks, --tasks
// //
val tasksByPlugins = HashMultimap.create<String, ITask>() val tasksByPlugins = HashMultimap.create<String, PluginTask>()
projects.forEach { project -> taskManager.annotationTasks.forEach {
pluginInfo.taskContributors.forEach { tasksByPlugins.put(it.plugin.name, it)
val tasks = it.tasksFor(project, context)
tasks.forEach {
tasksByPlugins.put(it.plugin.name, it)
}
}
}
listOf(taskManager.annotationTasks, taskManager.dynamicTasks).forEach { tasks ->
tasks.forEach {
tasksByPlugins.put(it.plugin.name, it)
}
} }
val sb = StringBuffer("List of tasks\n") val sb = StringBuffer("List of tasks\n")
tasksByPlugins.keySet().forEach { name -> tasksByPlugins.keySet().forEach { name ->
sb.append("\n " + AsciiArt.horizontalDoubleLine + " $name " sb.append("\n " + AsciiArt.horizontalDoubleLine + " $name "
+ AsciiArt.horizontalDoubleLine + "\n") + AsciiArt.horizontalDoubleLine + "\n")
tasksByPlugins[name].distinctBy(ITask::name).sortedBy(ITask::name).forEach { task -> tasksByPlugins[name].distinctBy(PluginTask::name).sortedBy(PluginTask::name).forEach { task ->
sb.append(" ${task.name}\t\t${task.doc}\n") sb.append(" ${task.name}\t\t${task.doc}\n")
} }
} }

View file

@ -119,7 +119,7 @@ class BuildFiles @Inject constructor(val factory: BuildFileCompiler.IFactory,
parentFile.mkdirs() parentFile.mkdirs()
val imp = arrayListOf<String>().apply { val imp = arrayListOf<String>().apply {
addAll(imports) addAll(imports)
}.toMutableSet().toMutableList() }.distinct()
Collections.sort(imp) Collections.sort(imp)
writeText(imp.joinToString("\n")) writeText(imp.joinToString("\n"))
appendText(code.joinToString("\n")) appendText(code.joinToString("\n"))

View file

@ -20,8 +20,6 @@ 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>
@ -133,19 +131,20 @@ 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, mainDependencies, testDependencies, map) importPom(it, mainDeps, testDeps, 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.trim()}\"," + warn("Old profile syntax detected for \"$line\"," +
" please update to \"val $variable by profile()\"") " please update to \"val $variable by profile()\"")
} }

View file

@ -1,14 +1,11 @@
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,16 +1,10 @@
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

@ -35,7 +35,6 @@ class GetDependencyGraphHandler : WebSocketListener {
fun <T> sendWebsocketCommand(endpoint: RemoteEndpoint, commandName: String, payload: T, fun <T> sendWebsocketCommand(endpoint: RemoteEndpoint, commandName: String, payload: T,
errorMessage: String? = null) { errorMessage: String? = null) {
SparkServer.watchDog.rearm()
val json = Gson().toJson(WebSocketCommand(commandName, payload = Gson().toJson(payload), val json = Gson().toJson(WebSocketCommand(commandName, payload = Gson().toJson(payload),
errorMessage = errorMessage)) errorMessage = errorMessage))
endpoint.sendString(json) endpoint.sendString(json)

View file

@ -12,7 +12,15 @@ 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.* import okhttp3.OkHttpClient
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()))
@ -31,22 +39,26 @@ 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 socketListener = object: WebSocketListener() { val ws = WebSocketCall.create(client, request).enqueue(object: WebSocketListener {
override fun onFailure(webSocket: WebSocket, ex: Throwable, response: Response?) {
Exceptions.printStackTrace(ex)
error("WebSocket failure: ${ex.message} response: $response")
}
override fun onOpen(ws: WebSocket, response: Response) { override fun onOpen(ws: WebSocket, response: Response) {
webSocket = ws webSocket = ws
} }
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { override fun onPong(p0: Buffer?) {
println("Closing socket") println("WebSocket pong")
} }
override fun onMessage(webSocket: WebSocket, text: String) { override fun onClose(p0: Int, p1: String?) {
val json = text println("WebSocket closed")
}
override fun onFailure(ex: IOException, response: Response?) {
Exceptions.printStackTrace(ex)
error("WebSocket failure: ${ex.message} response: $response")
}
override fun onMessage(body: ResponseBody) {
val json = body.string()
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)
@ -75,10 +87,7 @@ class KobaltClient : Runnable {
} }
} }
} }
} })
val ws = client.newWebSocket(request, socketListener)
ws.close(1000, "All good")
} }
} }

View file

@ -1,5 +1,6 @@
package com.beust.kobalt.app.remote package com.beust.kobalt.app.remote
import com.beust.kobalt.api.Project
import com.beust.kobalt.homeDir import com.beust.kobalt.homeDir
import com.beust.kobalt.internal.PluginInfo import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.maven.aether.Exceptions import com.beust.kobalt.maven.aether.Exceptions
@ -73,12 +74,15 @@ class KobaltServer @Inject constructor(@Assisted val force: Boolean, @Assisted @
try { try {
if (createServerFile(port, force)) { if (createServerFile(port, force)) {
kobaltLog(1, "KobaltServer listening on port $port") kobaltLog(1, "KobaltServer listening on port $port")
// OldServer(initCallback, cleanUpCallback).run(port)
// JerseyServer(initCallback, cleanUpCallback).run(port)
SparkServer(cleanUpCallback, pluginInfo).run(port) SparkServer(cleanUpCallback, pluginInfo).run(port)
// WasabiServer(initCallback, cleanUpCallback).run(port)
} }
} catch(ex: Exception) { } catch(ex: Exception) {
Exceptions.printStackTrace(ex) Exceptions.printStackTrace(ex)
} finally { } finally {
deleteServerFile() // deleteServerFile()
} }
return port return port
} }

View file

@ -5,7 +5,6 @@ import com.beust.kobalt.app.Templates
import com.beust.kobalt.internal.PluginInfo import com.beust.kobalt.internal.PluginInfo
import com.google.common.collect.ListMultimap import com.google.common.collect.ListMultimap
import com.google.gson.Gson import com.google.gson.Gson
import org.slf4j.Logger
import spark.ResponseTransformer import spark.ResponseTransformer
import spark.Route import spark.Route
import spark.Spark import spark.Spark
@ -15,8 +14,6 @@ class SparkServer(val cleanUpCallback: () -> Unit, val pluginInfo : PluginInfo)
companion object { companion object {
lateinit var cleanUpCallback: () -> Unit lateinit var cleanUpCallback: () -> Unit
val URL_QUIT = "/quit"
lateinit var watchDog: WatchDog
} }
init { init {
@ -31,25 +28,19 @@ class SparkServer(val cleanUpCallback: () -> Unit, val pluginInfo : PluginInfo)
private fun jsonRoute(path: String, route: Route) private fun jsonRoute(path: String, route: Route)
= Spark.get(path, "application/json", route, JsonTransformer()) = Spark.get(path, "application/json", route, JsonTransformer())
val log: Logger = org.slf4j.LoggerFactory.getLogger("SparkServer") val log = org.slf4j.LoggerFactory.getLogger("SparkServer")
override fun run(port: Int) { override fun run(port: Int) {
val threadPool = Executors.newFixedThreadPool(2)
watchDog = WatchDog(port, 60 * 10 /* 10 minutes */, log)
threadPool.submit {
watchDog.run()
}
log.debug("Server running") log.debug("Server running")
Spark.port(port) Spark.port(port)
Spark.webSocket("/v1/getDependencyGraph", GetDependencyGraphHandler::class.java) Spark.webSocket("/v1/getDependencyGraph", GetDependencyGraphHandler::class.java)
Spark.get("/ping") { req, res -> Spark.get("/ping") { req, res ->
watchDog.rearm()
log.debug(" Received ping") log.debug(" Received ping")
""" { "result" : "ok" } """ """ { "result" : "ok" } """
} }
Spark.get(URL_QUIT, { req, res -> Spark.get("/quit", { req, res ->
log.debug(" Received quit") log.debug(" Received quit")
threadPool.let { executor -> Executors.newFixedThreadPool(1).let { executor ->
executor.submit { executor.submit {
Thread.sleep(1000) Thread.sleep(1000)
Spark.stop() Spark.stop()

View file

@ -1,71 +0,0 @@
package com.beust.kobalt.app.remote
import com.beust.kobalt.misc.warn
import org.slf4j.Logger
import java.net.HttpURLConnection
import java.net.URL
import java.time.Duration
import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.time.format.DateTimeFormatter
/**
* Wakes up every `WAKE_UP_INTERVAL` and check if a certain period of time (`checkPeriod`) has elapsed
* without being rearmed. If that time has elapsed, send a QUIT command to the Kobalt server. If the WatchDog
* gets rearmed, the expiration period is reset.
*/
class WatchDog(val port: Int, val checkPeriodSeconds: Long, val log: Logger) {
private val WAKE_UP_INTERVAL: Duration = Duration.ofSeconds(60)
private val FORMAT: DateTimeFormatter = DateTimeFormatter.ofPattern("MM/d/y HH:mm:ss")
private var nextWakeUpMillis: Long = arm()
private var stop: Boolean = false
/**
* Rearm for another `checkPeriod`.
*/
fun rearm() {
nextWakeUpMillis = arm()
log.info("Watchdog rearmed for " + format(nextWakeUpMillis))
}
/**
* Start the watch dog.
*/
fun run() {
val wakeUpSeconds = WAKE_UP_INTERVAL.toMillis()
log.info("Server dying at " + format(nextWakeUpMillis) + ", next wake up in "
+ (wakeUpSeconds / 1000) + " seconds")
while (! stop) {
Thread.sleep(wakeUpSeconds)
val diffSeconds = (nextWakeUpMillis - System.currentTimeMillis()) / 1000
if (diffSeconds <= 0) {
log.info("Time to die")
stop = true
} else {
log.info("Dying in $diffSeconds seconds")
}
}
try {
val connection = (URL("http://localhost:$port" + SparkServer.URL_QUIT)
.openConnection() as HttpURLConnection).apply {
requestMethod = "GET"
}
val code = connection.responseCode
if (code == 200) {
log.info("Successfully stopped the server")
} else {
warn("Couldn't stop the server, response: " + code)
}
} catch(ex: Exception) {
warn("Couldn't stop the server: " + ex.message, ex)
}
}
private fun arm() = System.currentTimeMillis() + (checkPeriodSeconds * 1000)
private fun toLocalDate(millis: Long) = LocalDateTime.ofEpochSecond(millis / 1000, 0, OffsetDateTime.now().offset)
private fun format(millis: Long) = FORMAT.format(toLocalDate(millis))
}

View file

@ -6,7 +6,9 @@ import com.beust.kobalt.Plugins
import com.beust.kobalt.TaskResult import com.beust.kobalt.TaskResult
import com.beust.kobalt.api.* import com.beust.kobalt.api.*
import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.archive.Archives import com.beust.kobalt.archive.Archives
import com.beust.kobalt.internal.ActorUtils
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.aether.Scope import com.beust.kobalt.maven.aether.Scope
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
@ -20,9 +22,6 @@ import com.google.inject.Singleton
import java.io.File import java.io.File
class ApplicationConfig { class ApplicationConfig {
@Directive
var taskName: String = "run"
@Directive @Directive
var mainClass: String? = null var mainClass: String? = null
@ -33,15 +32,6 @@ 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
@ -53,10 +43,10 @@ fun Project.application(init: ApplicationConfig.() -> Unit): ApplicationConfig {
} }
@Singleton @Singleton
class ApplicationPlugin @Inject constructor(val configActor: ConfigsActor<ApplicationConfig>, class ApplicationPlugin @Inject constructor(val configActor: ConfigActor<ApplicationConfig>,
val executors: KobaltExecutors, val nativeManager: NativeManager, val executors: KobaltExecutors, val nativeManager: NativeManager,
val dependencyManager: DependencyManager, val taskContributor : TaskContributor, val jvm: Jvm) val dependencyManager: DependencyManager, val taskContributor : TaskContributor, val jvm: Jvm)
: BasePlugin(), ITaskContributor, IConfigsActor<ApplicationConfig> by configActor { : BasePlugin(), IRunnerContributor, ITaskContributor, IConfigActor<ApplicationConfig> by configActor {
companion object { companion object {
const val PLUGIN_NAME = "Application" const val PLUGIN_NAME = "Application"
@ -66,50 +56,49 @@ class ApplicationPlugin @Inject constructor(val configActor: ConfigsActor<Applic
override fun apply(project: Project, context: KobaltContext) { override fun apply(project: Project, context: KobaltContext) {
super.apply(project, context) super.apply(project, context)
taskContributor.addVariantTasks(this, project, context, "run", group = "run", dependsOn = listOf("install"),
configurationFor(project)?.let { configs -> runTask = { taskRun(project) })
configs.forEach { config ->
taskContributor.addTask(this, project, config.taskName,
description = "Run the class " + config.mainClass,
group = "run",
dependsOn = listOf("assemble"),
runTask = { run(project, context, config) })
}
}
} }
// fun taskRun(project: Project, config: ApplicationConfig): TaskResult { @Task(name = "run", description = "Run the main class", group = "run", dependsOn = arrayOf("install"))
// val runContributor = ActorUtils.selectAffinityActor(project, context, fun taskRun(project: Project): TaskResult {
// context.pluginInfo.runnerContributors) val runContributor = ActorUtils.selectAffinityActor(project, context,
// if (runContributor != null && runContributor.affinity(project, context) > 0) { context.pluginInfo.runnerContributors)
// return runContributor.run(project, context, if (runContributor != null && runContributor.affinity(project, context) > 0) {
// dependencyManager.dependencies(project, context, listOf(Scope.RUNTIME))) return runContributor.run(project, context,
// } else { dependencyManager.dependencies(project, context, listOf(Scope.RUNTIME)))
// context.logger.log(project.name, 1, } else {
// "Couldn't find a runner for project ${project.name}. Please make sure" + context.logger.log(project.name, 1,
// " your build file contains " + "Couldn't find a runner for project ${project.name}. Please make sure" +
// "an application{} directive with a mainClass=... in it") " your build file contains " +
// return TaskResult() "an application{} directive with a mainClass=... in it")
// } return TaskResult()
// } }
}
private fun isFatJar(packages: List<PackageConfig>, jarName: String): Boolean { private fun isFatJar(packages: List<PackageConfig>, jarName: String): Boolean {
val foundJar = packages.flatMap { it.jars }.filter { jarName.endsWith(it.name) } val foundJar = packages.flatMap { it.jars }.filter { jarName.endsWith(it.name) }
return foundJar.size == 1 && foundJar[0].fatJar return foundJar.size == 1 && foundJar[0].fatJar
} }
private fun run(project: Project, context: KobaltContext, config: ApplicationConfig): TaskResult { // IRunContributor
override fun affinity(project: Project, context: KobaltContext): Int {
return if (configurationFor(project) != null) IAffinity.DEFAULT_POSITIVE_AFFINITY else 0
}
override fun run(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>): TaskResult {
var result = TaskResult()
if (project.nativeDependencies.any()) { if (project.nativeDependencies.any()) {
nativeManager.installLibraries(project) nativeManager.installLibraries(project)
} }
configurationFor(project)?.let { config ->
val result =
if (config.mainClass != null) { if (config.mainClass != null) {
runJarFile(project, context, config) result = runJarFile(project, context, config)
} else { } else {
throw KobaltException("No \"mainClass\" specified in the application{} part of project ${project.name}") throw KobaltException("No \"mainClass\" specified in the application{} part of project ${project.name}")
} }
}
return result return result
} }
@ -147,7 +136,6 @@ 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"))
@ -156,25 +144,11 @@ 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)
} }
//ITaskContributor //ITaskContributor
override fun tasksFor(project: Project, context: KobaltContext): List<DynamicTask> { override fun tasksFor(project: Project, context: KobaltContext): List<DynamicTask> = taskContributor.dynamicTasks
val result = arrayListOf<DynamicTask>()
configurationFor(project)?.let { configs ->
configs.forEach { config ->
result.add(DynamicTask(this, config.taskName, "Run the class " + config.mainClass, "run", project,
dependsOn = listOf("assemble"),
closure = { run(project, context, config) }))
}
}
return result
}
} }

View file

@ -41,15 +41,17 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
override val name = PLUGIN_NAME override val name = PLUGIN_NAME
var kaptConfig: KaptConfig? = null
override fun apply(project: Project, context: KobaltContext) { override fun apply(project: Project, context: KobaltContext) {
super.apply(project, context) super.apply(project, context)
val kaptConfig = kaptConfigs[project.name] kaptConfig = kaptConfigs[project.name]
// Delete the output directories // Delete the output directories
listOf(aptConfigs[project.name]?.outputDir, kaptConfig?.outputDir) listOf(aptConfigs[project.name]?.outputDir, kaptConfig?.outputDir)
.filterNotNull() .filterNotNull()
.distinct() .distinct()
.map { aptGeneratedDir(project, it) } .map { generatedDir(project, it) }
.forEach { .forEach {
it.normalize().absolutePath.let { path -> it.normalize().absolutePath.let { path ->
context.logger.log(project.name, 1, " Deleting " + path) context.logger.log(project.name, 1, " Deleting " + path)
@ -62,10 +64,9 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
// IClasspathContributor // IClasspathContributor
override fun classpathEntriesFor(project: Project?, context: KobaltContext): Collection<IClasspathDependency> { override fun classpathEntriesFor(project: Project?, context: KobaltContext): Collection<IClasspathDependency> {
val result = arrayListOf<IClasspathDependency>() val result = arrayListOf<IClasspathDependency>()
val kaptConfig = kaptConfigs[project?.name]
if (project != null && kaptConfig != null) { if (project != null && kaptConfig != null) {
kaptConfig.let { config -> kaptConfig?.let { config ->
val c = kaptClassesDir(project, config.outputDir) val c = generatedClasses(project, context, config.outputDir)
File(c).mkdirs() File(c).mkdirs()
result.add(FileDependency(c)) result.add(FileDependency(c))
} }
@ -73,46 +74,45 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
return result return result
} }
private fun aptGeneratedDir(project: Project, outputDir: String) : File private fun generatedDir(project: Project, outputDir: String) : File
= File(KFiles.joinDir(project.directory, KFiles.KOBALT_BUILD_DIR, outputDir)) = File(KFiles.joinDir(project.directory, KFiles.KOBALT_BUILD_DIR, outputDir))
// ISourceDirectoryContributor // ISourceDirectoryContributor
override fun sourceDirectoriesFor(project: Project, context: KobaltContext): List<File> { override fun sourceDirectoriesFor(project: Project, context: KobaltContext): List<File> {
val result = arrayListOf<File>() val result = arrayListOf<File>()
aptConfigs[project.name]?.let { config -> aptConfigs[project.name]?.let { config ->
result.add(aptGeneratedDir(project, config.outputDir)) result.add(generatedDir(project, config.outputDir))
} }
kaptConfigs[project.name]?.let { config -> kaptConfigs[project.name]?.let { config ->
result.add(File(kaptSourcesDir(project, config.outputDir))) result.add(generatedDir(project, config.outputDir))
} }
return result return result
} }
private fun kaptGenerated(project: Project, outputDir: String) = private fun generated(project: Project, context: KobaltContext, outputDir: String) =
KFiles.joinAndMakeDir(project.directory, project.buildDirectory, outputDir) KFiles.joinAndMakeDir(project.directory, project.buildDirectory, outputDir)
private fun kaptSourcesDir(project: Project, outputDir: String) = private fun generatedSources(project: Project, context: KobaltContext, outputDir: String) =
KFiles.joinDir(kaptGenerated(project, outputDir), "sources") KFiles.joinDir(generated(project, context, outputDir), "sources")
private fun kaptStubsDir(project: Project, outputDir: String) = private fun generatedStubs(project: Project, context: KobaltContext, outputDir: String) =
KFiles.joinDir(kaptGenerated(project, outputDir), "stubs") KFiles.joinDir(generated(project, context, outputDir), "stubs")
private fun kaptClassesDir(project: Project, outputDir: String) = private fun generatedClasses(project: Project, context: KobaltContext, outputDir: String) =
KFiles.joinDir(kaptGenerated(project, outputDir), "classes") KFiles.joinDir(generated(project, context, outputDir), "classes")
// ITaskContributor // ITaskContributor
override fun tasksFor(project: Project, context: KobaltContext): List<DynamicTask> { override fun tasksFor(project: Project, context: KobaltContext): List<DynamicTask> {
val kaptConfig = kaptConfigs[project.name]
val result = val result =
if (kaptConfig != null) { if (kaptConfig != null) {
listOf( listOf(
DynamicTask(this, "runKapt", "Run kapt", AnnotationDefault.GROUP, project, DynamicTask(this, "runKapt", "Run kapt", AnnotationDefault.GROUP, project,
reverseDependsOn = listOf("compile"), runAfter = listOf("clean"), reverseDependsOn = listOf("compile"), runAfter = listOf("clean"),
closure = {p: Project -> taskRunKapt(p)}), closure = {p: Project -> taskRunKapt(p)}),
DynamicTask(this, "compileKapt", "Compile the sources generated by kapt", DynamicTask(this, "compileKapt", "Compile the sources generated by kapt",
AnnotationDefault.GROUP, project, AnnotationDefault.GROUP, project,
dependsOn = listOf("runKapt"), reverseDependsOn = listOf("compile"), dependsOn = listOf("runKapt"), reverseDependsOn = listOf("compile"),
closure = {p: Project -> taskCompileKapt(p)}) closure = {p: Project -> taskCompileKapt(p)})
) )
} else { } else {
emptyList() emptyList()
@ -124,11 +124,11 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
var success = true var success = true
kaptConfigs[project.name]?.let { config -> kaptConfigs[project.name]?.let { config ->
val sourceDirs = listOf( val sourceDirs = listOf(
kaptStubsDir(project, config.outputDir), generatedStubs(project, context, config.outputDir),
kaptSourcesDir(project, config.outputDir)) generatedSources(project, context, config.outputDir))
val sourceFiles = KFiles.findSourceFiles(project.directory, sourceDirs, listOf("kt")).toList() val sourceFiles = KFiles.findSourceFiles(project.directory, sourceDirs, listOf("kt")).toList()
val buildDirectory = File(KFiles.joinDir(project.directory, val buildDirectory = File(KFiles.joinDir(project.directory,
kaptClassesDir(project, config.outputDir))) generatedClasses(project, context, config.outputDir)))
val flags = listOf<String>() val flags = listOf<String>()
val cai = CompilerActionInfo(project.directory, allDependencies(project), sourceFiles, listOf(".kt"), val cai = CompilerActionInfo(project.directory, allDependencies(project), sourceFiles, listOf(".kt"),
buildDirectory, flags, emptyList(), forceRecompile = true, compilerSeparateProcess = true) buildDirectory, flags, emptyList(), forceRecompile = true, compilerSeparateProcess = true)
@ -158,25 +158,24 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
fun taskRunKapt(project: Project) : TaskResult { fun taskRunKapt(project: Project) : TaskResult {
var success = true var success = true
val flags = arrayListOf<String>() val flags = arrayListOf<String>()
val kaptConfig = kaptConfigs[project.name]
kaptConfig?.let { config -> kaptConfig?.let { config ->
val generated = kaptGenerated(project, config.outputDir)
val generatedSources = kaptSourcesDir(project, config.outputDir).replace("//", "/")
val generated = generated(project, context, config.outputDir)
val generatedSources = generatedSources(project, context, config.outputDir).replace("//", "/")
File(generatedSources).mkdirs() File(generatedSources).mkdirs()
// //
// Tell the Kotlin compiler to use the annotation plug-in // Tell the Kotlin compiler to use the annotation plug-in
// //
val allDeps = allDependencies(project)
flags.add("-Xplugin") flags.add("-Xplugin")
flags.add(annotationProcessorDependency().jarFile.get().absolutePath) flags.add(annotationProcessorDependency().jarFile.get().absolutePath)
// Also need tools.jar on the plug-in classpath // Also need tools.jar on the plug-in classpath
val toolsJar = jvm.toolsJar jvm.toolsJar?.let { toolsJar ->
if (toolsJar != null) {
flags.add("-Xplugin") flags.add("-Xplugin")
flags.add(toolsJar.absolutePath) flags.add(toolsJar.absolutePath)
} else {
warn("Couldn't find tools.jar from the JDK")
} }
aptJarDependencies(project).forEach { aptJarDependencies(project).forEach {
@ -192,8 +191,8 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
val kaptPluginFlags = arrayListOf<String>() val kaptPluginFlags = arrayListOf<String>()
val verbose = KobaltLogger.LOG_LEVEL >= 2 val verbose = KobaltLogger.LOG_LEVEL >= 2
listOf("sources=" + generatedSources, listOf("sources=" + generatedSources,
"classes=" + kaptClassesDir(project, config.outputDir), "classes=" + generatedClasses(project, context, config.outputDir),
"stubs=" + kaptStubsDir(project, config.outputDir), "stubs=" + generatedStubs(project, context, config.outputDir),
"verbose=$verbose", "verbose=$verbose",
"aptOnly=true").forEach { "aptOnly=true").forEach {
kaptPluginFlags.add(kaptPluginFlag(it)) kaptPluginFlags.add(kaptPluginFlag(it))
@ -202,7 +201,6 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
// //
// Dependencies for the annotation plug-in and the generation // Dependencies for the annotation plug-in and the generation
// //
val allDeps = allDependencies(project)
val dependencies = dependencyManager.calculateDependencies(project, context, val dependencies = dependencyManager.calculateDependencies(project, context,
Filters.EXCLUDE_OPTIONAL_FILTER, Filters.EXCLUDE_OPTIONAL_FILTER,
listOf(Scope.COMPILE), listOf(Scope.COMPILE),
@ -224,7 +222,6 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
val cai = CompilerActionInfo(project.directory, allDeps, sourceFiles, listOf(".kt"), val cai = CompilerActionInfo(project.directory, allDeps, sourceFiles, listOf(".kt"),
buildDirectory, flags, emptyList(), forceRecompile = true, compilerSeparateProcess = true) buildDirectory, flags, emptyList(), forceRecompile = true, compilerSeparateProcess = true)
context.logger.log(project.name, 2, "kapt3 flags:")
context.logger.log(project.name, 2, " " + kaptPluginFlags.joinToString("\n ")) context.logger.log(project.name, 2, " " + kaptPluginFlags.joinToString("\n "))
val cr = compilerUtils.invokeCompiler(project, context, kotlinPlugin.compiler, cai) val cr = compilerUtils.invokeCompiler(project, context, kotlinPlugin.compiler, cai)
success = cr.failedResult == null success = cr.failedResult == null
@ -244,10 +241,7 @@ class AptPlugin @Inject constructor(val dependencyManager: DependencyManager, va
fun addFlags(outputDir: String) { fun addFlags(outputDir: String) {
aptDependencies[project.name]?.let { aptDependencies[project.name]?.let {
result.add("-s") result.add("-s")
aptGeneratedDir(project, outputDir).let { generatedSource -> result.add(generatedSources(project, context, outputDir))
generatedSource.mkdirs()
result.add(generatedSource.path)
}
} }
} }

View file

@ -83,7 +83,7 @@ class JavaCompiler @Inject constructor(val jvmCompiler: JvmCompiler, val kobaltL
val pb = ProcessBuilder(executable.absolutePath, "@" + KFiles.fixSlashes(atFile)) val pb = ProcessBuilder(executable.absolutePath, "@" + KFiles.fixSlashes(atFile))
pb.inheritIO() pb.inheritIO()
logk(1, " Java compiling " + Strings.pluralizeAll(info.sourceFiles.size, "file")) logk(1, " Java compiling " + Strings.pluralizeAll(info.sourceFiles.size, "file"))
logk(2, " Java compiling using file: " + KFiles.fixSlashes(atFile)) logk(2, " Java compiling file: " + KFiles.fixSlashes(atFile))
command = allArgs.joinToString(" ") + " " + info.sourceFiles.joinToString(" ") command = allArgs.joinToString(" ") + " " + info.sourceFiles.joinToString(" ")
val process = pb.start() val process = pb.start()

View file

@ -44,18 +44,9 @@ class JavaPlugin @Inject constructor(val javaCompiler: JavaCompiler, override va
// IDocFlagContributor // IDocFlagContributor
override fun docFlagsFor(project: Project, context: KobaltContext, currentFlags: List<String>, override fun docFlagsFor(project: Project, context: KobaltContext, currentFlags: List<String>,
suffixesBeingCompiled: List<String>): List<String> { suffixesBeingCompiled: List<String>): List<String> {
val config = javadocConfigurations[project.name] return listOf("-d", "javadoc", "-Xdoclint:none", "-Xmaxerrs", "1", "-quiet")
return if (config == null || config.args.isEmpty()) DEFAULT_JAVADOC_ARGS
else config.args
} }
val DEFAULT_JAVADOC_ARGS = listOf("-d", "javadoc", "-Xdoclint:none", "-Xmaxerrs", "1", "-quiet")
val javadocConfigurations = hashMapOf<String, JavadocConfig>()
fun addJavadocConfiguration(project: Project, configuration: JavadocConfig)
= javadocConfigurations.put(project.name, configuration)
// ICompilerContributor // ICompilerContributor
val compiler = CompilerDescription(PLUGIN_NAME, "java", SOURCE_SUFFIXES, javaCompiler) val compiler = CompilerDescription(PLUGIN_NAME, "java", SOURCE_SUFFIXES, javaCompiler)
@ -86,12 +77,4 @@ fun Project.javaCompiler(init: JavaConfig.() -> Unit) =
JavaConfig(this).also { config -> JavaConfig(this).also { config ->
config.init() config.init()
(Kobalt.findPlugin(JavaPlugin.PLUGIN_NAME) as JavaPlugin).addConfiguration(this, config) (Kobalt.findPlugin(JavaPlugin.PLUGIN_NAME) as JavaPlugin).addConfiguration(this, config)
} }
@Directive
fun Project.javadoc(init: JavadocConfig.() -> Unit) =
JavadocConfig(this).also { config ->
config.init()
(Kobalt.findPlugin(JavaPlugin.PLUGIN_NAME) as JavaPlugin).addJavadocConfiguration(this, config)
}

View file

@ -1,603 +0,0 @@
package com.beust.kobalt.plugin.java
import com.beust.kobalt.api.Project
import com.google.inject.Singleton
import java.io.BufferedReader
import java.io.File
import java.io.InputStream
import java.io.InputStreamReader
import java.util.concurrent.TimeUnit
@Singleton
class JavadocConfig(val project: Project) {
val args = arrayListOf("-Xdoclint:none", "-Xmaxerrs", "1", "-quiet")
private fun removeArg(match: String, startsWith: Boolean = false, pair: Boolean = false) {
val it = args.iterator()
while (it.hasNext()) {
val next = it.next()
var removed = false
if (startsWith) {
if (next.startsWith(match)) {
it.remove()
removed = true
}
} else if (next == match) {
it.remove()
removed = true
}
// If it's a pair, delete the next arg too.
if (pair && removed && it.hasNext()) {
it.next()
it.remove()
}
}
}
private fun addInt(option: String, value: Int): Int {
args.add("-$option")
args.add(value.toString())
return value
}
private fun addBoolean(option: String, value: Boolean): Boolean {
args.remove("-$option")
if (value) {
args.add("-$option")
}
return value
}
private fun addString(option: String, value: String): String {
if (value.isNotEmpty()) {
args.add("-$option")
args.add("\"$value\"")
}
return value
}
private fun addStrings(option: String, vararg value: String) {
value.forEach {
addString(option, it)
}
}
private fun addPair(option: String, first: String, second: String) {
if (first.isNotEmpty() && second.isNotEmpty()) {
args.add("-$option")
args.add("\"$first\"")
args.add("\"$second\"")
}
}
private fun addFile(option: String, value: String): String {
val f = File(value)
if (f.exists()) {
args.add("-$option")
args.add("\"${f.absolutePath}\"")
}
return value
}
/**
* Set arguments manually.
*/
fun args(vararg options: String) = args.addAll(options)
//
// Jvm Options
//
/**
* @see <a href="https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javac.html">-Xdoclint</a>
*/
var docLint: String = "none"
set(value) {
removeArg("-Xdoclint:", startsWith = true)
addString("Xdoclint:", value)
}
/**
* @see <a href="https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javac.html">-Xmaxerrs</a>
*/
var maxErrs: Int = 1
set(value) {
removeArg("-Xmaxerrs", startsWith = true, pair = true)
addInt("Xmaxerrs", value)
}
/**
* @see <a href="https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javac.html">-Xmaxwarns</a>
*/
var maxWarns: Int = 1
set(value) {
removeArg("-Xmaxwarns", startsWith = true, pair = true)
addInt("Xmaxwarns", value)
}
//
// Javadoc Options
//
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#BEJICGGH">-overview</a>
*/
var overview: String = ""
set(value) {
addFile("overview", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDCHFEB">-public</a>
*/
var public: Boolean = false
set(value) {
addBoolean("public", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDCIFFD">-protected</a>
*/
var protected: Boolean = false
set(value) {
addBoolean("protected", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDEDJJJ">-pakage</a>
*/
var pkg: Boolean = false
set(value) {
addBoolean("package", pkg)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJDFJG">-private</a>
*/
var private: Boolean = false
set(value) {
addBoolean("private", private)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDCGDCA">-doclet</a>
*/
var doclet: String = ""
set(value) {
addString("doclet", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBGIED">-docletpath</a>
*/
var docletPath: String = ""
set(value) {
addString("docletpath", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBGDFI">-source</a>
*/
var source: String = ""
set(value) {
addString("source", source)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDEHCDG">-sourcepath</a>
*/
var sourcePath: String = ""
set(value) {
addString("sourcepath", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGAHAJ">-classpath</a>
*/
var classPath: String = ""
set(value) {
addString("classpath", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJEDJI">-subpackages</a>
*/
var subPackages: String = ""
set(value) {
addString("subpackages", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFBDCF">-exclude</a>
*/
var exclude: String = ""
set(value) {
addString("exclude", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDHDACA">-bootClassPath</a>
*/
var bootClassPath: String = ""
set(value) {
addString("bootclasspath", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDCJGIC">-extdirs</a>
*/
var extDirs: String = ""
set(value) {
addString("extdirs", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGHFJJ">-verbose</a>
*/
var verbose: Boolean = false
set(value) {
addBoolean("verbose", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGFHAA">-quiet</a>
*/
var quiet: Boolean = true
set(value) {
addBoolean("quiet", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDHHIDI">-breakiterator</a>
*/
var breakIterator: Boolean = false
set(value) {
addBoolean("breakiterator", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDEBGCE">-locale</a>
*/
var locale: String = ""
set(value) {
addString("locale", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDEIGDC">-encoding</a>
*/
var encoding: String = ""
set(value) {
addString("encoding", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGDEEE">-Jflag</a>
*/
var jFlag: String = ""
set(value) {
addString("J-", value)
}
//
// Standard Doclet
//
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGCJEG">-use</a>
*/
var use: Boolean = false
set(value) {
addBoolean("use", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGCEFG">-version</a>
*/
var version: Boolean = false
set(value) {
addBoolean("version", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDCBHDB">-author</a>
*/
var author: Boolean = false
set(value) {
addBoolean("author", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFGBHB">-splitindex</a>
*/
var splitIndex: Boolean = false
set(value) {
addBoolean("splitindex", value)
}
/**
* Set both the [windowTitle] and [docTitle]
*/
var title: String = ""
set(value) {
windowTitle = value
docTitle = value
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBIEEI">-windowtitle</a>
*/
var windowTitle: String = ""
set(value) {
addString("windowtitle", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJGBIE">-doctitle</a>
*/
var docTitle: String = ""
set(value) {
addString("doctitle", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDDAEGD">-header</a>
*/
var header: String = ""
set(value) {
addString("header", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFACCA">-footer</a>
*/
var footer: String = ""
set(value) {
addString("footer", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDHHGBF">-top</a>
*/
var top: String = ""
set(value) {
addString("top", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDECAJE">-bottom</a>
*/
var bottom: String = ""
set(value) {
addString("bottom", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFBBID">-linksource</a>
*/
var linkSource: Boolean = false
set(value) {
addBoolean("linksource", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDCDFGD">-nodeprecated</a>
*/
var noDeprecated: Boolean = false
set(value) {
addBoolean("nodeprecated", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGFHJJ">-nodeprecatedlist</a>
*/
var noDeprecatedList: Boolean = false
set(value) {
addBoolean("nodeprecatedlist", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFICFB">-nosince</a>
*/
var noSince: Boolean = false
set(value) {
addBoolean("nosince", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBGJBI">-notree</a>
*/
var noTree: Boolean = false
set(value) {
addBoolean("notree", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDHHHEI">-noindex</a>
*/
var noIndex: Boolean = false
set(value) {
addBoolean("noindex", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDHHDBI">-nohelp</a>
*/
var noHelp: Boolean = false
set(value) {
addBoolean("nohelp", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDEDCCG">-nonavbar</a>
*/
var noNavBar: Boolean = false
set(value) {
addBoolean("nonavbar", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJICID">-helpfile</a>
*/
var helpFile: String = ""
set(value) {
addFile("helpfile", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#BEJFCAIH">-stylesheet</a>
*/
var stylesheet: String = ""
set(value) {
addFile("stylesheet", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFJAFC">-serialwarn</a>
*/
var serialWarn: Boolean = false
set(value) {
addBoolean("serialwarn", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDHDEAD">-charset</a>
*/
var charSet: String = ""
set(value) {
addString("charset", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGIHCH">-docencoding</a>
*/
var docEncoding: String = ""
set(value) {
addString("docencoding", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDBHIGE">-keywords</a>
*/
var keywords: Boolean = false
set(value) {
addBoolean("keywords", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJFHDG">-tagletpath</a>
*/
var tagletPath: String = ""
set(value) {
addString("tagletpath", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDCBDHI">-docfilessubdirs</a>
*/
var docFilesSubDirs: Boolean = false
set(value) {
addBoolean("docfilessubdirs", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGHIAE">-excludedocfilessubdir</a>
*/
var excludeDocFilesSubDir: String = ""
set(value) {
addString("excludedocfilessubdir", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFJFBE">-noqualifiers</a>
*/
var noQualifiers: String = ""
set(value) {
addString("noqualifier", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDGBABE">-notimestamp</a>
*/
var noTimestamp: Boolean = false
set(value) {
addBoolean("notimestamp", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFCGJD">-nocomment</a>
*/
var noComment: Boolean = false
set(value) {
addBoolean("nocomment", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDIAGAG">-sourcetab</a>
*/
var sourceTab: String = ""
set(value) {
addString("sourcetab", value)
}
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDIGGII">-group</a>
*/
fun group(groupHeading: String, packagePattern: String) = addPair("group", groupHeading, packagePattern)
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDFIIJH">-linkoffline</a>
*/
fun linkOffline(extdocURL: String, packagelistLoc: String) = addPair("linkoffline", extdocURL, packagelistLoc)
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDEDJFI">-link</a>
*/
fun links(vararg links: String) = addStrings("link", *links)
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#tag">-tag</a>
*/
fun tags(vararg tags: String) = addStrings("tag", *tags)
/**
* @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDHEFHH">-taglets</a>
*/
fun taglets(vararg taglets: String) = addStrings("taglet", *taglets)
}
fun main(args: Array<String>) {
fun fromStream(ins: InputStream): List<String> {
val result = arrayListOf<String>()
val br = BufferedReader(InputStreamReader(ins))
var line = br.readLine()
while (line != null) {
result.add(line)
println(line)
line = br.readLine()
}
return result
}
val config = JavadocConfig(Project())
config.title = "This is a test."
config.verbose = true
config.quiet = false
config.links("http://docs.oracle.com/javase/8/docs/api/")
config.args.add(0, ".\\kobaltBuild\\docs\\javadoc")
config.args.add(0, "-d")
config.args.add(0, "javadoc")
config.args.add(".\\modules\\wrapper\\src\\main\\java\\com\\beust\\kobalt\\wrapper\\Config.java")
config.args.add(".\\modules\\wrapper\\src\\main\\java\\com\\beust\\kobalt\\wrapper\\Main.java")
println(config.args.joinToString(" "))
val pb = ProcessBuilder().command(config.args.toList())
pb.directory(File("."))
val proc = pb.start()
val err = proc.waitFor(30, TimeUnit.SECONDS)
val stdout = if (proc.inputStream.available() > 0) fromStream(proc.inputStream) else emptyList()
val stderr = if (proc.errorStream.available() > 0) fromStream(proc.errorStream) else emptyList()
}

View file

@ -8,12 +8,10 @@ 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
@ -74,18 +72,29 @@ 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)
return if (settings.kobaltCompilerSeparateProcess || actualVersion != Constants.KOTLIN_COMPILER_VERSION if (settings.kobaltCompilerSeparateProcess || actualVersion != Constants.KOTLIN_COMPILER_VERSION
|| info.compilerSeparateProcess) { || info.compilerSeparateProcess) {
invokeCompilerInSeparateProcess(classpath, info, actualVersion, project) return invokeCompilerInSeparateProcess(classpath, info, actualVersion, project)
} else { } else {
invokeCompilerDirectly(project, projectName ?: "kobalt-" + Random().nextInt(), outputDir, return invokeCompilerDirectly(project, projectName ?: "kobalt-" + Random().nextInt(), outputDir,
info, classpath, filesToCompile) info, classpath, filesToCompile)
} }
} }
@ -102,22 +111,13 @@ class KotlinCompiler @Inject constructor(
.filterNotNull() .filterNotNull()
.joinToString(" ") .joinToString(" ")
val infoDir = info.directory val xFlagsArray = xFlagsString.split(" ").toTypedArray() ?: emptyArray()
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", outputDir, "-d", info.outputDir.absolutePath,
*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()) (settings.kobaltCompilerFlags?.split(" ") ?: listOf<String>())
val args = K2JVMCompilerArguments() val args = K2JVMCompilerArguments()
val compiler = K2JVMCompiler() val compiler = K2JVMCompiler()
parseCommandLineArguments(args2, args) compiler.parseArguments(args2.toTypedArray(), 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.toMutableList() freeArgs = sourceFiles
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.coroutinesState = LanguageFeature.State.ENABLED.name "coroutines=enable" -> args.coroutinesEnable = true
"coroutines=warn" -> args.coroutinesState = LanguageFeature.State.ENABLED_WITH_WARNING.name "coroutines=warn" -> args.coroutinesWarn = true
"coroutines=error" -> args.coroutinesState = LanguageFeature.State.ENABLED_WITH_ERROR.name "coroutines=error" -> args.coroutinesError = true
"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?.lineContent != null) { if (location != null && location.lineContent != null) {
with(location) { with(location) {
"$lineContent\n$path:$line:$column $s" "$lineContent\n$path:$line:$column $s"
} }
@ -233,13 +233,11 @@ class KotlinCompiler @Inject constructor(
s s
} }
override fun report(severity: CompilerMessageSeverity, message: String, override fun report(severity: CompilerMessageSeverity,
location: CompilerMessageLocation?) { message: String, 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 ->
error(fullMessage) throw KobaltException(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))
@ -253,22 +251,24 @@ 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")
return if (cliArgs.noIncrementalKotlin || Kobalt.context?.internalContext?.noIncrementalKotlin ?: false) { val result =
log(2, " Kotlin incremental compilation is disabled") if (cliArgs.noIncrementalKotlin || Kobalt.context?.internalContext?.noIncrementalKotlin ?: false) {
val duration = benchmarkMillis { log(2, " Kotlin incremental compilation is disabled")
compiler.exec(collector, Services.Builder().build(), args) val duration = benchmarkMillis {
} compiler.exec(collector, Services.Builder().build(), args)
log(1, " Regular compilation time: ${duration.first} ms") }
TaskResult(duration.second == ExitCode.OK) log(1, " Regular compilation time: ${duration.first} ms")
} else { TaskResult(duration.second == ExitCode.OK)
log(1, " Kotlin incremental compilation is enabled") } else {
//val start = System.currentTimeMillis() log(1, " Kotlin incremental compilation is enabled")
val duration = benchmarkMillis { val start = System.currentTimeMillis()
compileIncrementally(filesToCompile, sourceFiles, outputDir, info, args, collector) val duration = benchmarkMillis {
} compileIncrementally(filesToCompile, sourceFiles, outputDir, info, args, collector)
log(1, " Incremental compilation time: ${duration.first} ms") }
TaskResult() log(1, " Incremental compilation time: ${duration.first} ms")
} TaskResult()
}
return result
} }
private fun compileIncrementally(filesToCompile: Int, sourceFiles: List<String>, outputDir: String?, private fun compileIncrementally(filesToCompile: Int, sourceFiles: List<String>, outputDir: String?,
@ -382,7 +382,8 @@ 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> {
return dependencyManager.transitiveClosure(listOf(compilerDep(version)), requiredBy = project?.name ?: "") val deps = dependencyManager.transitiveClosure(listOf(compilerDep(version)), requiredBy = project?.name ?: "")
return deps
} }
/** /**
@ -415,7 +416,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() emptyList<String>()
} }
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,10 +99,9 @@ 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 || if (project == null || accept(project)) {
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) listOf(kotlinJarFiles.stdlib, kotlinJarFiles.runtime)
.map { FileDependency(it.absolutePath) } .map { FileDependency(it.absolutePath) }
} else { } else {
emptyList() emptyList()

View file

@ -1,118 +0,0 @@
package com.beust.kobalt.plugin.osgi
import aQute.bnd.osgi.Analyzer
import com.beust.kobalt.TaskResult
import com.beust.kobalt.api.*
import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.archive.Archives
import com.beust.kobalt.archive.MetaArchive
import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.plugin.packaging.PackagingPlugin
import com.google.common.reflect.ClassPath
import com.google.inject.Inject
import com.google.inject.Singleton
import java.io.ByteArrayOutputStream
import java.io.File
import java.net.URLClassLoader
import java.nio.file.*
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.jar.JarFile
/**
* Generate OSGi attributes in the MANIFEST.MF if an osgi{} directive was found in the project.
*/
@Singleton
class OsgiPlugin @Inject constructor(val configActor: ConfigActor<OsgiConfig>, val taskContributor: TaskContributor,
val dependencyManager: DependencyManager)
: BasePlugin(), ITaskContributor by taskContributor, IConfigActor<OsgiConfig> by configActor {
companion object {
const val PLUGIN_NAME = "Osgi"
}
override val name: String = PLUGIN_NAME
override fun apply(project: Project, context: KobaltContext) {
super.apply(project, context)
configurationFor(project)?.let { config ->
taskContributor.addTask(this, project, "generateOsgiManifest",
description = "Generate the OSGi information in the manifest",
group = "build",
alwaysRunAfter = listOf(PackagingPlugin.TASK_ASSEMBLE),
runTask = { generateManifest(project, context) })
}
}
private fun generateManifest(project: Project, context: KobaltContext): TaskResult {
val jarName = project.projectProperties.get(Archives.JAR_NAME) as String
val jarFile = File(KFiles.libsDir(project), jarName)
val cp = ClassPath.from(URLClassLoader(arrayOf(jarFile.toURI().toURL()), null))
val packages = cp.allClasses.map { it.packageName }.distinct()
val exportPackageLine = packages.map {
it + ";version=\"" + project.version + "\""
}.joinToString(",")
val toFile = Files.createTempFile(null, ".jar")
val analyzer = Analyzer().apply {
jar = aQute.bnd.osgi.Jar(jarName)
val dependencies = project.compileDependencies + project.compileRuntimeDependencies
dependencyManager.calculateDependencies(project, context, passedDependencies = dependencies).forEach {
addClasspath(it.jarFile.get())
}
setProperty("Build-Date", LocalDate.now().format(DateTimeFormatter.ofPattern("y-MM-dd")))
setProperty(Analyzer.BUNDLE_VERSION, project.version)
setProperty(Analyzer.BUNDLE_NAME, project.group + "." + project.artifactId)
setProperty(Analyzer.BUNDLE_DESCRIPTION, project.description)
setProperty(Analyzer.IMPORT_PACKAGE, "*")
setProperty(Analyzer.EXPORT_PACKAGE, exportPackageLine)
project.pom?.let { pom ->
if (pom.licenses.any()) {
setProperty(Analyzer.BUNDLE_LICENSE, pom.licenses[0].url)
}
}
}
analyzer.calcManifest().let { manifest ->
val lines2 = ByteArrayOutputStream().use { baos ->
manifest.write(baos)
String(baos.toByteArray())
}
context.logger.log(project.name, 2, " Generated manifest:\n$lines2")
//
// Update or create META-INF/MANIFEST.MF
//
KFiles.copy(Paths.get(jarFile.toURI()), Paths.get(toFile.toUri()))
val fileSystem = FileSystems.newFileSystem(toFile, null)
fileSystem.use { fs ->
JarFile(jarFile).use { jf ->
val mf = jf.getEntry(MetaArchive.MANIFEST_MF)
if (mf == null) {
Files.createDirectories(fs.getPath("META-INF/"))
}
val jarManifest = fs.getPath(MetaArchive.MANIFEST_MF)
Files.write(jarManifest, listOf(lines2),
if (mf != null) StandardOpenOption.APPEND else StandardOpenOption.CREATE)
}
}
Files.copy(Paths.get(toFile.toUri()), Paths.get(jarFile.toURI()), StandardCopyOption.REPLACE_EXISTING)
return TaskResult()
}
}
}
class OsgiConfig
@Directive
fun Project.osgi(init: OsgiConfig.() -> Unit) {
OsgiConfig().let {
it.init()
(Kobalt.findPlugin(OsgiPlugin.PLUGIN_NAME) as OsgiPlugin).addConfiguration(this, it)
}
}

View file

@ -26,9 +26,9 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana
val executors: KobaltExecutors, val jarGenerator: JarGenerator, val warGenerator: WarGenerator, val executors: KobaltExecutors, val jarGenerator: JarGenerator, val warGenerator: WarGenerator,
val zipGenerator: ZipGenerator, val taskContributor: TaskContributor, val zipGenerator: ZipGenerator, val taskContributor: TaskContributor,
val kobaltLog: ParallelLogger, val kobaltLog: ParallelLogger,
val pomFactory: PomGenerator.IFactory, val configActor: ConfigsActor<InstallConfig>) val pomFactory: PomGenerator.IFactory, val configActor: ConfigActor<InstallConfig>)
: BasePlugin(), ITaskContributor by taskContributor, IIncrementalAssemblyContributor, : BasePlugin(), ITaskContributor, IIncrementalAssemblyContributor,
IConfigsActor<InstallConfig> by configActor { IConfigActor<InstallConfig> by configActor {
companion object { companion object {
const val PLUGIN_NAME = "Packaging" const val PLUGIN_NAME = "Packaging"
@ -41,6 +41,7 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana
const val PACKAGES = "packages" const val PACKAGES = "packages"
const val TASK_ASSEMBLE: String = "assemble" const val TASK_ASSEMBLE: String = "assemble"
const val TASK_INSTALL: String = "install"
} }
override val name = PLUGIN_NAME override val name = PLUGIN_NAME
@ -55,20 +56,9 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana
taskContributor.addVariantTasks(this, project, context, "assemble", group = "build", taskContributor.addVariantTasks(this, project, context, "assemble", group = "build",
dependsOn = listOf("compile"), dependsOn = listOf("compile"),
runTask = { doTaskAssemble(project) }) runTask = { doTaskAssemble(project) })
taskContributor.addVariantTasks(this, project, context, "install",
configurationFor(project)?.let { configs -> dependsOn = listOf("assemble"),
configs.forEach { config -> runTask = { taskInstall(project) })
taskContributor.addTask(this, project, config.taskName,
description = "Install to \"" + config.target + "\"",
group = "build",
dependsOn = listOf(PackagingPlugin.TASK_ASSEMBLE),
runTask = { taskInstall(project, context, config) })
taskContributor.addVariantTasks(this, project, context, config.taskName,
dependsOn = listOf("assemble"),
runTask = { taskInstall(project, context, config) })
}
}
} }
override fun assemble(project: Project, context: KobaltContext) : IncrementalTaskInfo { override fun assemble(project: Project, context: KobaltContext) : IncrementalTaskInfo {
@ -105,7 +95,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[outputFile.name] = files zipToFiles[it.name] = files
} }
} }
} }
@ -148,7 +138,9 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana
Pair(packageConfig.zips, zipGenerator) Pair(packageConfig.zips, zipGenerator)
) )
pairs.forEach { (zips, generator) -> pairs.forEach { pair ->
val zips = pair.first
val generator = pair.second
zips.forEach { zips.forEach {
generator.generateArchive(packageConfig.project, context, it, generator.generateArchive(packageConfig.project, context, it,
findFiles(generator, it)) findFiles(generator, it))
@ -194,7 +186,31 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana
packages.add(p) packages.add(p)
} }
private fun taskInstall(project: Project, context: KobaltContext, config: InstallConfig) : TaskResult { // @Task(name = "generateOsgiManifest", alwaysRunAfter = arrayOf(TASK_ASSEMBLE))
// fun generateManifest(project: Project): TaskResult {
// val analyzer = Analyzer().apply {
// jar = aQute.bnd.osgi.Jar(project.projectProperties.get(Archives.JAR_NAME) as String)
// val dependencies = project.compileDependencies + project.compileRuntimeDependencies
// dependencyManager.calculateDependencies(project, context, passedDependencies = dependencies).forEach {
// addClasspath(it.jarFile.get())
// }
// setProperty(Analyzer.BUNDLE_VERSION, project.version)
// setProperty(Analyzer.BUNDLE_NAME, project.group)
// setProperty(Analyzer.BUNDLE_DESCRIPTION, project.description)
// setProperty(Analyzer.IMPORT_PACKAGE, "*")
// setProperty(Analyzer.EXPORT_PACKAGE, "*;-noimport:=false;version=" + project.version)
// }
//
// val manifest = analyzer.calcManifest()
// manifest.write(System.out)
// return TaskResult()
// }
@Task(name = PackagingPlugin.TASK_INSTALL, description = "Install the artifacts",
dependsOn = arrayOf(PackagingPlugin.TASK_ASSEMBLE))
fun taskInstall(project: Project) : TaskResult {
val config = configurationFor(project) ?: InstallConfig()
val buildDir = project.projectProperties.getString(LIBS_DIR) val buildDir = project.projectProperties.getString(LIBS_DIR)
val buildDirFile = File(buildDir) val buildDirFile = File(buildDir)
if (buildDirFile.exists()) { if (buildDirFile.exists()) {
@ -225,6 +241,9 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana
return TaskResult() return TaskResult()
} }
//ITaskContributor
override fun tasksFor(project: Project, context: KobaltContext): List<DynamicTask> = taskContributor.dynamicTasks
} }
@Directive @Directive
@ -235,7 +254,7 @@ fun Project.install(init: InstallConfig.() -> Unit) {
} }
} }
class InstallConfig(var target : String = "libs", var taskName : String = "install") : IncludeFromTo() class InstallConfig(var target : String = "libs") : IncludeFromTo()
@Directive @Directive
fun Project.assemble(init: PackageConfig.(p: Project) -> Unit): PackageConfig = let { fun Project.assemble(init: PackageConfig.(p: Project) -> Unit): PackageConfig = let {

View file

@ -15,7 +15,6 @@ import com.google.gson.Gson
import com.google.gson.JsonArray import com.google.gson.JsonArray
import com.google.gson.JsonObject import com.google.gson.JsonObject
import com.google.gson.TypeAdapter import com.google.gson.TypeAdapter
import com.google.gson.annotations.SerializedName
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.google.inject.assistedinject.Assisted import com.google.inject.assistedinject.Assisted
import okhttp3.* import okhttp3.*
@ -63,7 +62,7 @@ class BintrayApi @Inject constructor(val http: Http,
@Path("publish") publish: Int, @Path("publish") publish: Int,
@Body file: File): Call<BintrayResponse> @Body file: File): Call<BintrayResponse>
class UpdateVersion(val desc: String?, @SerializedName("vcs_tag") val vcsTag: String?) class UpdateVersion(val desc: String?, val vcsTag: String?)
@PATCH("/packages/{owner}/maven/{repo}/versions/{version}") @PATCH("/packages/{owner}/maven/{repo}/versions/{version}")
fun updateVersion(@Path("owner") owner: String, fun updateVersion(@Path("owner") owner: String,
@ -80,12 +79,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()
@ -97,29 +96,25 @@ class BintrayApi @Inject constructor(val http: Http,
.create(Api::class.java) .create(Api::class.java)
} }
fun validatePackage(project: Project, config: BintrayConfig) { fun validatePackage(project: Project) {
val pkgName = config.name ?: project.name val execute = service.getPackage(org ?: username!!, project.name).execute()
val execute = service.getPackage(org ?: username!!, pkgName).execute()
if (execute.errorBody()?.string()?.contains("'$pkgName' was not found") == true) { if (execute.errorBody()?.string()?.contains("'${project.name}' was not found") ?: false) {
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))
.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())
} }
} }
} }
private fun buildPackageInfo(project: Project, config: BintrayConfig): JsonObject { private fun buildPackageInfo(project: Project): JsonObject {
val jsonObject = JsonObject().apply { val jsonObject = JsonObject()
addNonNull("name", config.name ?: project.name) jsonObject.addNonNull("name", project.name)
addNonNull("desc", jsonObject.addNonNull("desc", project.description)
if (project.description.isNotBlank()) project.description else project.pom?.description) jsonObject.addNonNull("vcs_url", project.pom?.scm?.url)
addNonNull("vcs_url", project.pom?.scm?.url) jsonObject.addNonNull("website_url", project.url)
addNonNull("website_url", project.url ?: project.pom?.url)
addNonNull("issue_tracker_url", config.issueTrackerUrl)
}
val licenses = JsonArray() val licenses = JsonArray()
project.pom?.licenses?.forEach { project.pom?.licenses?.forEach {
licenses.add(it.name) licenses.add(it.name)
@ -129,7 +124,7 @@ class BintrayApi @Inject constructor(val http: Http,
} }
fun uploadMaven(project: Project, files: List<File>, config: BintrayConfig): TaskResult { fun uploadMaven(project: Project, files: List<File>, config: BintrayConfig): TaskResult {
validatePackage(project, config) validatePackage(project)
return upload(project, files, config, generateMd5 = true) return upload(project, files, config, generateMd5 = true)
} }
@ -163,13 +158,13 @@ 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.joinToString("") { if (it) "." else "X" } + spaces + return "|" + list.map { if (it) "." else "X" }.joinToString("") + spaces +
(if (file != null) "| [ $file ]" else "|") (if (file != null) "| [ $file ]" else "|")
} }
val results = arrayListOf<Boolean>() val results = arrayListOf<Boolean>()
val owner = org ?: username!! val owner = org ?: username!!
val repo = config.name ?: project.name val repo = project.name
val group = project.group!!.replace('.', '/') val group = project.group!!.replace('.', '/')
val artifact = project.artifactId!! val artifact = project.artifactId!!
val version = project.version!! val version = project.version!!
@ -208,7 +203,7 @@ class BintrayApi @Inject constructor(val http: Http,
return TaskResult() return TaskResult()
} else { } else {
error(" Errors while uploading:\n" + errorMessages.joinToString("\n") { " $it" }) error(" Errors while uploading:\n" + errorMessages.map { " $it" }.joinToString("\n"))
return TaskResult(false, errorMessage = errorMessages.joinToString("\n")) return TaskResult(false, errorMessage = errorMessages.joinToString("\n"))
} }
} else { } else {
@ -221,7 +216,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,16 +231,20 @@ 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>? {
return if (type.typeName == File::class.java.name) FileBodyConverter() val result =
else GsonBodyConverter() if (type.typeName == File::class.java.name) FileBodyConverter()
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())
value.use { try {
return adapter.read(jsonReader) return adapter.read(jsonReader)
} finally {
value.close()
} }
} }
} }

View file

@ -47,7 +47,7 @@ class PublishPlugin @Inject constructor(val files: KFiles, val factory: PomGener
private fun autoGitTag(project: Project, uploadResult: TaskResult, config: AutoGitTagConfig?) : TaskResult { private fun autoGitTag(project: Project, uploadResult: TaskResult, config: AutoGitTagConfig?) : TaskResult {
if (config != null) { if (config != null) {
with(config) { with(config) {
return git.maybeTagRelease(project, uploadResult, enabled, annotated, push, tag, message) return git.maybeTagRelease(project, uploadResult, enabled, annotated, tag, message)
} }
} else { } else {
return TaskResult() return TaskResult()
@ -117,7 +117,7 @@ class PublishPlugin @Inject constructor(val files: KFiles, val factory: PomGener
val docUrl = DocUrl.PUBLISH_PLUGIN_URL val docUrl = DocUrl.PUBLISH_PLUGIN_URL
val user = localProperties.get(PROPERTY_BINTRAY_USER, docUrl) val user = localProperties.get(PROPERTY_BINTRAY_USER, docUrl)
val password = localProperties.get(PROPERTY_BINTRAY_PASSWORD, docUrl) val password = localProperties.get(PROPERTY_BINTRAY_PASSWORD, docUrl)
val org = localProperties.getNoThrows(PROPERTY_BINTRAY_ORG) val org = localProperties.getNoThrows(PROPERTY_BINTRAY_ORG, docUrl)
val jcenter = bintrayFactory.create(user, password, org) val jcenter = bintrayFactory.create(user, password, org)
var success = false var success = false
@ -222,9 +222,6 @@ data class AutoGitTagConfig(val project: Project) {
@Directive @Directive
var annotated: Boolean = false var annotated: Boolean = false
@Directive
var push: Boolean = true
@Directive @Directive
var tag : String = project.version!! var tag : String = project.version!!
@ -271,18 +268,9 @@ data class BintrayConfig(val project: Project) {
files.add(Pair(filePath, url)) files.add(Pair(filePath, url))
} }
/**
* The package name on Bintray which is not always the project name.
*/
@Directive
var name: String? = null
@Directive @Directive
var description: String? = null var description: String? = null
@Directive
var issueTrackerUrl: String? = null
@Directive @Directive
var vcsTag: String? = null var vcsTag: String? = null
} }

View file

@ -15,7 +15,6 @@
<class-name>com.beust.kobalt.plugin.groovy.GroovyPlugin</class-name> <class-name>com.beust.kobalt.plugin.groovy.GroovyPlugin</class-name>
<class-name>com.beust.kobalt.internal.JvmCompilerPlugin</class-name> <class-name>com.beust.kobalt.internal.JvmCompilerPlugin</class-name>
<class-name>com.beust.kobalt.internal.BuildListeners</class-name> <class-name>com.beust.kobalt.internal.BuildListeners</class-name>
<class-name>com.beust.kobalt.plugin.osgi.OsgiPlugin</class-name>
<!-- These classes manage -init for Java and Kotlin --> <!-- These classes manage -init for Java and Kotlin -->
<class-name>com.beust.kobalt.app.Templates</class-name> <class-name>com.beust.kobalt.app.Templates</class-name>

View file

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

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-stdlib.jar!/" /> <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-runtime.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-stdlib-sources.jar!/" /> <root url="jar://$KOTLIN_BUNDLED$/lib/kotlin-runtime-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
</component> </component>

View file

@ -9,7 +9,6 @@ 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
@ -122,9 +121,6 @@ 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

@ -3,7 +3,6 @@ package com.beust.kobalt
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.kobaltLog import com.beust.kobalt.misc.kobaltLog
import com.beust.kobalt.misc.warn import com.beust.kobalt.misc.warn
import org.assertj.core.api.Assertions.assertThat
import org.testng.annotations.Test import org.testng.annotations.Test
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
@ -39,7 +38,6 @@ class VerifyKobaltZipTest : KobaltTest() {
val stream = JarInputStream(FileInputStream(zipFilePath)) val stream = JarInputStream(FileInputStream(zipFilePath))
var entry = stream.nextEntry var entry = stream.nextEntry
while (entry != null) { while (entry != null) {
assertThat(entry.name).doesNotContain("\\")
if (! entry.name.startsWith(root)) { if (! entry.name.startsWith(root)) {
throw AssertionError("Entries in the zip file should be under the directory $root") throw AssertionError("Entries in the zip file should be under the directory $root")
} }
@ -67,7 +65,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", "com/beust/kobalt/wrapper/Main.class")) assertExistence(ins, listOf("kobalt.properties"))
} }
entry = stream.nextEntry entry = stream.nextEntry
} }

View file

@ -1,58 +0,0 @@
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,6 +1,5 @@
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
@ -96,7 +95,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()), Args(), EventBus()) localRepo.localRepo, KobaltSettings(KobaltSettingsXml()), EventBus())
val artifact = DefaultArtifact(id) val artifact = DefaultArtifact(id)
val collectRequest = CollectRequest().apply { val collectRequest = CollectRequest().apply {