Compare commits

..

No commits in common. "master" and "0.5.0-beta" have entirely different histories.

33 changed files with 224 additions and 1290 deletions

View file

@ -1,31 +0,0 @@
version: 2
jobs:
build:
docker:
- image: circleci/openjdk:8-jdk
working_directory: ~/repo
environment:
JVM_OPTS: -Xmx3200m
TERM: dumb
steps:
- checkout
- restore_cache:
keys:
- kobalt-dependencies-{{ checksum "kobalt/src/Build.kt" }}
# fallback to using the latest cache if no exact match is found
- kobalt-dependencies-
- run:
name: Check Versions
command: ./kobaltw checkVersions
- save_cache:
paths: ~/.kobalt
key: kobalt-dependencies-{{ checksum "kobalt/src/Build.kt" }}
- run:
name: Assemble
command: ./kobaltw assemble

5
.gitattributes vendored
View file

@ -1,5 +0,0 @@
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# batch files are specific to windows and always crlf
*.bat eol=crlf

8
.gitignore vendored
View file

@ -4,9 +4,8 @@
**/.idea/tasks.xml
**/.idea/workspace.xml
*.iws
*.sublime-*
.classpath
.DS_Store
.classpath
.gradle
.kobalt
.nb-gradle
@ -16,10 +15,8 @@
/build
/deploy
/dist
/example/libs/
/gen
/gradle.properties
/lib
/libs
/local.properties
/out
@ -27,6 +24,7 @@
/project.properties
/target
/test-output
Thumbs.db
ehthumbs.db
kobaltBuild
Thumbs.db
/example/libs/

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value />
</option>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Erik's Code Style" />
</component>
</project>

23
.idea/compiler.xml generated Normal file
View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<option name="DEFAULT_COMPILER" value="Javac" />
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>

View file

@ -1,6 +1,6 @@
<component name="CopyrightManager">
<copyright>
<option name="myName" value="Erik's Copyright Notice" />
<option name="notice" value="&amp;#36;file.fileName&#10;&#10;Copyright (c) 2016-&amp;#36;today.year, Erik C. Thauvin (erik@thauvin.net)&#10;All rights reserved.&#10;&#10;Redistribution and use in source and binary forms, with or without&#10;modification, are permitted provided that the following conditions are met:&#10;&#10; Redistributions of source code must retain the above copyright notice, this&#10; list of conditions and the following disclaimer.&#10;&#10; Redistributions in binary form must reproduce the above copyright notice,&#10; this list of conditions and the following disclaimer in the documentation&#10; and/or other materials provided with the distribution.&#10;&#10; Neither the name of this project nor the names of its contributors may be&#10; used to endorse or promote products derived from this software without&#10; specific prior written permission.&#10;&#10;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;&#10;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&#10;IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&#10;DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE&#10;FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL&#10;DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR&#10;SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&#10;CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,&#10;OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&#10;OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." />
<option name="notice" value="&amp;#36;file.fileName&#10;&#10;Copyright (c) &amp;#36;today.year, Erik C. Thauvin (erik@thauvin.net)&#10;All rights reserved.&#10;&#10;Redistribution and use in source and binary forms, with or without&#10;modification, are permitted provided that the following conditions are met:&#10;&#10; Redistributions of source code must retain the above copyright notice, this&#10; list of conditions and the following disclaimer.&#10;&#10; Redistributions in binary form must reproduce the above copyright notice,&#10; this list of conditions and the following disclaimer in the documentation&#10; and/or other materials provided with the distribution.&#10;&#10; Neither the name of this project nor the names of its contributors may be&#10; used to endorse or promote products derived from this software without&#10; specific prior written permission.&#10;&#10;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;&#10;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&#10;IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&#10;DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE&#10;FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL&#10;DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR&#10;SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&#10;CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,&#10;OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&#10;OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." />
</copyright>
</component>

View file

@ -1,5 +1,5 @@
<component name="CopyrightManager">
<settings default="Erik's Copyright Notice">
<settings default="">
<module2copyright>
<element module="Source" copyright="Erik's Copyright Notice" />
</module2copyright>

View file

@ -0,0 +1,7 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>

10
.idea/kobalt.xml generated
View file

@ -4,15 +4,9 @@
<option name="linkedExternalProjectsSettings">
<KobaltProjectSettings>
<option name="autoDownloadKobalt" value="true" />
<option name="downloadSources" value="false" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="kobaltHome" value="$USER_HOME$/.kobalt/wrapper/dist/kobalt-1.0.82" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
<option name="profiles" value="" />
<option name="kobaltHome" value="$USER_HOME$/.kobalt/wrapper/dist/kobalt-0.847" />
<option name="useAutoImport" value="true" />
</KobaltProjectSettings>
</option>
</component>

42
.idea/misc.xml generated
View file

@ -38,29 +38,27 @@
<property name="caretWidth" class="java.lang.Integer" />
</properties>
</component>
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State>
<id />
</State>
<State>
<id>Java</id>
</State>
<State>
<id>Portability issuesJava</id>
</State>
</expanded-state>
<selected-state>
<State>
<id>Android</id>
</State>
</selected-state>
</profile-state>
</entry>
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8.x" project-jdk-type="JavaSDK">
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="mavenHome" value="Bundled (Maven 3)" />
</MavenGeneralSettings>
</option>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.8.x" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/kobaltBuild/classes" />
</component>
</project>

1
.idea/modules.xml generated
View file

@ -3,7 +3,6 @@
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/kobalt/Build.kt.iml" filepath="$PROJECT_DIR$/kobalt/Build.kt.iml" />
<module fileurl="file://$PROJECT_DIR$/kobalt-exec.iml" filepath="$PROJECT_DIR$/kobalt-exec.iml" />
</modules>
</component>
</project>

View file

@ -1,3 +0,0 @@
<component name="DependencyValidationManager">
<scope name="Copyright" pattern="file[kobalt-exec]:src/main/kotlin//*.kt" />
</component>

3
.idea/scopes/Source.xml generated Normal file
View file

@ -0,0 +1,3 @@
<component name="DependencyValidationManager">
<scope name="Source" pattern="file[kobalt-exec]:src/main/kotlin//**kt" />
</component>

View file

@ -1,19 +0,0 @@
language: java
jdk:
- oraclejdk8
before_install:
- chmod +x kobaltw
install: true
cache:
directories:
- $HOME/.m2
- $HOME/.kobalt
before_cache:
- rm -rf .kobalt/*
script: ./kobaltw clean assemble

View file

@ -1,27 +0,0 @@
Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of this project nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

172
README.md
View file

@ -1,172 +0,0 @@
# Command Line Execution plug-in for [Kobalt](http://beust.com/kobalt/home/index.html)
[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/kobalt-exec.svg)](https://github.com/ethauvin/kobalt-exec/releases/latest) [![Build Status](https://travis-ci.org/ethauvin/kobalt-exec.svg?branch=master)](https://travis-ci.org/ethauvin/kobalt-exec) [![CircleCI](https://circleci.com/gh/ethauvin/kobalt-exec/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/kobalt-exec/tree/master) [![Download](https://api.bintray.com/packages/ethauvin/maven/kobalt-exec/images/download.svg)](https://bintray.com/ethauvin/maven/kobalt-exec/_latestVersion)
The plug-in allows for the execution of system commands, similarly to the [Gradle Exec](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Exec.html) or [Ant Exec](https://ant.apache.org/manual/Tasks/exec.html) tasks.
To use the plug-in include the following in your `Build.kt` file:
```kotlin
import net.thauvin.erik.kobalt.plugin.exec.*
val bs = buildScript {
plugins("net.thauvin.erik:kobalt-exc:")
}
val p = project {
name = "example"
exec {
commandLine("echo", "Hello, World!")
}
}
```
[View Example](https://github.com/ethauvin/kobalt-exec/blob/master/example/kobalt/src/Build.kt)
To invoke the `exec` task:
```sh
./kobaltw exec
```
## `commandLine` Directive
The `commandLine` directive is used to execute command line(s) during the build process:
```kotlin
exec {
commandLine("cmd", "/c", "stop.bat", dir = "../tomcat/bin", os = setOf(Os.WINDOWS))
commandLine("./stop.sh", dir = "../tomcat/bin", os = setOf(Os.MAC, Os.LINUX))
commandLine("sh", "-c", "ps aux | grep tomcat", os = setOf(Os.MAC, Os.LINUX), fail = setOf(Fail.EXIT))
commandLine("cmd", "/c", "tasklist | find \"tomcat\"", os = setOf(Os.WINDOWS), fail = setOf(Fail.EXIT))
}
```
## Parameters
### `args`
The full command line including the executable and all arguments.
```kotlin
exec {
commandLine(args = "ls")
commandLine("ls", "-l")
commandLine("cmd", "/c", "dir /Q")
}
```
### `dir`
The working directory in which the command should be executed. Defaults to the project directory.
```kotlin
exec {
commandLine("cmd", "/c", "stop.bat", dir = "../tomcat/bin")
commandLine("./stop.sh", dir = "../tomcat/bin")
}
```
### `os`
List of operating systems on which the command may be executed. If the current OS is contained within the list, the command will be executed.
The following predefined values are available:
Name | Operating System
:-------------|:-------------------------
`Os.CYGWIN` | Cygwin for Windows
`Os.FREEBSD` | FreeBSD
`Os.LINUX` | Linux
`Os.MAC` | Apple Macintosh / OS X
`Os.MINGW` | Minimalist GNU for Windows
`OS.MSYS` | MinGW Minimal System
`Os.OPENVMS` | OpenVMS
`Os.OS400` | OS/400
`Os.SOLARIS` | Solaris / SunOS
`Os.TANDEM` | Tandem's Non-Stop
`Os.WINDOWS` | Microsoft Windows*
`Os.ZOS` | z/OS / OS/390
<sub>* Excluding Cygwin, MinGW and MSYS.</sub>
```kotlin
exec {
commandLine("cmd", "/c", "stop.bat", os = setOf(Os.WINDOWS))
commandLine("./stop.sh", os = setOf(Os.LINUX, Os.MAC))
}
```
### `fail`
List of error options to specify whether data returned to the standard streams and/or an abnormal exit value constitute build failure signaling.
The following predefined values are available:
Name | Failure When
:-------------|:----------------------------------------------------------------
`Fail.EXIT` | Exit value > 0
`Fail.NORMAL` | Exit value > 0 or any data to the standard error stream (stderr)
`Fail.OUTPUT` | Any data to the standard output stream (stdout) or stderr.
`Fail.STDERR` | Any data to stderr.
`Fail.STDOUT` | Any data to stdout.
`Fail.ALL` | Any of the conditions above.
`Fail.NONE` | Never fails.
`Fail.NORMAL` is the default value.
```kotlin
exec {
commandLine("cmd", "/c", "stop.bat", fail = setOf(Fail.EXIT))
commandLine("./stop.sh", fail = setOf(Fail.EXIT, Fail.STDOUT))
}
```
## taskName
Additionally, you can specify a task name to easily identify multiple `exec` tasks.
```kotlin
exec {
taskName = "start"
commandLine("./start.sh", os = setOf(Os.LINUX, Os.MAC))
}
exec {
taskName = "stop"
commandLine("./stop.sh", os = setOf(Os.LINUX, Os.MAC))
}
```
```sh
./kobaltw start
./kobaltw stop
```
## dependsOn
By default the `exec` task depends on `assemble`, use the `dependsOn` parameter to change the dependencies:
```kotlin
exec {
dependsOn = listOf("assemble", "run")
commandLine("cmd", "/c", "start.bat", fail = setOf(Fail.EXIT))
}
```
## Logging / Debugging
To view the output of the `exec` task, use:
```sh
./kobaltw exec --log 2
```
You could also redirect the error stream to a file:
```kotlin
exec {
commandLine("sh", "-c", "./stop.sh 2> error.txt", os = setOf(Os.LINUX))
commandLine("cmd", "/c", "stop.bat 2> error.txt", os = setOf(Os.WINDOWS))
}
```

View file

@ -1,37 +0,0 @@
#!/bin/bash
DEBUG=false
rm="rm -rf"
if [ "$DEBUG" = true ]; then
rm="echo rm -rf"
fi
buildkt="kobalt/src/Build.kt"
name=$(cat $buildkt | grep -m 1 "name = " | cut -d"\"" -f 2)
group=$(cat $buildkt | grep -m 1 "group = " | cut -d"\"" -f 2)
if [ -z "$1" ]; then
version=$(cat $buildkt | grep -m 1 "version = " | cut -d"\"" -f 2)
else
version="$1"
fi
maven="/k/maven/repository/${group//.//}/${name}/${version}"
kobalt="$HOME/.kobalt/cache/${group//.//}/${name}/${version}"
localRepo="$HOME/.kobalt/localMavenRepo/${group//.//}/${name}/${version}"
read -p "Delete version ${version}? " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
for dir in "$kobalt" "$maven" "$localRepo"; do
if [ -d "$dir" ]; then
echo -e "Deleting : \e[32;1m$dir\e[0m"
$rm "$dir"
else
echo -e "Not Found: \e[31;1m$dir\e[0m"
fi
done
fi

View file

@ -1,25 +1,32 @@
import com.beust.kobalt.*
import com.beust.kobalt.plugin.application.*
import com.beust.kobalt.plugin.packaging.*
import com.beust.kobalt.plugin.application.*
import com.beust.kobalt.plugin.java.*
import net.thauvin.erik.kobalt.plugin.exec.*
// ./kobaltw exec echo ps --log 2
// ./kobaltw exec --log 2
// ./kobaltw echo --log 2
// ./kobaltw ps --log 2
val pl = plugins(file("../kobaltBuild/libs/kobalt-exec-0.1.jar"))
val bs = buildScript {
repos(localMaven())
plugins("net.thauvin.erik:kobalt-exec:")
}
val example = project {
val p = project {
name = "example"
group = "com.example"
artifactId = name
version = "0.1"
sourceDirectories {
path("src/main/java")
}
sourceDirectoriesTest {
path("src/test/java")
}
dependencies {
}
dependenciesTest {
}
assemble {
jar {
}
@ -30,23 +37,7 @@ val example = project {
}
exec {
commandLine("ls", "-l", dir = "../kobalt/wrapper", os = setOf(Os.LINUX, Os.MINGW, Os.CYGWIN))
commandLine("cmd", "/c", "dir /Q", dir = "../kobalt/wrapper", os = setOf(Os.WINDOWS))
}
exec {
taskName = "echo"
dependsOn = listOf("exec", "run")
val echo = arrayOf("echo", "Test", "Example")
commandLine(*echo, os = setOf(Os.LINUX, Os.MINGW, Os.CYGWIN))
commandLine("cmd", "/c", *echo, os = setOf(Os.WINDOWS))
}
exec {
taskName = "ps"
dependsOn = listOf() // no dependencies
commandLine("sh", "-c", "ps aux | grep bash", os = setOf(Os.LINUX, Os.MINGW, Os.CYGWIN))
commandLine("cmd", "/c", "tasklist | find \"cmd.exe\"", os = setOf(Os.WINDOWS), fail = setOf(Fail.EXIT))
commandLine(args = listOf("ls", "-l"), dir = "../libs", fail = setOf(Fail.NORMAL))
commandLine(listOf("cmd", "/c", "echo", "Test"), os = listOf("Win", "Windows"), fail = setOf(Fail.NORMAL))
}
}

View file

@ -1 +1 @@
kobalt.version=1.0.90
kobalt.version=0.846

3
example/kobaltw Executable file → Normal file
View file

@ -1,2 +1 @@
#!/usr/bin/env sh
java -jar "`dirname "$0"`/kobalt/wrapper/kobalt-wrapper.jar" $*
java -jar $(dirname $0)/kobalt/wrapper/kobalt-wrapper.jar $*

View file

@ -1,4 +0,0 @@
@echo off
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
java -jar "%DIRNAME%/kobalt/wrapper/kobalt-wrapper.jar" %*

View file

@ -1,682 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="kobalt-exec" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="KOBALT" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/kobaltBuild/classes" />
<output-test url="file://$MODULE_DIR$/kobaltBuild/test-classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/kotlin" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/kotlin" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/kobaltBuild" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.yaml:snakeyaml:jar:1.17">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/yaml/snakeyaml/1.17/snakeyaml-1.17.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.jetbrains:annotations:jar:13.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.jetbrains.kotlin:kotlin-stdlib:jar:1.1.2-2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/jetbrains/kotlin/kotlin-stdlib/1.1.2-2/kotlin-stdlib-1.1.2-2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.jetbrains:annotations:jar:13.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.jetbrains.kotlin:kotlin-test:jar:1.1.2-2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/jetbrains/kotlin/kotlin-test/1.1.2-2/kotlin-test-1.1.2-2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.jetbrains.kotlin:kotlin-stdlib:jar:1.1.2-2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/jetbrains/kotlin/kotlin-stdlib/1.1.2-2/kotlin-stdlib-1.1.2-2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: com.beust:jcommander:jar:1.64">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/beust/jcommander/1.64/jcommander-1.64.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.testng:testng:jar:(0,]">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/testng/testng/6.11/testng-6.11.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.beust:kobalt-plugin-api:jar:(0,]">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/beust/kobalt-plugin-api/1.0.68/kobalt-plugin-api-1.0.68.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.inject:guice:jar:4.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/inject/guice/4.0/guice-4.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.inject.extensions:guice-assistedinject:jar:4.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/inject/extensions/guice-assistedinject/4.0/guice-assistedinject-4.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.guava:guava:jar:19.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/guava/guava/19.0/guava-19.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven:maven-model:jar:3.3.9">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/maven-model/3.3.9/maven-model-3.3.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: io.reactivex:rxjava:jar:1.1.5">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/io/reactivex/rxjava/1.1.5/rxjava-1.1.5.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.retrofit2:retrofit:jar:2.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/retrofit2/retrofit/2.1.0/retrofit-2.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.retrofit2:converter-gson:jar:2.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/retrofit2/converter-gson/2.1.0/converter-gson-2.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jgit:org.eclipse.jgit:jar:4.5.0.201609210915-r">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jgit/org.eclipse.jgit/4.5.0.201609210915-r/org.eclipse.jgit-4.5.0.201609210915-r.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.slf4j:slf4j-simple:jar:1.7.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/slf4j/slf4j-simple/1.7.3/slf4j-simple-1.7.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.resolver:maven-resolver-api:jar:1.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/resolver/maven-resolver-api/1.0.3/maven-resolver-api-1.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.resolver:maven-resolver-spi:jar:1.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/resolver/maven-resolver-spi/1.0.3/maven-resolver-spi-1.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.resolver:maven-resolver-util:jar:1.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/resolver/maven-resolver-util/1.0.3/maven-resolver-util-1.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.resolver:maven-resolver-impl:jar:1.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/resolver/maven-resolver-impl/1.0.3/maven-resolver-impl-1.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.resolver:maven-resolver-connector-basic:jar:1.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/resolver/maven-resolver-connector-basic/1.0.3/maven-resolver-connector-basic-1.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.resolver:maven-resolver-transport-http:jar:1.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/resolver/maven-resolver-transport-http/1.0.3/maven-resolver-transport-http-1.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.resolver:maven-resolver-transport-file:jar:1.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/resolver/maven-resolver-transport-file/1.0.3/maven-resolver-transport-file-1.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven:maven-aether-provider:jar:3.3.9">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/maven-aether-provider/3.3.9/maven-aether-provider-3.3.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.testng.testng-remote:testng-remote:jar:1.3.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/testng/testng-remote/testng-remote/1.3.2/testng-remote-1.3.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: commons-io:commons-io:jar:2.5">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/commons-io/commons-io/2.5/commons-io-2.5.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.platform:junit-platform-surefire-provider:jar:1.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/platform/junit-platform-surefire-provider/1.0.0-M4/junit-platform-surefire-provider-1.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.platform:junit-platform-runner:jar:1.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/platform/junit-platform-runner/1.0.0-M4/junit-platform-runner-1.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.platform:junit-platform-console:jar:1.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/platform/junit-platform-console/1.0.0-M4/junit-platform-console-1.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.jupiter:junit-jupiter-engine:jar:5.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/jupiter/junit-jupiter-engine/5.0.0-M4/junit-jupiter-engine-5.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.vintage:junit-vintage-engine:jar:4.12.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/vintage/junit-vintage-engine/4.12.0-M4/junit-vintage-engine-4.12.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.commons:commons-compress:jar:1.13">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/commons/commons-compress/1.13/commons-compress-1.13.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: javax.inject:javax.inject:jar:1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/javax/inject/javax.inject/1/javax.inject-1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: aopalliance:aopalliance:jar:1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/aopalliance/aopalliance/1.0/aopalliance-1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.codehaus.plexus:plexus-utils:jar:3.0.22">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/codehaus/plexus/plexus-utils/3.0.22/plexus-utils-3.0.22.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.commons:commons-lang3:jar:3.4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.okhttp3:okhttp:jar:3.3.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/okhttp3/okhttp/3.3.0/okhttp-3.3.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.code.gson:gson:jar:2.7">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/code/gson/gson/2.7/gson-2.7.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.jcraft:jsch:jar:0.1.53">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/jcraft/jsch/0.1.53/jsch-0.1.53.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.googlecode.javaewah:JavaEWAH:jar:0.7.9">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/googlecode/javaewah/JavaEWAH/0.7.9/JavaEWAH-0.7.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.httpcomponents:httpclient:jar:4.3.6">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/httpcomponents/httpclient/4.3.6/httpclient-4.3.6.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.slf4j:slf4j-api:jar:1.7.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/slf4j/slf4j-api/1.7.3/slf4j-api-1.7.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.slf4j:jcl-over-slf4j:jar:1.6.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/slf4j/jcl-over-slf4j/1.6.2/jcl-over-slf4j-1.6.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven:maven-model-builder:jar:3.3.9">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/maven-model-builder/3.3.9/maven-model-builder-3.3.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven:maven-repository-metadata:jar:3.3.9">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/maven-repository-metadata/3.3.9/maven-repository-metadata-3.3.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-api:jar:1.0.2.v20150114">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-api/1.0.2.v20150114/aether-api-1.0.2.v20150114.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-spi:jar:1.0.2.v20150114">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-spi/1.0.2.v20150114/aether-spi-1.0.2.v20150114.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-util:jar:1.0.2.v20150114">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-util/1.0.2.v20150114/aether-util-1.0.2.v20150114.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-impl:jar:1.0.2.v20150114">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-impl/1.0.2.v20150114/aether-impl-1.0.2.v20150114.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.auto.service:auto-service:jar:1.0-rc3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/auto/service/auto-service/1.0-rc3/auto-service-1.0-rc3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.testng:testng:jar:6.11">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/testng/testng/6.11/testng-6.11.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.platform:junit-platform-launcher:jar:1.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/platform/junit-platform-launcher/1.0.0-M4/junit-platform-launcher-1.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.surefire:surefire-api:jar:2.19.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/surefire/surefire-api/2.19.1/surefire-api-2.19.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven.surefire:common-java5:jar:2.19.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/surefire/common-java5/2.19.1/common-java5-2.19.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.platform:junit-platform-suite-api:jar:1.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/platform/junit-platform-suite-api/1.0.0-M4/junit-platform-suite-api-1.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: junit:junit:jar:4.12">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/junit/junit/4.12/junit-4.12.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.jupiter:junit-jupiter-api:jar:5.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/jupiter/junit-jupiter-api/5.0.0-M4/junit-jupiter-api-5.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.okio:okio:jar:1.8.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/okio/okio/1.8.0/okio-1.8.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.httpcomponents:httpcore:jar:4.3.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/httpcomponents/httpcore/4.3.3/httpcore-4.3.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: commons-logging:commons-logging:jar:1.1.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: commons-codec:commons-codec:jar:1.6">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/commons-codec/commons-codec/1.6/commons-codec-1.6.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.codehaus.plexus:plexus-interpolation:jar:1.21">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/codehaus/plexus/plexus-interpolation/1.21/plexus-interpolation-1.21.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.codehaus.plexus:plexus-component-annotations:jar:1.6">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/codehaus/plexus/plexus-component-annotations/1.6/plexus-component-annotations-1.6.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven:maven-artifact:jar:3.3.9">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/maven-artifact/3.3.9/maven-artifact-3.3.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.maven:maven-builder-support:jar:3.3.9">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/maven-builder-support/3.3.9/maven-builder-support-3.3.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.auto:auto-common:jar:0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/auto/auto-common/0.3/auto-common-0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.beust:jcommander:jar:1.64">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/beust/jcommander/1.64/jcommander-1.64.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.yaml:snakeyaml:jar:1.17">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/yaml/snakeyaml/1.17/snakeyaml-1.17.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.platform:junit-platform-engine:jar:1.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/platform/junit-platform-engine/1.0.0-M4/junit-platform-engine-1.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.hamcrest:hamcrest-core:jar:1.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.junit.platform:junit-platform-commons:jar:1.0.0-M4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/junit/platform/junit-platform-commons/1.0.0-M4/junit-platform-commons-1.0.0-M4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.opentest4j:opentest4j:jar:1.0.0-M2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/opentest4j/opentest4j/1.0.0-M2/opentest4j-1.0.0-M2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>

View file

@ -1,42 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="Build.kt" external.linked.project.path="$MODULE_DIR$/.." external.root.project.path="$MODULE_DIR$/.." external.system.id="KOBALT" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/out/classes" />
<output-test url="file://$MODULE_DIR$/out/test-classes" />
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library name="Kobalt: kobalt-versioneye-0.4.5.jar">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/net/thauvin/erik/kobalt-versioneye/0.4.5/kobalt-versioneye-0.4.5.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: kobalt-maven-local-0.5.3.jar">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/net/thauvin/erik/kobalt-maven-local/0.5.3/kobalt-maven-local-0.5.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.beust.kobalt:kobalt:jar:1.0.82">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/wrapper/dist/kobalt-1.0.82/kobalt/wrapper/kobalt-1.0.82.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.kobalt/wrapper/dist/kobalt-1.0.82/kobalt/wrapper/kobalt-1.0.82-sources.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="library" name="kobalt.jar" level="project" />
</component>
</module>

View file

@ -1,23 +1,15 @@
import com.beust.kobalt.buildScript
import com.beust.kobalt.localMaven
import com.beust.kobalt.file
import com.beust.kobalt.plugin.packaging.assemble
import com.beust.kobalt.plugin.publish.autoGitTag
import com.beust.kobalt.plugin.publish.bintray
import com.beust.kobalt.profile
import com.beust.kobalt.project
import net.thauvin.erik.kobalt.plugin.versioneye.versionEye
import com.beust.kobalt.repos
import org.apache.maven.model.Developer
import org.apache.maven.model.License
import org.apache.maven.model.Model
import org.apache.maven.model.Scm
val bs = buildScript {
repos(localMaven())
plugins("net.thauvin.erik:kobalt-versioneye:", "net.thauvin.erik:kobalt-maven-local:")
}
val repos = repos()
val dev by profile()
val dev = false
val kobaltDependency = if (dev) "kobalt" else "kobalt-plugin-api"
val p = project {
@ -25,10 +17,11 @@ val p = project {
name = "kobalt-exec"
group = "net.thauvin.erik"
artifactId = name
version = "0.7.0"
version = "0.5.0-beta"
pom = Model().apply {
description = "Command Line Execution plug-in for the Kobalt build system."
name = project.name
description = "Command line execution plugin for the Kobalt build system"
url = "https://github.com/ethauvin/kobalt-exec"
licenses = listOf(License().apply {
name = "BSD 3-Clause"
@ -46,36 +39,28 @@ val p = project {
})
}
sourceDirectories {
path("src/main/kotlin")
}
sourceDirectoriesTest {
path("src/test/kotlin")
}
dependencies {
compile("com.beust:$kobaltDependency:")
compile("org.jetbrains.kotlin:kotlin-stdlib:1.1.51")
compile("com.beust:$kobaltDependency:0.842")
}
dependenciesTest {
compile("org.testng:testng:6.12")
compile("org.jetbrains.kotlin:kotlin-test:1.1.51")
compile("org.testng:testng:")
}
assemble {
mavenJars {
fatJar = true
}
}
autoGitTag {
enabled = true
push = false
message = "Version $version"
mavenJars {}
}
bintray {
publish = true
description = "Release version $version"
vcsTag = version
}
versionEye {
org = "Thauvin"
team = "Owners"
publish = false
}
}

Binary file not shown.

View file

@ -1 +1 @@
kobalt.version=1.0.90
kobalt.version=0.847

3
kobaltw Executable file → Normal file
View file

@ -1,2 +1 @@
#!/usr/bin/env sh
java -jar "`dirname "$0"`/kobalt/wrapper/kobalt-wrapper.jar" $*
java -jar $(dirname $0)/kobalt/wrapper/kobalt-wrapper.jar $*

View file

@ -1,4 +0,0 @@
@echo off
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
java -jar "%DIRNAME%/kobalt/wrapper/kobalt-wrapper.jar" %*

View file

@ -1,7 +1,7 @@
/*
* ExecPlugin.kt
*
* Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net)
* Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -31,21 +31,18 @@
*/
package net.thauvin.erik.kobalt.plugin.exec
import com.beust.kobalt.Plugins
import com.beust.kobalt.TaskResult
import com.beust.kobalt.api.*
import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.misc.log
import com.google.inject.Inject
import com.google.inject.Singleton
import java.io.*
import java.util.*
import java.io.BufferedReader
import java.io.File
import java.io.InputStream
import java.io.InputStreamReader
import java.util.concurrent.TimeUnit
@Singleton
class ExecPlugin @Inject constructor(val taskContributor: TaskContributor, val configActor: ConfigsActor<ExecConfig>) :
BasePlugin(), ITaskContributor, IConfigsActor<ExecConfig> by configActor {
class ExecPlugin : BasePlugin(), ITaskContributor {
// ITaskContributor
override fun tasksFor(project: Project, context: KobaltContext): List<DynamicTask> {
return emptyList()
@ -57,144 +54,76 @@ class ExecPlugin @Inject constructor(val taskContributor: TaskContributor, val c
override val name = NAME
override fun apply(project: Project, context: KobaltContext) {
configurationFor(project)?.let { configs ->
configs.forEach { config ->
taskManager.addTask(this, project, config.taskName,
description = "Execute a command line process.",
group = "Other",
dependsOn = config.dependsOn,
task = { executeCommands(project, config) })
taskContributor.addVariantTasks(this, project, context, config.taskName,
dependsOn = config.dependsOn,
runTask = { executeCommands(project, config) })
}
}
@Task(name = "exec", description = "Execute a command line process.")
fun taskExec(project: Project): TaskResult {
return executeCommands(project)
}
private fun isCygwin(): Boolean {
val path: String? = System.getenv("ORIGINAL_PATH")
return path?.contains("/cygdrive/") ?: false
}
private fun isMinGW(os: Os = Os.MINGW, any: Boolean = false): Boolean {
val msys: String? = System.getenv("MSYSTEM")
if (!msys.isNullOrBlank()) {
if (any) {
return true
} else if (os.equals(Os.MSYS)) {
return msys!!.startsWith("MSYS")
} else if (os.equals(Os.MINGW)) {
return msys!!.startsWith("MINGW")
}
}
return false
}
private fun matchOs(os: Os): Boolean {
val curOs: String = System.getProperty("os.name").toLowerCase(Locale.US)
when (os) {
Os.WINDOWS -> {
if (!isMinGW(any = true) && !isCygwin()) {
return curOs.contains("windows")
} else {
return false
}
}
Os.MAC -> {
return (curOs.contains("mac") || curOs.contains("darwin") || curOs.contains("osx"))
}
Os.LINUX -> {
return curOs.contains("linux")
}
Os.FREEBSD -> {
return curOs.contains("freebsd")
}
Os.SOLARIS -> {
return (curOs.contains("sunos") || curOs.contains("solaris"))
}
Os.OPENVMS -> {
return curOs.contains("openvms")
}
Os.ZOS -> {
return (curOs.contains("z/os") || curOs.contains("os/390"))
}
Os.TANDEM -> {
return curOs.contains("nonstop_kernel")
}
Os.OS400 -> {
return curOs.contains("os/400")
}
Os.CYGWIN -> {
return isCygwin()
}
Os.MINGW -> {
return isMinGW()
}
Os.MSYS -> {
return isMinGW(Os.MSYS)
}
}
}
private fun executeCommands(project: Project, config: ExecConfig): TaskResult {
private fun executeCommands(project: Project): TaskResult {
var success = true
val config = configs[project.name]
val errorMessage = StringBuilder()
for ((args, dir, os, fail) in config.commandLines) {
val wrkDir = File(if (dir.isNullOrBlank()) project.directory else dir)
if (wrkDir.isDirectory) {
var execute = (os.isEmpty())
if (!execute) {
for (name in os) {
execute = matchOs(name)
if (execute) break
}
}
if (execute) {
log(2, (if (!wrkDir.name.equals(".")) wrkDir.name else "") + "> " + args.joinToString(" "))
val pb = ProcessBuilder().command(args.toList())
pb.directory(wrkDir)
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()
val cmdInfo = "Program \"" + args.joinToString(" ") + "\" (in directory \"${wrkDir.path}\"): "
if (!err) {
errorMessage.append(cmdInfo).append("TIMEOUT")
success = false
} else if (!fail.contains(Fail.NONE)) {
val all = fail.contains(Fail.ALL)
val output = fail.contains(Fail.OUTPUT)
if ((all || fail.contains(Fail.EXIT) || fail.contains(Fail.NORMAL)) && proc.exitValue() > 0) {
errorMessage.append(cmdInfo).append("EXIT ${proc.exitValue()}")
if (stderr.isNotEmpty()) errorMessage.append(", STDERR: ").append(stderr[0])
success = false
} else if ((all || output || fail.contains(Fail.STDERR) || fail.contains(Fail.NORMAL))
&& stderr.isNotEmpty()) {
errorMessage.append(cmdInfo).append("STDERR, ").append(stderr[0])
success = false
} else if ((all || output || fail.contains(Fail.STDOUT)) && stdout.isNotEmpty()) {
errorMessage.append(cmdInfo).append("STDOUT, ").append(stdout[0])
success = false
if (config != null) {
for ((args, dir, os, fail) in config.commandLines) {
val wrkDir = File(if (dir.isNullOrBlank()) project.directory else dir)
if (wrkDir.isDirectory) {
var execute = (os.size == 0)
if (!execute) {
val curOs: String = System.getProperty("os.name")
for (name in os) {
execute = curOs.startsWith(name, true)
if (execute) break
}
}
}
} else {
errorMessage.append("Invalid working directory: \"${wrkDir.canonicalPath}\"")
success = false
}
if (execute) {
log(2, "> " + args.joinToString(" "))
val pb = ProcessBuilder().command(args.toList())
pb.directory(wrkDir)
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()
val cmdInfo = "Program \"" + args.joinToString(" ") + "\" (in directory \"${wrkDir.path}\"): "
if (!success) break
if (err == false) {
errorMessage.append(cmdInfo).append("TIMEOUT")
success = false
} else if (fail.isNotEmpty()) {
val all = fail.contains(Fail.ALL)
val output = fail.contains(Fail.OUTPUT)
if ((all || fail.contains(Fail.EXIT) || fail.contains(Fail.NORMAL)) && proc.exitValue() > 0) {
errorMessage.append(cmdInfo).append("EXIT ${proc.exitValue()}")
if (stderr.isNotEmpty()) errorMessage.append(", STDERR: ").append(stderr[0])
success = false
} else if ((all || output || fail.contains(Fail.STDERR) || fail.contains(Fail.NORMAL))
&& stderr.isNotEmpty()) {
errorMessage.append(cmdInfo).append("STDERR, ").append(stderr[0])
success = false
} else if ((all || output || fail.contains(Fail.STDOUT)) && stdout.isNotEmpty()) {
errorMessage.append(cmdInfo).append("STDOUT, ").append(stdout[0])
success = false
}
}
}
} else {
errorMessage.append("Invalid working directory: \"${wrkDir.canonicalPath}\"")
success = false
}
if (!success) break
}
}
//@TODO until Cedric fixes it.
//@TODO until cedric fixes it.
if (!success) error(errorMessage)
return TaskResult(success)
return TaskResult(success, errorMessage.toString())
}
private val configs = hashMapOf<String, ExecConfig>()
fun addExecConfig(projectName: String, config: ExecConfig) {
configs.put(projectName, config)
}
private fun fromStream(ins: InputStream): List<String> {
@ -213,35 +142,27 @@ class ExecPlugin @Inject constructor(val taskContributor: TaskContributor, val c
}
}
enum class Fail {
ALL, EXIT, NONE, NORMAL, OUTPUT, STDERR, STDOUT
enum class Fail() {
ALL, NORMAL, STDERR, STDOUT, OUTPUT, EXIT
}
enum class Os {
CYGWIN, FREEBSD, LINUX, MAC, MINGW, MSYS, OPENVMS, OS400, SOLARIS, TANDEM, WINDOWS, ZOS
}
data class CommandLine(var args: List<String> = emptyList(), var dir: String = "",
var os: List<String> = emptyList(), var fail: Set<Fail> = emptySet())
data class CommandLine(var args: List<String> = emptyList(), var dir: String = "", var os: Set<Os> = emptySet(),
var fail: Set<Fail> = setOf(Fail.NORMAL))
@Directive
class ExecConfig {
var taskName: String = "exec"
data class ExecConfig(val project: Project) {
val commandLines = arrayListOf<CommandLine>()
var dependsOn = listOf("assemble")
@Suppress("unused")
fun commandLine(vararg args: String, dir: String = "", os: Set<Os> = emptySet(),
fail: Set<Fail> = setOf(Fail.NORMAL)) {
if (args.isNotEmpty()) commandLines.add(CommandLine(listOf(*args), dir, os, fail))
@Directive fun commandLine(args: List<String> = emptyList(), dir: String = "", os: List<String> = emptyList(),
fail: Set<Fail> = emptySet()) {
if (args.size > 0) commandLines.add(CommandLine(args, dir, os, fail))
}
}
@Suppress("unused")
@Directive
fun Project.exec(init: ExecConfig.() -> Unit) {
ExecConfig().let { config ->
config.init()
(Plugins.findPlugin(ExecPlugin.NAME) as ExecPlugin).addConfiguration(this, config)
fun Project.exec(init: ExecConfig.() -> Unit): ExecConfig {
with(ExecConfig(this)) {
init()
(Kobalt.findPlugin(ExecPlugin.NAME) as ExecPlugin).addExecConfig(name, this)
return this
}
}

View file

@ -0,0 +1,39 @@
/*
* MainTest.kt
*
* Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of this project nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.example
import org.testng.annotations.Test
class ExampleTest {
@Test
fun f() = println("Running test")
}

BIN
wrapper/kobalt-wrapper.jar Normal file

Binary file not shown.

View file

@ -0,0 +1 @@
kobalt.version=0.843