1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-30 01:48:12 -07:00

Compare commits

...

864 commits

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

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

    After:
    ***** WARNING Old profile syntax detected for "val debug = false", please update to "val debug by profile()
2017-11-06 19:54:54 +01:00
Marcus Fihlon
70f01fa691
Merge branch 'master' of github.com:cbeust/kobalt 2017-11-06 19:51:32 +01:00
Marcus Fihlon
2e2444c2bc
👌 Code review change
Thanks to @ethauvin for his very good hint!
2017-11-06 19:49:28 +01:00
be40f5c81d Fixed finding tools.jar under Windows when JAVA_HOME is set to JRE. 2017-11-05 17:11:11 -08:00
Cedric Beust
05f8e2f41a
Merge pull request #458 from McPringle/master
Fixing the WAR filename could contain a `null` version #456
2017-11-05 07:02:08 -08:00
Marcus Fihlon
5aef25a4a7
🐛 Fixing the WAR filename contains if version information is missing #456 2017-11-05 03:08:12 -06:00
Cedric Beust
e7ae50fe81
Merge pull request #454 from ethauvin/master
Java 9 initial compatibility
2017-11-04 13:36:08 -07:00
702a34dd4b Made executable in git index. 2017-11-04 12:14:30 -07:00
bd8ba4c497 Added kobatw-test wrapper to build the kobalt project using the jar in kobaltBuild/libs for testing. 2017-11-03 19:03:21 -07:00
a115111168 Added missing jaxb dependency for plugin API. 2017-11-03 19:01:38 -07:00
a431f4850b Syntax fix. 2017-11-03 13:15:15 -07:00
a1aa6d8eea Resolving merge conflict. 2017-11-02 17:47:40 -07:00
49db5a798e Fixed coroutinesSate syntax. 2017-11-02 17:40:14 -07:00
82b89edaee
Merge pull request #455 from pabl0rg/upgrade-to-kotlinc-1-1-51
upgrade to kotlinc 1.1.51
2017-11-02 17:26:42 -07:00
Juan Liska
f6de041fd8 bump kotlin compiler version string const 2017-11-02 17:35:49 -06:00
Juan Liska
629949edd4 upgrade to kotlinc 1.1.51 2017-11-02 17:26:29 -06:00
e8dcfc6d4b More syntax fix. 2017-11-01 10:13:39 -07:00
05d0ff04fb Fixed various syntax. 2017-10-31 23:17:42 -07:00
c99a9eb6cd First try at running under Java 9. 2017-10-31 21:44:57 -07:00
Cedric Beust
86e39cbb58 1.0.90. 2017-09-16 18:25:57 -07:00
Cedric Beust
f92ac752c1 1.0.89/ 2017-07-25 10:40:08 -07:00
Cedric Beust
084f4b5385 Silly oversight, 2017-07-25 10:39:53 -07:00
Cedric Beust
b109674f1a Merge branch 'master' of github.com:cbeust/kobalt 2017-07-25 10:31:29 -07:00
Cedric Beust
f782fa2236 1.0.88. 2017-07-25 10:23:52 -07:00
Cedric Beust
4405cf154c OsgiPlugin bug. 2017-07-25 10:23:17 -07:00
Cedric Beust
aac60fa0a3 Merge pull request #452 from MrTact/kotlin-template-deps
Fixes #451 -- add stdlib and runtime deps to the Kotlin project template
2017-07-19 20:21:01 -07:00
Tim Keating
be29f2c0b3 PR feedback: use version constant instead of hard-coded strings 2017-07-19 22:05:45 -05:00
Tim Keating
9e6b3d26db Fixes #451 -- add stdlib and runtime deps to the Kotlin project template 2017-07-18 00:26:01 -05:00
Cedric Beust
76bd010168 1.0.87. 2017-05-31 09:07:52 -07:00
Cedric Beust
c1c2057de4 Merge pull request #445 from albinekcom/patch-1
Update README
2017-05-21 06:32:07 -07:00
Albin "albinek" Sadowski
11cd3226e9 Update README 2017-05-21 09:51:03 +02:00
Cedric Beust
4efe8125d7 Merge pull request #444 from ethauvin/master
Added push parameter to autoGitTag
2017-05-10 12:44:17 -07:00
b944039fdc Added push parameter to autoGitTag. 2017-05-10 11:46:41 -07:00
Cedric Beust
a38b05fc92 Merge pull request #443 from ethauvin/master
Fixed repo name to use config param if available
2017-05-10 11:10:57 -07:00
bcb9cc4e87 Fixed repo name to use config param if available. 2017-05-10 11:08:15 -07:00
Cedric Beust
a1b952ca69 1.0.86. 2017-05-10 09:58:54 -07:00
Cedric Beust
a47b570d16 Fix the bogus default value for getProperty(). 2017-05-10 09:58:54 -07:00
Cedric Beust
75fbfb9613 Refactoring. 2017-05-09 13:12:22 -07:00
Cedric Beust
61af72e26d 1.0.85. 2017-05-09 10:56:06 -07:00
Cedric Beust
1d7f04bf47 Build fix. 2017-05-09 10:56:00 -07:00
Cedric Beust
d1039ce9af 1.0.84. 2017-05-08 15:47:59 -07:00
Cedric Beust
a95f8d91c1 Merge pull request #442 from ethauvin/master
Added support for configuring gpg's via local.properties
2017-05-08 15:47:50 -07:00
3b56122f92 Added support for configuring gpg's passphrase, key id and secret key ring location via local.properties. 2017-05-05 15:46:13 -07:00
Cedric Beust
91bb1b955c Warnings. 2017-05-05 12:47:29 -07:00
Cedric Beust
2227783905 Merge pull request #441 from ethauvin/master
Fixed vcs_tag
2017-05-05 11:20:00 -07:00
f43c186da1 Cleanup. 2017-05-05 10:33:21 -07:00
706f27de40 Added Bintray's package name and issue tracker URL. 2017-05-05 08:45:21 -07:00
62e1d55b53 Fixed vcs_tag.
Grab project description and url from pom, if not already specified.
2017-05-04 16:22:22 -07:00
Cedric Beust
686d98cdc9 Rename. 2017-05-04 09:39:52 -07:00
Cedric Beust
b74c4d65b2 Fix warnings. 2017-05-04 09:36:38 -07:00
Cedric Beust
4ff98d6d37 Merge pull request #440 from ethauvin/master
Removed sources directory from apt generated directory path
2017-05-04 09:32:17 -07:00
e468d1cb4d Removed sources directory from apt generated directory path. 2017-05-04 00:12:16 -07:00
Cedric Beust
2439da3545 Merge pull request #439 from ethauvin/master
Made doc run after clean
2017-05-03 20:43:31 -07:00
c69a41db66 Made doc run after clean. 2017-05-03 20:13:58 -07:00
407d2bb436 Cleanup. 2017-05-03 20:13:13 -07:00
Cedric Beust
74d6670882 1.0.83. 2017-05-03 11:32:55 -07:00
Cedric Beust
d095840121 Fix fixSlashes().
Fixes https://github.com/cbeust/kobalt/pull/438
2017-05-03 11:32:41 -07:00
Cedric Beust
8ea67e70cd Merge pull request #438 from ethauvin/master
Implemented javadoc options
2017-05-03 11:00:44 -07:00
e4650dd953 Implemented javadoc options. 2017-05-03 09:46:02 -07:00
Cedric Beust
2e7de257aa Better javadoc default args. 2017-05-02 14:17:39 -07:00
Cedric Beust
8fa360949b Simplify. 2017-05-02 14:07:44 -07:00
Cedric Beust
083d707345 1.0.82. 2017-05-02 11:24:38 -07:00
Cedric Beust
13f544d67c Add javadoc { args() }. 2017-05-02 11:24:21 -07:00
Cedric Beust
c0ed9a5a03 Not used. 2017-05-02 11:19:38 -07:00
Cedric Beust
dcfa18ceb8 1.0.81 2017-05-01 11:11:20 -07:00
Cedric Beust
bc4bee8461 OSGi improvements. 2017-05-01 11:11:11 -07:00
Cedric Beust
4385a81308 1.0.80. 2017-04-28 10:18:11 -07:00
Cedric Beust
60a7c88377 Restructure. 2017-04-28 10:18:11 -07:00
Cedric Beust
f674ed65d6 Don’t include stubs in the jar file.
Fixes https://github.com/cbeust/kobalt/issues/437
2017-04-28 10:18:11 -07:00
Cedric Beust
fff392d573 Log. 2017-04-28 10:18:11 -07:00
Cedric Beust
14aab6bee1 Merge pull request #436 from ethauvin/master
Fixed config.taskName
2017-04-27 19:28:40 -07:00
d0d5e75243 Fixed config.taskName. 2017-04-27 19:13:20 -07:00
Cedric Beust
5629806df2 Refactor. 2017-04-27 16:29:05 -07:00
Cedric Beust
7ea182b42e 1.0.79. 2017-04-27 16:22:33 -07:00
Cedric Beust
bfe4140143 Fix the run dependency. 2017-04-27 16:21:44 -07:00
Cedric Beust
0e6bc67c4b Fix manifest path. 2017-04-27 16:21:35 -07:00
Cedric Beust
67da9b8dc6 Better toString(). 2017-04-27 16:21:25 -07:00
Cedric Beust
96eabbe99b 1.0.78. 2017-04-27 13:32:32 -07:00
Cedric Beust
6cab82e280 Refactor. 2017-04-27 13:32:21 -07:00
Cedric Beust
9b08f57917 Fix the case where no MANIFEST exists. 2017-04-27 13:31:19 -07:00
Cedric Beust
742fff6105 Not used. 2017-04-27 11:34:24 -07:00
Cedric Beust
5829ae49bb Fix the duplicate MANIFEST.MF bug. 2017-04-27 11:34:19 -07:00
Cedric Beust
18653c4da1 Better log message. 2017-04-27 10:57:51 -07:00
Cedric Beust
b937aa6ad8 Created the generated source directory.
Fixes https://github.com/cbeust/kobalt/issues/433
2017-04-27 10:57:44 -07:00
Cedric Beust
3ebc40d58f Update Guava. 2017-04-26 14:20:22 -07:00
Cedric Beust
161e5db53c OsgiPlugin. 2017-04-26 14:19:55 -07:00
Cedric Beust
a367621ee4 1.0.77. 2017-04-25 10:59:51 -07:00
Cedric Beust
c3c3b0863a Kotlin 1.1.2. 2017-04-25 10:59:40 -07:00
Cedric Beust
5e12e028bd Be consistent with using taskContributor everywhere. 2017-04-25 10:40:16 -07:00
Cedric Beust
ba6ab5592e Allow multiple install{} tags.
Fixes https://github.com/cbeust/kobalt/issues/430.
2017-04-25 10:24:10 -07:00
Cedric Beust
5b1c9150a5 Better error message. 2017-04-24 16:04:20 -07:00
Cedric Beust
4a5a6442ec 1.0.76. 2017-04-24 15:03:11 -07:00
Cedric Beust
93f5c541f4 Support for multiple application{} directives.
Fixes https://github.com/cbeust/kobalt/issues/430.
2017-04-24 14:58:54 -07:00
Cedric Beust
65f423ffea 1.0.75. 2017-04-24 11:39:43 -07:00
Cedric Beust
523b9c055a Not used. 2017-04-24 11:37:52 -07:00
Cedric Beust
ae6d1d51e1 Refactor. 2017-04-24 11:35:09 -07:00
Cedric Beust
cccff9e7b0 Refactor. 2017-04-24 11:34:54 -07:00
Cedric Beust
bb2e09f680 Kill the Kobalt server after 10 minutes of inactivity. 2017-04-24 09:56:53 -07:00
Cedric Beust
fd80166186 Warn if tools.jar can’t be found. 2017-04-24 09:53:37 -07:00
Cedric Beust
7e86b5ae86 Delete server file on exit. 2017-04-24 09:49:12 -07:00
Cedric Beust
ec7d24a6f8 Make sure JAVA_HOME points to the JDK and not the JRE.
Should fix https://github.com/cbeust/kobalt/issues/428.
2017-04-24 09:48:23 -07:00
Cedric Beust
0f658cf010 1.0.74. 2017-04-22 21:34:15 -07:00
Cedric Beust
0f80fe6d68 Merge branch 'master' of github.com:cbeust/kobalt 2017-04-22 21:28:44 -07:00
Cedric Beust
9ec708ebf3 Bug with kapt when no Java files are present. 2017-04-22 21:28:31 -07:00
Cedric Beust
2a545b6638 Merge branch 'master' of github.com:cbeust/kobalt 2017-04-22 13:25:20 -07:00
Cedric Beust
6a08d3caa8 Fix slashes in the zip file. 2017-04-22 13:23:24 -07:00
Cedric Beust
cc481a4a7f GH-423: Overwrite files on Windows too.
Fixes https://github.com/cbeust/kobalt/issues/423
2017-04-21 23:02:59 -07:00
Cedric Beust
c768507ed5 Reformat. 2017-04-21 22:18:56 -07:00
Cedric Beust
2abeef347e Merge pull request #425 from ethauvin/newest
Made warn() work like error() with provided message
2017-04-21 22:16:17 -07:00
Cedric Beust
35769f099f Merge branch 'master' of github.com:cbeust/kobalt 2017-04-21 21:28:58 -07:00
Cedric Beust
3a41868824 1.0.73. 2017-04-21 21:25:52 -07:00
Cedric Beust
a10777ee1d Fix the duplicate compiler args bug. 2017-04-21 21:25:35 -07:00
d157be9a18 Made warn() work like error() with provided message. 2017-04-21 20:04:27 -07:00
Cedric Beust
49e69d0964 Merge branch 'master' of github.com:cbeust/kobalt 2017-04-21 12:17:34 -07:00
Cedric Beust
1342428eb0 Reformat. 2017-04-20 11:17:28 -07:00
Cedric Beust
e1c1da55c6 Fix duplication of parameters. 2017-04-20 11:17:23 -07:00
Cedric Beust
1d015a6f93 1.0.72. 2017-04-19 11:16:28 -07:00
Cedric Beust
43844cbf80 Fix class path look up in kapt3. 2017-04-19 11:16:05 -07:00
Cedric Beust
5bcb8185b8 Refactor. 2017-04-19 11:14:34 -07:00
Cedric Beust
abc9002292 1.0.71. 2017-04-19 08:29:01 -07:00
Cedric Beust
35fe4f6494 Add tools.jar on the annotation plug-in classpath. 2017-04-19 08:20:02 -07:00
Cedric Beust
1febd47368 Better JAVA_HOME detection. 2017-04-19 08:19:46 -07:00
Cedric Beust
3686c4e110 1.0.70. 2017-04-18 20:02:08 -07:00
Cedric Beust
5d03544e31 GH-417: Don’t run abstract test classes with JUnit 4.
Fixes https://github.com/cbeust/kobalt/issues/417
2017-04-18 20:01:43 -07:00
Cedric Beust
104e71335e Read the apt() dependency correctly. 2017-04-18 08:36:17 -07:00
Cedric Beust
37709b571c Inject the Jvm object. 2017-04-18 08:16:13 -07:00
Cedric Beust
dc1ebfb15d Don’t display tasks if the build file can’t be compiled. 2017-04-17 18:54:37 -07:00
Cedric Beust
fd58ed58e4 1.0.69. 2017-04-17 17:47:24 -07:00
Cedric Beust
da332b1716 Don’t use variants for apt. 2017-04-17 17:46:56 -07:00
Cedric Beust
007e616e7f 1.0.68. 2017-04-17 16:43:06 -07:00
Cedric Beust
b331672c3d Fix nowarn. 2017-04-17 16:30:25 -07:00
Cedric Beust
9e1c9bd87b Add support for kapt3. 2017-04-17 16:27:12 -07:00
Cedric Beust
afacd86267 GH-409: Run —update or —server even if the build file is incorrect.
Fixes https://github.com/cbeust/kobalt/issues/409
2017-04-17 09:27:17 -07:00
Cedric Beust
e11bdfa2b9 1.0.67. 2017-04-17 08:40:15 -07:00
Cedric Beust
0938bcc3bf GH-413: Duplicate compilation.
Fixes https://github.com/cbeust/kobalt/pull/413
2017-04-17 08:38:53 -07:00
Cedric Beust
dcdbbdc6c3 Merge pull request #413 from dmitry-zhuravlev/master
+ server should send buildFileClasspath to plugin. close #410
2017-04-17 08:26:04 -07:00
Dmitry Zhuravlev
5720356814 + added cleanup for buildFileClasspath collection
+ added FIXME: newBuildFileClasspath called twice
2017-04-17 12:30:12 +03:00
Dmitry Zhuravlev
6d46ba2d0e Merge branch 'master' of https://github.com/cbeust/kobalt 2017-04-17 11:49:15 +03:00
Cedric Beust
e9b8212dbd Fix build. 2017-04-16 20:30:44 -07:00
Cedric Beust
6816ba8a3b Sanitize repo names from repos(). 2017-04-16 20:13:28 -07:00
Cedric Beust
a7006d5cd7 kapt3 work. 2017-04-16 19:21:50 -07:00
Cedric Beust
cbb02e7615 1.0.66. 2017-04-16 19:08:22 -07:00
Cedric Beust
4f9c5f383e 1.0.65. 2017-04-16 18:53:01 -07:00
Cedric Beust
822a9701a6 Fix broken TestNG dependency. 2017-04-16 18:24:26 -07:00
Cedric Beust
30e71afbc8 1.0.64. 2017-04-15 08:09:09 -07:00
Cedric Beust
85460422e0 GH-414: Authenticated repos not working.
Fixes https://github.com/cbeust/kobalt/issues/414
2017-04-15 08:09:09 -07:00
Cedric Beust
1fb984ff63 1.0.63. 2017-04-15 08:09:09 -07:00
Cedric Beust
9f93f0ca6e Merge pull request #415 from ethauvin/newest
Fix for OSX and calling outsite of residing directory
2017-04-14 23:44:44 -07:00
876420b434 Fix for OSX and calling outsite of residing directory. 2017-04-14 22:45:37 -07:00
Cedric Beust
49bdec673e Merge branch 'master' of github.com:cbeust/kobalt 2017-04-14 15:40:21 -07:00
Cedric Beust
e45e93cee8 1.0.62. 2017-04-14 12:24:27 -07:00
Cedric Beust
c4813880ac Comment. 2017-04-14 12:15:55 -07:00
Cedric Beust
f4a5d188e7 Use AssertionErrors in tests. 2017-04-14 12:15:50 -07:00
Cedric Beust
19dc26ac16 Make sure the zip entries start with kobalt-${version}. 2017-04-14 12:15:01 -07:00
Cedric Beust
2b3fc7a2c9 Fix the zip task. 2017-04-14 12:14:43 -07:00
Cedric Beust
91260d2f57 Not used. 2017-04-14 11:22:59 -07:00
Dmitry Zhuravlev
7a63f88ba5 Merge branch 'master' of https://github.com/cbeust/kobalt 2017-04-14 17:19:59 +03:00
Dmitry Zhuravlev
5d11395b7c + server should send buildFileClasspath to plugin. close #410 2017-04-14 17:18:16 +03:00
Cedric Beust
581b3de13e Refactor. 2017-04-14 07:07:47 -07:00
Cedric Beust
8bd098c458 Fix Windows tests. 2017-04-14 07:07:17 -07:00
Cedric Beust
5ddc370521 1.0.61. 2017-04-13 09:55:34 -07:00
Cedric Beust
fad6af29ee Merge branch 'master' of github.com:cbeust/kobalt 2017-04-12 17:00:07 -07:00
Cedric Beust
0e381912f7 Merge pull request #411 from dmitry-zhuravlev/master
* package all Kobalt sources in zip distribution. relates to #237
2017-04-12 16:59:22 -07:00
Cedric Beust
90df943ec3 Merge branch 'master' of github.com:cbeust/kobalt 2017-04-12 16:50:46 -07:00
Dmitry Zhuravlev
a9db9bb28a * package all Kobalt sources in zip distribution. relates to #237 2017-04-12 15:50:53 +03:00
Cedric Beust
68163731d6 Refactor. 2017-04-11 19:14:43 -07:00
Cedric Beust
3615d802b7 Merge pull request #408 from ethauvin/master
Ensured inputStream.copyTo() is automatically closed.
2017-04-11 18:46:21 -07:00
a48d091fa5 Ensured inputStream.copyTo() is automatically closed. 2017-04-11 17:10:20 -07:00
Cedric Beust
623d106e3c Forgot build file. 2017-04-11 16:28:53 -07:00
Cedric Beust
c195a7bdf7 Use commons-compress fast archive. 2017-04-11 15:58:52 -07:00
Cedric Beust
46f73ee5e7 Fix test. 2017-04-11 12:18:35 -07:00
Cedric Beust
52fe283583 Not used. 2017-04-11 11:44:29 -07:00
Cedric Beust
af5217966f Better range resolution. 2017-04-11 11:44:09 -07:00
Cedric Beust
77b7e3f5be Improve template. 2017-04-11 11:15:22 -07:00
Cedric Beust
49d058e3e1 GH-403: Honor Kotlin compiler flags in process.
Fixes https://github.com/cbeust/kobalt/issues/403
2017-04-11 10:50:24 -07:00
Cedric Beust
2e6f14007a 1.0.56. 2017-04-11 10:50:24 -07:00
Cedric Beust
367b4a9e3d Merge pull request #405 from ethauvin/master
Made sure kobaltw (dist) is executable on non-Windows platforms.
2017-04-11 05:54:25 -07:00
0f88993424 Made sure kobaltw in ~/.kobalt/wrapper/dist/ is executable on non-Windows platforms. 2017-04-10 23:23:18 -07:00
Cedric Beust
2966575073 Merge pull request #404 from ethauvin/master
Added test to check if kobaltw is executable (*nix only.)
2017-04-10 22:32:35 -07:00
54a38c22db Used OperatingSystem.current() instead of getting system property. 2017-04-10 22:31:31 -07:00
c737fc9a00 Added test to check if kobaltw is executable (*nix only.) 2017-04-10 21:10:34 -07:00
Cedric Beust
d710362af1 Merge pull request #397 from ethauvin/master
Implementation of compileOnly
2017-04-10 13:44:27 -07:00
Cedric Beust
452820e728 Log. 2017-04-09 10:32:42 -07:00
Cedric Beust
b84586261c 1.0.59. 2017-04-09 09:52:22 -07:00
Cedric Beust
a20b16da44 Extract TestNG results and show them in the final report. 2017-04-09 09:37:36 -07:00
Cedric Beust
ffd641310d Format correctly. 2017-04-09 00:40:17 -07:00
Cedric Beust
6401a9d2af Bubble up test result messages. 2017-04-08 19:27:19 -07:00
Cedric Beust
197d576440 Merge branch 'master' of github.com:cbeust/kobalt 2017-04-08 11:12:06 -07:00
Cedric Beust
f276eb3001 Merge pull request #400 from rhencke/reduceJarAssemblyTime
Reduce time spent in JAR/ZIP assembly.
2017-04-08 11:12:01 -07:00
Cedric Beust
c9e61e49a9 Any nonexistent version will cause Kobalt to use local build directories.
Relaxes the restriction for that version to be +1.
2017-04-08 11:08:17 -07:00
Robert Hencke
713faa7a3f Reduce time spent in JAR/ZIP assembly.
Locally, this reduces a run of kobaltw assemble --noIncremental
on the Kobalt codebase itself from 47 seconds to 25 seconds.

When JarInputStream.nextEntry is invoked, the stream sets its position
and length so that it can directly be used to read the underlying content
associated with the entry.  This avoids the need to call
JarFile(localFile).getInputStream(entry) and the cost associated with it.

addEntry has a slight change of semantics due to this change - it is now
the caller's responsibility to close the associated input stream.  The two
existing calls to the method were adjusted accordingly.
2017-04-08 13:11:41 -04:00
Cedric Beust
f7cb803edc Typo. 2017-04-08 09:29:27 -07:00
Cedric Beust
ebf272bf98 Upload kobalt-wrapper to bintray too. 2017-04-08 07:53:45 -07:00
Cedric Beust
821752bdb9 1.0.58. 2017-04-07 19:39:36 -07:00
Cedric Beust
5fac88b1f7 GH-391: "provided" dependencies are no longer used to compile.
Fixes https://github.com/cbeust/kobalt/issues/391
2017-04-07 19:39:21 -07:00
5f8021334a Beginning implementation of compileOnly. 2017-04-07 19:37:48 -07:00
Cedric Beust
9db54e24e4 No longer used. 2017-04-07 19:12:51 -07:00
Cedric Beust
8aa122f007 1.0.57. 2017-04-07 19:09:13 -07:00
Cedric Beust
cb7a8a5fb8 GH-393: run now runs from the project's directory.
Fixes https://github.com/cbeust/kobalt/issues/393
2017-04-07 19:06:48 -07:00
Cedric Beust
a50d349fd6 Merge branch 'master' of github.com:cbeust/kobalt 2017-04-07 15:26:53 -07:00
Cedric Beust
51090ad8b4 Tests for optional dependencies. 2017-04-07 15:26:11 -07:00
Cedric Beust
7e6c68c689 Fix test. 2017-04-07 15:19:17 -07:00
Cedric Beust
40ab79456b Name for the filter. 2017-04-07 15:16:53 -07:00
Cedric Beust
9c73bc717a Not used. 2017-04-07 15:15:42 -07:00
Cedric Beust
dca28669d1 1.0.55. 2017-04-07 12:29:15 -07:00
Cedric Beust
e19b3472a7 GH-392: Make collect() return both File and id.
Fixes https://github.com/cbeust/kobalt/issues/392
2017-04-07 12:29:10 -07:00
Cedric Beust
5ae20fb253 JUnit 5 dependencies. 2017-04-07 11:44:18 -07:00
Cedric Beust
d2ee2f7b4c Typo. 2017-04-07 11:42:33 -07:00
Cedric Beust
33dafe6cd0 Initial support for JUnit 5. 2017-04-07 11:42:29 -07:00
Cedric Beust
5768fb24db Dependencies can be empty. 2017-04-07 11:41:43 -07:00
Cedric Beust
9049ed8048 GH-336: Typo.
Fixes https://github.com/cbeust/kobalt/issues/336
2017-04-06 14:12:14 -07:00
Cedric Beust
b3fd191111 1.0.54. 2017-04-06 13:36:42 -07:00
Cedric Beust
49fd5db117 GH-383: provided() dependencies should not be included in the far jat.
Fixes https://github.com/cbeust/kobalt/issues/383
2017-04-06 13:36:36 -07:00
Cedric Beust
11d3b9fd8e Formatting. 2017-04-06 12:56:49 -07:00
Cedric Beust
0cbf9197e9 Clean up. 2017-04-06 12:55:48 -07:00
Cedric Beust
b0e823958b InstallTest and BuildFilesTest. 2017-04-06 12:51:54 -07:00
Cedric Beust
f83bdfe3b2 Remove unnecessary @Guice. 2017-04-06 12:12:56 -07:00
Cedric Beust
ba98592f49 Tests can now run full builds. 2017-04-06 11:31:05 -07:00
Cedric Beust
24d902bfbf Restructure the entry point for easier testing. 2017-04-06 10:52:17 -07:00
Cedric Beust
f2297fcfc3 Remote the “update” task.
We already have —update.
2017-04-06 10:08:10 -07:00
Cedric Beust
ae99bb6de5 1.0.53. 2017-04-06 09:59:27 -07:00
Cedric Beust
69560ca571 Fixes kotlinCompiler { version = … }
Fixes https://github.com/cbeust/kobalt/issues/317
2017-04-06 09:59:09 -07:00
Cedric Beust
03d4ca3861 Not necessary. 2017-04-06 09:43:16 -07:00
Cedric Beust
43338c2946 1.0.52. 2017-04-06 09:40:46 -07:00
Cedric Beust
38d2187eae Fix copy().
Fixes https://github.com/cbeust/kobalt/issues/387
2017-04-06 09:39:21 -07:00
Cedric Beust
94400756ff Merge pull request #390 from ethauvin/master
Added test for CR line endings (DOS) in kobaltw.
2017-04-05 20:12:14 -07:00
d108589185 Added test for CR line endings (DOS) in kobaltw. 2017-04-05 18:15:14 -07:00
Cedric Beust
2e3ca3bb24 Fix build. 2017-04-05 16:44:00 -07:00
Cedric Beust
0ba9efc022 Renamed libDir to target. 2017-04-05 16:08:12 -07:00
Cedric Beust
edb9370988 copy() now takes a From as first parameter. 2017-04-05 16:08:01 -07:00
Cedric Beust
856b61678d 1.0.51. 2017-04-05 14:48:53 -07:00
Cedric Beust
59d6120412 collect() returns a list of File. 2017-04-05 14:48:43 -07:00
Cedric Beust
f93fee2d8c 1.0.50. 2017-04-05 14:12:51 -07:00
Cedric Beust
9514d80b99 Introducing the copy() directive for installation.
Example use:

    install {
        collect(compileDependencies).map {
            copy(it, to("deploy"))
        }
    }
2017-04-05 14:11:30 -07:00
Cedric Beust
756fbec648 Test helper. 2017-04-04 16:28:09 -07:00
Cedric Beust
93408cda52 Fix tests. 2017-04-04 13:53:12 -07:00
Cedric Beust
a1bea1124d Build fix. 2017-04-04 11:13:15 -07:00
Cedric Beust
c691709a53 Reformat. 2017-04-04 10:50:20 -07:00
Cedric Beust
abab841119 Logs. 2017-04-04 10:50:10 -07:00
Cedric Beust
18f1df454e Fix DependencyManagerTest. 2017-04-04 10:50:02 -07:00
Cedric Beust
886b7a4bfa include() for install{}. 2017-04-04 10:49:48 -07:00
Cedric Beust
789c969a9b GITHUB-382: Expose Project.collect() to gather dependencies in the build file.
Fixes https://github.com/cbeust/kobalt/issues/382
2017-04-03 11:02:45 -07:00
Cedric Beust
570f9a0bb7 1.0.48. 2017-04-03 10:23:04 -07:00
Cedric Beust
646a84323b GITHUB-IDEA-77: Don’t close the web socket.
Fixes https://github.com/cbeust/kobalt-intellij-plugin/issues/77.
2017-04-03 10:22:48 -07:00
Cedric Beust
57656a59c8 1.0.47 2017-04-03 10:07:00 -07:00
Cedric Beust
0f7bb021c3 Refactor parameter extraction. 2017-04-03 10:00:18 -07:00
Cedric Beust
bb2eb19876 Refactor some downloadSources code. 2017-04-03 09:54:26 -07:00
Cedric Beust
1c27b9f1e4 Merge pull request #374 from dmitry-zhuravlev/master
* download sources property propagation. relates to #372
2017-04-03 09:47:44 -07:00
Cedric Beust
9b31a87f1f 1.0.46. 2017-04-03 09:45:01 -07:00
Cedric Beust
f8fbcb912c Remove the random repo number hack.
Fixes https://github.com/cbeust/kobalt/issues/385
2017-04-03 09:44:48 -07:00
Cedric Beust
ed9c4e6636 Use the default jar file if no Main-Class attribute was found.
Fixes https://github.com/cbeust/kobalt/issues/384
2017-04-03 09:33:00 -07:00
Dmitry Zhuravlev
c54d4c5b2b * fix sources and javadoc resolution. relates to #372 2017-04-03 12:50:02 +03:00
Dmitry Zhuravlev
23bbcd4d84 * merge 2017-04-03 12:13:49 +03:00
Cedric Beust
c5405177b5 1.0.45. 2017-04-01 13:43:09 -07:00
Cedric Beust
b011abc13b Resolve snapshot repos correctly.
Fixes https://github.com/cbeust/kobalt/issues/377.
2017-04-01 13:42:09 -07:00
Cedric Beust
53924366ba Forgot a change. 2017-04-01 06:30:03 -07:00
Cedric Beust
b3ce6db1da Use injection for isDev. 2017-04-01 06:22:17 -07:00
Cedric Beust
a749dbf9b6 Merge pull request #380 from ethauvin/master
Disable release version check if --dev
2017-04-01 06:09:47 -07:00
1610677a94 Disable release version check if --dev 2017-03-31 23:24:16 -07:00
Cedric Beust
841bc6d4eb Merge pull request #378 from ethauvin/master
Latest version check now defaults to current version.
2017-03-31 19:28:10 -07:00
af9289ad7f Latest version check now defaults to current version. 2017-03-31 18:27:40 -07:00
Cedric Beust
0c8a7991de Merge pull request #376 from ethauvin/master
Only check latest release version number on GitHub every 10 minutes
2017-03-31 18:09:12 -07:00
c342573e55 Only check for the latest release version number on GitHub every 10 minutes. 2017-03-31 17:11:20 -07:00
Cedric Beust
6409e723cb Merge pull request #375 from ethauvin/master
Added support for --log 0 on --update
2017-03-31 15:07:11 -07:00
1be27833c6 Added support for --log 0 on --update 2017-03-31 14:28:47 -07:00
Cedric Beust
81cbdad9a0 1.0.44. 2017-03-31 11:12:57 -07:00
Cedric Beust
4ea4f0a58c Return buildContentRoots to the plug-in. 2017-03-31 11:12:41 -07:00
Cedric Beust
a6836fbd79 Surface the new build directories to expose them to the IDEA plug-in. 2017-03-31 10:56:30 -07:00
Cedric Beust
a2e197959d 1.0.43. 2017-03-31 09:20:14 -07:00
Cedric Beust
bfa2fb072e Fix: the sources don’t get downloaded if the jar file is present. 2017-03-31 09:19:37 -07:00
Cedric Beust
ebedb8546a 1.0.42. 2017-03-31 08:53:43 -07:00
Cedric Beust
851cf55bfe Fix Build.kt being deleted when upgrading to a new version. 2017-03-31 08:53:31 -07:00
Dmitry Zhuravlev
b9a3a4f40b * fix sources and javadoc resolution. relates to #372 2017-03-31 18:31:20 +03:00
Dmitry Zhuravlev
6b3383ba72 * download sources property propagation. relates to #372 2017-03-31 16:47:47 +03:00
Cedric Beust
ba1d8f30b0 Clarify template use. 2017-03-30 19:16:18 -07:00
Cedric Beust
c7e3d62228 Refactor. 2017-03-30 18:08:23 -07:00
Cedric Beust
ff29413bb8 Comment. 2017-03-30 18:04:45 -07:00
Cedric Beust
255e17d88b BlockExtractorTest. 2017-03-30 15:12:35 -07:00
Cedric Beust
9f249822ba 1.0.41. 2017-03-30 14:03:48 -07:00
Cedric Beust
f29c974c49 Run the correct jar name, even if its name was changed.
Fixes https://github.com/cbeust/kobalt/issues/355
2017-03-30 14:03:37 -07:00
Cedric Beust
904c405dd7 1.0.40. 2017-03-30 13:29:40 -07:00
Cedric Beust
1730e8de69 Add -downloadSources. 2017-03-30 13:29:25 -07:00
Cedric Beust
79c01b1149 1.0.38. 2017-03-30 13:16:43 -07:00
Cedric Beust
fe8780cc1f Not used. 2017-03-30 13:16:22 -07:00
Cedric Beust
a7553279cf Fix the topLines bug. 2017-03-30 13:16:17 -07:00
Cedric Beust
da85ec31f1 Rename. 2017-03-30 13:00:25 -07:00
Cedric Beust
7b6774f7bc 1.0.37. 2017-03-30 12:30:47 -07:00
Cedric Beust
5b24ada976 Fix missing build file. 2017-03-30 12:30:32 -07:00
Cedric Beust
ed5d4bfcbc 1.0.36. 2017-03-30 12:04:01 -07:00
Cedric Beust
af5eb04e4b Force update if autoUpdate is true. 2017-03-30 12:03:48 -07:00
Cedric Beust
7440048cfc 1.0.35. 2017-03-30 11:58:38 -07:00
Cedric Beust
b354b42767 Better error message. 2017-03-30 11:58:27 -07:00
Cedric Beust
fca974779d 1.0.34. 2017-03-30 11:49:50 -07:00
Cedric Beust
dee55652f9 Comment. 2017-03-30 11:49:40 -07:00
Cedric Beust
0aae394975 Fix build path. 2017-03-30 11:49:26 -07:00
Cedric Beust
577c81a15a 1.0.33. 2017-03-30 11:04:38 -07:00
Cedric Beust
c3c43613a8 Fix the silly cycle. 2017-03-30 10:40:47 -07:00
Cedric Beust
d712a14405 Logging. 2017-03-30 10:13:48 -07:00
Cedric Beust
b3efc12569 autoUpdate setting. 2017-03-30 10:13:41 -07:00
Cedric Beust
0178500bf8 Comment. 2017-03-30 10:02:47 -07:00
Cedric Beust
6a61b21482 Create the directory. 2017-03-30 10:02:42 -07:00
Cedric Beust
8e46cdb83b Extract some logic into Profiles. 2017-03-30 09:55:25 -07:00
Cedric Beust
6694426eef Fix BuildSources. 2017-03-30 09:55:07 -07:00
Cedric Beust
f9d647f947 Fix tests. 2017-03-30 09:19:15 -07:00
Cedric Beust
2fda71682f Fix tests. 2017-03-29 16:18:26 -07:00
Cedric Beust
b58c495bbd Test for existence. 2017-03-29 15:57:57 -07:00
Cedric Beust
397b60b60a Filter non existent source directory. 2017-03-29 15:52:28 -07:00
Cedric Beust
8eb804f486 Reformat 2017-03-29 15:41:54 -07:00
Cedric Beust
4ad0222f0a Multiple build file work. 2017-03-29 15:41:48 -07:00
Cedric Beust
5b2d4296dc Correct inclusion. 2017-03-29 13:51:12 -07:00
Cedric Beust
8dadbd391a Rewriting build file parsing logic. 2017-03-29 13:51:12 -07:00
Cedric Beust
9c8f13cc28 Merge pull request #370 from ethauvin/master
Disabled TestNG output on --log 0
2017-03-29 11:22:53 -07:00
6ce6cbbe14 Disabled TestNG output on --log 0 2017-03-29 11:19:24 -07:00
Cedric Beust
ae85bd3756 Merge pull request #369 from dmitry-zhuravlev/master
+ Implement handling of profiles param. Will close cbeust/kobalt-intellij-plugin#73
2017-03-29 07:06:50 -07:00
Dmitry Zhuravlev
e3dee44ad2 + Implement handling of profiles param. Will close cbeust/kobalt-intellij-plugin#73 2017-03-29 12:55:29 +03:00
Cedric Beust
e47721c2b6 Merge pull request #368 from ethauvin/master
Implemented --log 0
2017-03-28 20:54:51 -07:00
Cedric Beust
2c7241f195 Instructions for multi build file algorithm. 2017-03-28 19:13:12 -07:00
d605b4a132 Merge with beust/kobalt. 2017-03-28 17:25:47 -07:00
014802e272 Implemented --log 0 2017-03-28 17:16:11 -07:00
Cedric Beust
350b471460 Multi build work. 2017-03-28 10:12:49 -07:00
a6e8dbabb1 Merge remote-tracking branch 'upstream/master' 2017-03-28 09:52:06 -07:00
Cedric Beust
33844b616e Merge pull request #363 from ethauvin/master
file:// no longer considered valid maven coordinates
2017-03-28 09:16:58 -07:00
726ddc37d5 Merge remote-tracking branch 'upstream/master' 2017-03-27 21:53:40 -07:00
Cedric Beust
34a544febd Not needed. 2017-03-27 16:07:28 -07:00
Cedric Beust
4b5a7c3093 Clean up ParsedBuildFile. 2017-03-27 16:04:55 -07:00
Cedric Beust
43bc211b2e Better logging. 2017-03-27 16:04:29 -07:00
Cedric Beust
e4d883890d Don’t generate preBuildScript.jar if no buildScript{}. 2017-03-27 15:45:25 -07:00
Cedric Beust
76fdd1543a Rephrase. 2017-03-27 15:44:57 -07:00
Cedric Beust
32dc14e393 toString() 2017-03-27 15:44:47 -07:00
Cedric Beust
b62dc25f8b No longer needed. 2017-03-27 15:44:40 -07:00
Cedric Beust
b3585f48cb No longer used 2017-03-27 15:19:10 -07:00
Cedric Beust
148a75d994 .gitignore. 2017-03-27 15:14:18 -07:00
Cedric Beust
1b2e25991f Silly file was being gitignored. 2017-03-27 15:14:06 -07:00
Cedric Beust
19a782d62a Revert "Allow ParallelLogger to log from apply()."
This reverts commit 67dd7e54e9.
2017-03-27 15:06:25 -07:00
Cedric Beust
ccbfe3bd94 Preliminary work for multiple build files. 2017-03-27 14:54:51 -07:00
Cedric Beust
2478040bff 1.0.32. 2017-03-27 10:54:02 -07:00
Cedric Beust
639945bf2f 1.0.31. 2017-03-27 10:50:24 -07:00
Cedric Beust
9eeba66c3f More flexible option parsing.
Fixes https://github.com/cbeust/kobalt/issues/362
2017-03-27 10:49:23 -07:00
Cedric Beust
ba24de7d08 More flexible option parsing. 2017-03-27 09:53:24 -07:00
f6274df9d0 Added isMavenId() tests. 2017-03-26 20:11:58 -07:00
6932b9f017 Fixed imports. 2017-03-26 19:13:23 -07:00
ddb4b3dbd8 file:// no longer seen as valid maven coordinates. 2017-03-26 19:13:22 -07:00
Cedric Beust
096b2c20a4 In the correct module. 2017-03-26 18:43:49 -07:00
Cedric Beust
a578b70c8b First pass at better option management. 2017-03-26 17:10:50 -07:00
Cedric Beust
09b47a9674 Merge pull request #361 from ethauvin/master
Updated to testng 6.11
2017-03-26 12:53:25 -07:00
Cedric Beust
74a5a677c1 1.0.30. 2017-03-26 12:45:00 -07:00
Cedric Beust
fd5f77d922 CheckVersions fix attempt. 2017-03-26 12:44:45 -07:00
fae512f639 Updated to testng 6.11 2017-03-26 12:21:48 -07:00
Cedric Beust
f7673cba46 1.0.29. 2017-03-26 11:46:25 -07:00
Cedric Beust
c6ce58fdbd Make sure Versions.class is not in the jar file. 2017-03-26 11:46:11 -07:00
Cedric Beust
1d6a0ba1ca Refactor. 2017-03-26 11:43:22 -07:00
Cedric Beust
f9206efaa0 Improve --checkVersions. 2017-03-26 10:45:10 -07:00
Cedric Beust
981bbbacb6 Normalize. 2017-03-26 10:18:45 -07:00
Cedric Beust
2a7775529d Fix log line. 2017-03-26 10:18:36 -07:00
Cedric Beust
67dd7e54e9 Allow ParallelLogger to log from apply(). 2017-03-26 10:18:27 -07:00
Cedric Beust
93d3d8ad53 1.0.28. 2017-03-26 09:58:11 -07:00
Cedric Beust
8f99f81bc0 Clean generated directory in AptPlugin.
Fixes https://github.com/cbeust/kobalt/issues/357.
2017-03-26 09:57:54 -07:00
Cedric Beust
01fc80c904 1.0.27. 2017-03-26 07:36:10 -07:00
Cedric Beust
043fc31c9f /v1/getDependencyGraph?projectRoot=...
Deprecated buildFile=.
2017-03-26 07:32:56 -07:00
Cedric Beust
5c7d6a20cb 1.0.26. 2017-03-25 14:25:18 -07:00
Cedric Beust
abd84ca386 Don't compile with kobaltBuild/classes on the classpath. 2017-03-25 14:25:02 -07:00
Cedric Beust
ea7cecf590 Test fix. 2017-03-25 13:30:03 -07:00
Cedric Beust
e7d369408f Fix test. 2017-03-25 13:27:30 -07:00
Cedric Beust
35648cf740 1.0.25. 2017-03-25 13:21:05 -07:00
Cedric Beust
152ff7e91b Rename. 2017-03-25 13:20:59 -07:00
Cedric Beust
6974e6cdb2 Backward compatibility. 2017-03-25 13:09:20 -07:00
Cedric Beust
86c166ff76 New profile syntax: val debug by profile() 2017-03-25 12:45:59 -07:00
Cedric Beust
8a8b5f638d Make --server work even if there is no Build.kt.
Fixes https://github.com/cbeust/kobalt-intellij-plugin/issues/69.
2017-03-25 07:14:10 -07:00
Cedric Beust
4e4c5a7d9e Put the javac command in a file.
Also introduce fixSlashes().
2017-03-24 23:42:41 -07:00
Cedric Beust
771f90332c Reformat. 2017-03-24 23:42:08 -07:00
Cedric Beust
913360c504 Merge pull request #349 from ethauvin/master
Properly handle symlink
2017-03-24 20:55:31 -07:00
03f957f001 Fixed variable name. 2017-03-24 20:54:02 -07:00
3acf5dc2ad Install launcher(s) if not found. 2017-03-24 18:27:44 -07:00
c83d0b3710 Merge remote-tracking branch 'upstream/master' 2017-03-24 18:26:32 -07:00
Cedric Beust
b2d6b9a2e3 New line. 2017-03-24 15:17:06 -07:00
Cedric Beust
e49fd94392 You don’t belong here. 2017-03-24 15:16:50 -07:00
Cedric Beust
335e99b167 Better location for the error. 2017-03-24 14:14:59 -07:00
Cedric Beust
37200ffcf2 Build fix. 2017-03-24 13:54:45 -07:00
Cedric Beust
583c489632 1.0.23. 2017-03-24 13:52:55 -07:00
Cedric Beust
0bdc071dcf Added dependsOn(). 2017-03-24 13:52:41 -07:00
Cedric Beust
3476a9b0c6 Rename for consistency. 2017-03-24 13:47:55 -07:00
Cedric Beust
9aa1f68af6 1.0.22. 2017-03-24 13:33:08 -07:00
Cedric Beust
eaaa6fbcef Fix the “empty source” bug in KobaltServer.
The plug-in needs to send the root of the project, but for now, calculating it from the path of the build file.
2017-03-24 13:31:33 -07:00
Cedric Beust
43346a256d Better sequence. 2017-03-24 12:26:25 -07:00
Cedric Beust
f788761e4c Better zip file test. 2017-03-23 14:34:39 -07:00
Cedric Beust
469419fe2e Fix zip test. 2017-03-23 12:23:02 -07:00
cf4013af89 Fix for GYGWIN 2017-03-23 11:08:52 -07:00
720e32aa07 Merge remote-tracking branch 'upstream/master' 2017-03-23 11:07:29 -07:00
Cedric Beust
400a73b51b Test StringVersion sorting. 2017-03-23 10:19:55 -07:00
d318f0a7b4 Properly handle symlink 2017-03-23 01:36:22 -07:00
Cedric Beust
18e61fc7a3 Fix tests for Windows. 2017-03-22 22:22:30 -07:00
Cedric Beust
ed34482aac 1.0.21. 2017-03-22 14:12:36 -07:00
Cedric Beust
873aea5d5f Refactor. 2017-03-22 14:12:07 -07:00
Cedric Beust
6c16c59aa6 Disable new runner for now. 2017-03-22 10:37:52 -07:00
Cedric Beust
3b83d8d5d9 More remote runners. 2017-03-22 09:36:43 -07:00
Cedric Beust
c7714a5286 Better StringVersion. 2017-03-22 09:26:24 -07:00
Cedric Beust
71d4cce999 1.0.20. 2017-03-21 23:55:00 -07:00
Cedric Beust
850e826d7f Forgot a dependency. 2017-03-21 23:48:12 -07:00
Cedric Beust
47bdbf04ee Distinct. 2017-03-21 23:48:03 -07:00
Cedric Beust
8b192e31bf Merge branch 'master' of github.com:cbeust/kobalt 2017-03-21 17:49:06 -07:00
Cedric Beust
25df7bed38 Logs. 2017-03-21 16:55:59 -07:00
Cedric Beust
f486bfbd93 Refactor. 2017-03-21 16:49:26 -07:00
Cedric Beust
64df5ea8df Forgot the repo. 2017-03-21 16:34:46 -07:00
Cedric Beust
b68ec28050 Colors. 2017-03-21 16:32:20 -07:00
Cedric Beust
34185a6b2a Exclude tests that crash on TeamCity. 2017-03-21 14:38:43 -07:00
Cedric Beust
da3ad60423 1.0.19. 2017-03-21 13:19:43 -07:00
Cedric Beust
a4282b299a Added kobaltOptions(). 2017-03-21 13:19:21 -07:00
Cedric Beust
c43967bec9 Preserve dependency order. 2017-03-21 12:05:28 -07:00
Cedric Beust
dbb06d0e79 Added test dependent projects. 2017-03-21 10:06:25 -07:00
Cedric Beust
de6b7afb61 Remove javaProject/kotlinProject. 2017-03-21 10:06:25 -07:00
Cedric Beust
461681cbed Merge branch 'master' of github.com:cbeust/kobalt 2017-03-20 19:14:39 -07:00
Cedric Beust
aaaeedb981 Enabled. 2017-03-20 19:13:07 -07:00
Cedric Beust
648bb383ad Indent. 2017-03-20 19:09:53 -07:00
Cedric Beust
bdb8f5988d Merge pull request #347 from ethauvin/master
Fixed jGit complaining and not tagging if setAnnotated(false)
2017-03-20 18:44:59 -07:00
38beb02c2f Fixed jGit complaining and not tagging if setAnnotated(false) 2017-03-20 18:33:07 -07:00
Cedric Beust
0b318520ee 1.0.18. 2017-03-20 16:06:04 -07:00
Cedric Beust
f4b57167b0 Exclusion tests. 2017-03-20 15:56:27 -07:00
Cedric Beust
7867541921 Log 2017-03-20 15:32:16 -07:00
Cedric Beust
49b66b7420 Regex match exclusions. 2017-03-20 15:30:00 -07:00
Cedric Beust
229e0b8f36 Include global excludes. 2017-03-20 15:05:42 -07:00
Cedric Beust
934ffb01f5 Clean TestNGRunner. 2017-03-20 14:49:22 -07:00
Cedric Beust
61bc02b04b Indent. 2017-03-20 14:49:15 -07:00
Cedric Beust
a9bba0d83b Better dependency exclusion. 2017-03-20 14:49:11 -07:00
Cedric Beust
4911677bc1 Better ResolveDependency. 2017-03-20 12:04:57 -07:00
Cedric Beust
0de3327b05 Adjust Build.kt. 2017-03-20 09:55:25 -07:00
Cedric Beust
7f6a39ecfa Fix build. 2017-03-19 09:41:26 -07:00
Cedric Beust
a3734f88c3 TestNG runner work in progress. 2017-03-19 09:06:26 -07:00
Cedric Beust
3ee309fa37 1.0.17. 2017-03-18 23:42:19 -07:00
Cedric Beust
fd73594767 1.0.16. 2017-03-18 23:18:42 -07:00
Cedric Beust
43b037171c Reformat. 2017-03-18 23:18:01 -07:00
Cedric Beust
3bdc83b20e Fix test path for Windows. 2017-03-18 23:17:48 -07:00
Cedric Beust
6a50e01ebc warn() to log(). 2017-03-18 23:10:41 -07:00
Cedric Beust
d777ca20cb Change warn() to log(). 2017-03-18 23:09:28 -07:00
Cedric Beust
b21d867ec2 Warning. 2017-03-18 23:09:04 -07:00
Cedric Beust
af8c5c7d56 Merge pull request #346 from ethauvin/master
Renamed auto paramter to enabled for autoGitTag directive.
2017-03-18 14:10:54 -07:00
17bd4a0cec Renamed auto paramter to enabled for autoGitTag directive. 2017-03-18 11:32:14 -07:00
Cedric Beust
4e432e2e77 Merge pull request #345 from ethauvin/master
Added annotated directive to autoGitTag.
2017-03-18 09:59:09 -07:00
792fa88674 Added annotated directive to autoGitTag. 2017-03-18 00:45:06 -07:00
Cedric Beust
c6e15739e8 1.0.15. 2017-03-17 23:16:29 -07:00
Cedric Beust
e4bf002fce Update build. 2017-03-17 23:16:17 -07:00
Cedric Beust
5efd7a760a 1.0.14. 2017-03-17 14:04:32 -07:00
Cedric Beust
ebe475c997 Fix test-output. 2017-03-17 14:04:32 -07:00
Cedric Beust
12c4a84160 Merge branch 'master' of github.com:cbeust/kobalt 2017-03-16 21:51:05 -07:00
Cedric Beust
02beb62195 Warnings. 2017-03-16 21:50:04 -07:00
Cedric Beust
2015e03ca0 Merge pull request #342 from ethauvin/master
Added parameters to autoGitTag directive.
2017-03-16 21:49:37 -07:00
49538338a4 Refactored duplicate code. 2017-03-16 19:22:28 -07:00
c80020c36a Added AutoGitTagConfig. 2017-03-16 19:19:40 -07:00
4f32f0ba2f Added parameters to autoGitTag directive. 2017-03-16 19:19:40 -07:00
Cedric Beust
99c447805e 1.0.13. 2017-03-16 15:28:01 -07:00
Cedric Beust
778db322a5 Kotlin 1.1.1. 2017-03-16 15:27:53 -07:00
Cedric Beust
8d06df9b8c Comments. 2017-03-16 15:21:51 -07:00
Cedric Beust
c2c4d8e254 Clarify and document. 2017-03-16 14:44:12 -07:00
Cedric Beust
66b39aa213 Log exclusions. 2017-03-16 14:20:30 -07:00
Cedric Beust
3f1155a280 Better warning. 2017-03-16 11:27:29 -07:00
Cedric Beust
71b7c6d58c Update README.md 2017-03-16 09:23:50 -07:00
Cedric Beust
e30e188368 Update README.md 2017-03-15 15:19:20 -07:00
Cedric Beust
1a01d7c8d8 Testing TeamCity build status publisher. 2017-03-15 15:08:40 -07:00
Cedric Beust
2e603b0504 Refactoring. 2017-03-15 14:49:58 -07:00
Cedric Beust
1c10965e77 Problem solved, removing the logs. 2017-03-15 14:45:34 -07:00
Cedric Beust
a91bd04e41 Test fix. 2017-03-15 14:38:11 -07:00
Cedric Beust
87ff2b34cf More test fixing. 2017-03-15 14:30:26 -07:00
Cedric Beust
c16aa0aa67 Attempt to fix the tests for TeamCity. 2017-03-15 14:14:27 -07:00
Cedric Beust
bd861a9198 1.0.12. 2017-03-15 13:35:54 -07:00
Cedric Beust
9c6a68e475 Debug TeamCity failures. 2017-03-15 13:23:04 -07:00
Cedric Beust
7b28290b8b More refactoring. 2017-03-15 13:02:37 -07:00
Cedric Beust
bbadd4904d Not needed. 2017-03-15 12:20:36 -07:00
Cedric Beust
ac96f92b29 Use relative path for preBuildScript.jar. 2017-03-15 12:20:31 -07:00
Cedric Beust
ca27a131ca Build file fix. 2017-03-15 11:38:41 -07:00
Cedric Beust
d01af588cd Logging. 2017-03-15 11:03:25 -07:00
Cedric Beust
908610ba3a Refactor. 2017-03-15 11:01:10 -07:00
Cedric Beust
72bcffab2c Move the file to the correct location. 2017-03-15 10:54:01 -07:00
Cedric Beust
33f7d4bd9f Don’t break incremental compilation in the build file. 2017-03-15 10:53:45 -07:00
Cedric Beust
3d689b3367 Better test failure message. 2017-03-14 20:21:32 -07:00
Cedric Beust
b2390f34f8 Incremental packaging. 2017-03-14 18:40:28 -07:00
Cedric Beust
c974330612 Less verbose Md5. 2017-03-14 18:40:18 -07:00
Cedric Beust
5000368d64 Log. 2017-03-14 18:40:07 -07:00
Cedric Beust
a0ce7498e3 Output checksums. 2017-03-14 16:06:13 -07:00
Cedric Beust
383128d96b Work in progress for incremental archival task. 2017-03-14 15:52:03 -07:00
Cedric Beust
c056fa5c9f Restore path. 2017-03-13 12:38:15 -07:00
Cedric Beust
28ed175979 Redundant. 2017-03-13 12:37:59 -07:00
Cedric Beust
2bfe9b1339 Restore log level. 2017-03-13 11:40:56 -07:00
Cedric Beust
1fb4278cd6 Investigate the TeamCity build failure. 2017-03-13 11:26:54 -07:00
Cedric Beust
3ca1f5612f Update README.md 2017-03-12 21:22:52 -07:00
Cedric Beust
1f3f666d93 Always compile the build files with Kotlin incremental compilation disabled. 2017-03-10 12:39:44 -08:00
Cedric Beust
187593b9b1 Test that BuildKt.class is not in the shipped jar file. 2017-03-10 10:48:31 -08:00
Cedric Beust
49d142659a Silly import completely wrecked the logger. 2017-03-10 10:15:20 -08:00
Cedric Beust
d111df75d2 1.0.11. 2017-03-10 09:56:11 -08:00
Cedric Beust
ef79394d49 Wipe the jar file. 2017-03-10 09:55:52 -08:00
Cedric Beust
99c5bd560f Trim dependencies. 2017-03-10 09:55:38 -08:00
Cedric Beust
94082e1251 Indent. 2017-03-10 09:55:22 -08:00
Cedric Beust
e8bdd888a7 Better file detection. 2017-03-09 13:48:39 -08:00
Cedric Beust
c590ed2ebd 1.0.9. 2017-03-09 13:32:23 -08:00
Cedric Beust
de052ea7f2 Warnings. 2017-03-09 13:32:17 -08:00
Cedric Beust
87c56d320e BuildParser fix. 2017-03-09 13:32:10 -08:00
Cedric Beust
5ea2fe30b0 Investigate TeamCity build failures. 2017-03-08 15:56:50 -08:00
Cedric Beust
443847c171 1.0.8. 2017-03-08 15:44:54 -08:00
Cedric Beust
6ef86693c7 Added description/vcsTag to bintray{} directive. 2017-03-08 15:44:33 -08:00
Cedric Beust
5591380ddd 1.0.7. 2017-03-08 14:24:52 -08:00
Cedric Beust
df7d9e7d68 Better runtime scope handling. 2017-03-08 14:24:43 -08:00
Cedric Beust
a99ce1ce4d Logging. 2017-03-08 13:47:33 -08:00
Cedric Beust
6f593d5c53 Logging. 2017-03-08 13:47:18 -08:00
Cedric Beust
caf4b1c62a Fix StackOverFlow.
Fixes https://github.com/cbeust/kobalt/issues/339.
2017-03-08 13:38:41 -08:00
Cedric Beust
6dadd3d751 1.0.6. 2017-03-08 10:26:43 -08:00
Cedric Beust
289c67557c Better logging. 2017-03-08 10:26:35 -08:00
Cedric Beust
3503405488 Allow more imports in preBuildScript. 2017-03-08 10:26:30 -08:00
Cedric Beust
b99eb756ca 1.0.5. 2017-03-07 18:28:20 -08:00
Cedric Beust
bfbe4b35a9 Refactor. 2017-03-07 18:27:49 -08:00
Cedric Beust
eaf0b96d6c Variables in buildScript(). 2017-03-07 18:27:45 -08:00
Cedric Beust
bdd80bdedd Don’t run buildScript{} twice. 2017-03-07 13:53:45 -08:00
Cedric Beust
e297586e62 1.0.4. 2017-03-07 13:25:05 -08:00
Cedric Beust
204ca452e5 Allow variables in buildScript{}.
Fixes https://github.com/cbeust/kobalt/issues/340
2017-03-07 13:24:49 -08:00
Cedric Beust
c90125ede0 Incremental compilation timing. 2017-03-03 14:20:01 -08:00
Cedric Beust
c3fc091347 1.0.3. 2017-03-03 13:53:34 -08:00
Cedric Beust
afb6a85820 Wrapper. 2017-03-03 13:53:30 -08:00
Cedric Beust
4bdc12def5 Incremental compilation. 2017-03-03 13:52:25 -08:00
Cedric Beust
83633cd011 Fix recursive search. 2017-03-03 10:38:53 -08:00
Cedric Beust
754b2df5fc Fix previous version calculation. 2017-03-03 09:30:19 -08:00
Cedric Beust
0b742af5fa 1.0.2. 2017-03-01 13:05:58 -08:00
Cedric Beust
1da473a73c NumberFormatException when parsing the new version number.
Closes https://github.com/cbeust/kobalt/issues/335
2017-03-01 13:05:30 -08:00
Cedric Beust
f01dfbe095 1.0.1. 2017-03-01 10:44:10 -08:00
Cedric Beust
415f5e800e Warnings. 2017-03-01 10:43:50 -08:00
Cedric Beust
0dfc71562c 0.940. 2017-03-01 10:13:18 -08:00
Cedric Beust
bfc30662d9 Kotlin 1.1.0. 2017-03-01 10:13:03 -08:00
Cedric Beust
e9b1636727 VersionTest. 2017-03-01 10:12:54 -08:00
Cedric Beust
f10749adae Warnings. 2017-03-01 10:12:46 -08:00
Cedric Beust
446901283d Better version parsing. 2017-03-01 10:12:38 -08:00
Cedric Beust
ce32785de7 Clarify error message. 2017-02-27 16:08:03 -08:00
Cedric Beust
a35cf0cc87 Make “doc” run before “assemble". 2017-02-27 16:07:55 -08:00
Cedric Beust
5edb52a69b Import. 2017-02-23 19:58:47 -08:00
Cedric Beust
5b76c0cad5 Turn on ExcludeTest. 2017-02-23 19:08:00 -08:00
Cedric Beust
12bb412cd1 .gitignore. 2017-02-23 17:43:44 -08:00
Cedric Beust
489d3ff913 Remove IDEA files 2017-02-23 17:43:20 -08:00
Cedric Beust
b0c412b680 Better tests. 2017-02-23 17:42:56 -08:00
Cedric Beust
a82cd20455 Turn on ExcludeTest. 2017-02-23 09:19:01 -08:00
Cedric Beust
3290769453 Add an exclude() test.
… but disabled, until I can figure out why it interferes with the profile test.
2017-02-22 20:45:11 -08:00
Cedric Beust
b54c4c63c8 Move exclude() management to DependencyManager, where it belongs. 2017-02-22 20:44:19 -08:00
Cedric Beust
64437761a4 0.939. 2017-02-20 07:59:48 -08:00
Cedric Beust
891a8cdbee —listTemplates after parsing the build file. 2017-02-20 07:59:40 -08:00
Cedric Beust
1257b9b310 Rename to templateContributors. 2017-02-20 07:59:29 -08:00
Cedric Beust
d806649194 0.938. 2017-02-20 07:22:58 -08:00
Cedric Beust
35e0167a1f Unnecessary classLoader. 2017-02-20 07:22:44 -08:00
Cedric Beust
b23cd94422 0.937. 2017-02-20 07:03:21 -08:00
Cedric Beust
90d582a1c5 Display plug-in dependencies in KobaltClient. 2017-02-20 07:02:08 -08:00
Cedric Beust
3215280d92 Plug-in dependencies should be returned as DependencyData. 2017-02-20 07:02:08 -08:00
Cedric Beust
1baca0cd35 Fix Aether version. 2017-02-18 08:20:32 -08:00
Cedric Beust
62c11cbdfe Fix paths. 2017-02-18 08:14:29 -08:00
Cedric Beust
4905afffbb 0.936. 2017-02-18 08:13:52 -08:00
Cedric Beust
ed6e5844d1 Exclude aether dependencies. 2017-02-18 08:06:55 -08:00
Cedric Beust
10967067f7 Fix excluded dependencies. 2017-02-18 08:05:17 -08:00
Cedric Beust
58d5101e11 0.935. 2017-02-17 13:44:32 -08:00
Cedric Beust
d154700eef Better KobaltClient display. 2017-02-17 13:44:20 -08:00
Cedric Beust
a9902f136b Return plug-in dependencies in their own JSON section. 2017-02-17 13:44:13 -08:00
Cedric Beust
4f78e911e3 Simplify. 2017-02-17 13:43:53 -08:00
Cedric Beust
bd55768c2b Bump JCommander. 2017-02-17 13:33:30 -08:00
Cedric Beust
b864ea5ded Indent. 2017-02-17 13:33:22 -08:00
Cedric Beust
f677b06901 Clean up client and server. 2017-02-17 13:33:13 -08:00
Cedric Beust
205f10a53d Reformat. 2017-02-17 13:32:51 -08:00
Cedric Beust
04810f4df8 Clear the list of dynamic plug-ins. 2017-02-17 13:32:43 -08:00
Cedric Beust
d298914636 0.934. 2017-02-17 10:41:23 -08:00
Cedric Beust
f7dd354b27 Better ProfileTest. 2017-02-17 10:38:25 -08:00
Cedric Beust
50f8e2fa10 0.933. 2017-02-17 10:09:43 -08:00
Cedric Beust
010ae24bd8 1.1.0-rc-91. 2017-02-17 10:09:35 -08:00
Cedric Beust
475bdfffdb Better compilation error reporting. 2017-02-17 10:09:26 -08:00
Cedric Beust
54fe92fee8 Merge pull request #329 from dmitry-zhuravlev/cbeust_master
* fix debug of Build.kt (do not rename original source file but use temporary folder instead)
2017-02-17 07:22:47 -08:00
Dmitry Zhuravlev
1455a9a1a2 * fix debug of Build.kt (do not rename original source file but use temporary folder instead) 2017-02-17 15:45:33 +03:00
Cedric Beust
14ad4ce733 Refactor. 2017-02-16 15:45:58 -08:00
Cedric Beust
953814982f Refactor. 2017-02-16 15:44:24 -08:00
Cedric Beust
2bb8c32243 Update comment. 2017-02-16 15:42:04 -08:00
Cedric Beust
a078865a2d 0.932. 2017-02-16 15:32:16 -08:00
Cedric Beust
832c602563 Expand —init to files and URL’s. 2017-02-16 15:32:16 -08:00
Cedric Beust
d583eb0066 Merge pull request #328 from pabl0rg/master
standardize use of Directive (on methods/props)
2017-02-15 10:33:48 -08:00
Juan Liska
7ad54766c0 standardize use of Directive (on methods/props) 2017-02-15 12:10:57 -06:00
Cedric Beust
6b08856b7b Merge pull request #327 from pabl0rg/master
standardize BuildScript directives
2017-02-15 09:26:34 -08:00
Juan Liska
598d8b26c5 move TestConfig into separate file 2017-02-15 09:25:39 -06:00
Juan Liska
07b68e72c5 return PackageConfig from directive 2017-02-15 08:45:10 -06:00
Juan Liska
3c4a703ca1 standardize directives 2017-02-15 08:44:35 -06:00
Juan Liska
cb101cd410 return config objects from directives 2017-02-15 07:12:21 -06:00
Juan Liska
607b8a001f tag version directive 2017-02-15 06:06:54 -06:00
Juan Liska
264d5ff8b7 return ApplicationConfig from application directive 2017-02-15 06:06:32 -06:00
Juan Liska
a5f3b6b8e7 standardize BuildScript directives
moved buildScript directive to Directives.kt
tagged BuildScriptConfig methods with @Directive
2017-02-15 05:23:31 -06:00
Cedric Beust
c74c2ad716 0.931. 2017-02-14 16:52:13 -08:00
Cedric Beust
951023a1b1 Not used. 2017-02-14 16:52:07 -08:00
Cedric Beust
1d231163f3 Adjust KobaltClient. 2017-02-14 16:51:54 -08:00
Cedric Beust
f38cdfff96 Compile the build file before running --server. 2017-02-14 16:51:24 -08:00
Cedric Beust
7e662035d4 Look up plugins on the pluginClassLoader first. 2017-02-14 16:51:10 -08:00
Cedric Beust
2d9dd077e6 Remove public. 2017-02-14 16:50:46 -08:00
Cedric Beust
86dec889f2 Pull a few functions up in BaseJvmPlugin. 2017-02-14 11:15:48 -08:00
Cedric Beust
23360b6077 Fix profiles. 2017-02-14 10:21:23 -08:00
Cedric Beust
92a1be7d0a 0.930. 2017-02-14 10:20:02 -08:00
Cedric Beust
456d8365bd GITHUB-326: Fix crash with file dependencies.
Fixes https://github.com/cbeust/kobalt/issues/326.
2017-02-14 10:19:44 -08:00
Cedric Beust
d948f5ec5d Restore build file debugging. 2017-02-14 07:49:25 -08:00
Cedric Beust
630cc790af 0.929. 2017-02-13 19:35:46 -08:00
Cedric Beust
4a8826fb69 Kotlin 1.1.0-beta-38. 2017-02-13 19:35:27 -08:00
Cedric Beust
be3915e07a Not used. 2017-02-13 16:49:00 -08:00
Cedric Beust
61459fed62 Update build with Groovy. 2017-02-13 16:48:56 -08:00
Cedric Beust
b59bf3b8c0 Groovy plug-in. 2017-02-13 16:28:04 -08:00
Cedric Beust
9cea38dedb Refactor. 2017-02-13 16:27:42 -08:00
Cedric Beust
f2b54ec0c0 Refactor. 2017-02-13 10:39:34 -08:00
Cedric Beust
3b88ecc4dc Doc. 2017-02-13 10:39:28 -08:00
Cedric Beust
e4f68f9348 0.928. 2017-02-13 10:13:42 -08:00
Cedric Beust
834aa09f54 Fix GITHUB-314: Couldn’t find directory “”.
Fix https://github.com/cbeust/kobalt/issues/314
2017-02-13 10:13:42 -08:00
Cedric Beust
5f48cb18e9 Reformat. 2017-02-13 10:13:42 -08:00
Cedric Beust
70c297951f 0.927. 2017-02-13 10:13:42 -08:00
Cedric Beust
e03b4527ad Handle dependency exclusion for tests too. 2017-02-13 10:13:42 -08:00
Cedric Beust
262e1e3a26 kobalt-wrapper.jar. 2017-02-13 10:13:42 -08:00
Cedric Beust
1429ab0305 0.926. 2017-02-13 10:13:42 -08:00
Cedric Beust
0c8ebe4ff6 Simplify. 2017-02-13 10:13:42 -08:00
Cedric Beust
5b46033e96 kotlinc can compile directories. 2017-02-13 10:13:42 -08:00
Cedric Beust
7dc1183953 Disable animations with a system property. 2017-02-10 09:16:14 -08:00
Cedric Beust
0a0b478ba3 Fix StackOverflowError. 2017-02-10 09:15:07 -08:00
Cedric Beust
0b584c7626 0.924. 2017-02-09 15:54:55 -08:00
Cedric Beust
fecf4324dd Don’t display progress if no terminal is available. 2017-02-09 15:49:16 -08:00
Cedric Beust
4d04cddc6e Not needed. 2017-02-09 15:49:06 -08:00
Cedric Beust
74df3c6870 Remove travis 2017-02-09 15:14:06 -08:00
Cedric Beust
116188fb62 Document web socket logging. 2017-02-09 15:13:03 -08:00
Cedric Beust
603cea30e4 Investigating weird TeamCity error. 2017-02-09 13:56:46 -08:00
Cedric Beust
fc5d9bb2b1 Send the correct error message to the WebSocket. 2017-02-09 12:56:59 -08:00
Cedric Beust
263e755094 Disable Travis builds 2017-02-09 11:42:03 -08:00
Cedric Beust
3c58a93d45 Enable websocket debugging. 2017-02-09 11:17:05 -08:00
Cedric Beust
8deaa65a3d 0.923. 2017-02-09 10:53:36 -08:00
Cedric Beust
0d661b126f Better separate kotlinc flag management. 2017-02-09 10:46:58 -08:00
Cedric Beust
53f9804ea0 Spark server logs. 2017-02-09 10:46:23 -08:00
Cedric Beust
e242886aa7 Remove conflicting websocket dependency. 2017-02-09 10:45:46 -08:00
Cedric Beust
7347681bae Clean up slf4j. 2017-02-09 10:45:26 -08:00
Cedric Beust
47f7072d9c Add optional filter for transitive closure. 2017-02-09 10:44:59 -08:00
Cedric Beust
11980ca940 Version number. 2017-02-08 14:14:27 -08:00
Cedric Beust
e9c9198327 Better error message. 2017-02-08 14:11:30 -08:00
Cedric Beust
ef68022bbd Not used. 2017-02-08 14:11:23 -08:00
Cedric Beust
224a5d7925 Better error reporting when launching separate kotlinc. 2017-02-08 14:10:59 -08:00
Cedric Beust
138ba15f3a Delete IDEA files 2017-02-07 18:25:40 -08:00
Cedric Beust
e4c5336147 Fix URL. 2017-02-07 16:38:56 -08:00
Cedric Beust
a7572fa2e5 Comment. 2017-02-07 16:32:04 -08:00
Cedric Beust
74262ee5be 0.922. 2017-02-07 16:29:51 -08:00
Cedric Beust
ba70a27968 Fix NPE. 2017-02-07 16:29:45 -08:00
Cedric Beust
75dda87fdd Fix hosts for ResolveDependency. 2017-02-07 16:25:06 -08:00
Cedric Beust
8e583c5a73 Rename. 2017-02-07 13:51:19 -08:00
Cedric Beust
0f625b738a Build.kt update. 2017-02-07 11:34:23 -08:00
Cedric Beust
caed6f9109 Fix tree display. 2017-02-07 11:33:59 -08:00
Cedric Beust
c91f372b4b 0.921. 2017-02-07 10:38:11 -08:00
Cedric Beust
358d25d57c New syntax for build templates. 2017-02-07 10:35:55 -08:00
Cedric Beust
0885fb3e4a Clean up the Aether.kt file. 2017-02-07 10:35:43 -08:00
Cedric Beust
9286265f0d Remove unused Aether code. 2017-02-07 10:27:24 -08:00
Cedric Beust
f037474f36 Renaming. 2017-02-07 10:20:29 -08:00
Cedric Beust
36d2953c8c New KobaltMavenResolver. 2017-02-07 09:56:40 -08:00
Cedric Beust
7d9d2c00ed 0.920. 2017-02-06 11:29:22 -08:00
Cedric Beust
eede58fc3b Don’t use version ranges in the templates. 2017-02-06 11:28:17 -08:00
Cedric Beust
a3cd1ea7f2 Remove the JetBrains repo (which contains snapshots). 2017-02-06 11:24:25 -08:00
Cedric Beust
489fc867a7 Range tests. 2017-02-05 10:42:08 -08:00
Cedric Beust
27ba17ddce Replace Aether with maven-resolver. 2017-02-05 09:27:00 -08:00
Cedric Beust
a66974c5cb Delete DependencyManager2. 2017-02-02 11:18:36 -08:00
Cedric Beust
6a5eb20d02 IDEA files. 2017-02-01 20:47:35 -08:00
Cedric Beust
50b1ded7bb Add isLatest to nodes returned from the GetDependencies call. 2017-02-01 20:47:00 -08:00
Cedric Beust
2ebf932d21 Debugging dependency sending. 2017-02-01 16:14:55 -08:00
Cedric Beust
4f84b8df9a Build fix. 2017-02-01 15:44:29 -08:00
Cedric Beust
620def64fa 1.1.0-beta-22. 2017-02-01 15:44:13 -08:00
Cedric Beust
9862f01c0d IDEA files. 2017-02-01 15:43:45 -08:00
Cedric Beust
3c63cace42 Bump Aether. 2017-02-01 13:26:53 -08:00
Cedric Beust
9883247be3 0.918. 2017-02-01 13:18:57 -08:00
Cedric Beust
a8c01b1347 IDEA files. 2017-02-01 12:59:43 -08:00
Cedric Beust
ae450e4cbc Fix optional dependencies problem. 2017-02-01 12:58:59 -08:00
Cedric Beust
38bb53387e Not used. 2017-02-01 12:34:44 -08:00
Cedric Beust
2a1edb8f64 0.917. 2017-01-28 10:18:09 -08:00
Cedric Beust
36075a9d4f —projectInfo should ignore file dependencies. 2017-01-28 10:17:26 -08:00
Cedric Beust
b4413814fc Fix kotlinc 1.0.6 error stream weirdness. 2017-01-28 10:14:31 -08:00
Cedric Beust
1a01c85fe8 Bug due to weird behavior of split().
Somehow, “”.split(“ “) == arrayOf(“”).
2017-01-28 10:14:11 -08:00
Cedric Beust
1600056102 Unwanted println. 2017-01-22 09:49:13 -08:00
Cedric Beust
2719be4c66 0.916. 2017-01-22 09:44:03 -08:00
Cedric Beust
1102b85d7e Better logging. 2017-01-22 09:19:47 -08:00
Cedric Beust
bfc787a4b4 buildScript{} support. 2017-01-22 09:19:41 -08:00
Cedric Beust
574e305399 BlockExtractor. 2017-01-20 16:23:27 -08:00
Cedric Beust
384550c62c Delete unused class. 2017-01-20 16:23:15 -08:00
Cedric Beust
31f44773b7 0.915. 2017-01-20 12:43:15 -08:00
Cedric Beust
a40b63eec4 Added kobaltCompilerSeparateProcess flag. 2017-01-20 12:35:06 -08:00
Cedric Beust
998972f022 Add a few kotlinc -X flags. 2017-01-20 12:17:43 -08:00
Cedric Beust
b7eabecfca 0.914. 2017-01-20 10:06:30 -08:00
Cedric Beust
ceff3000d3 Update to 1.1.0. 2017-01-20 10:06:05 -08:00
Cedric Beust
5b0ccfe8cb Not used. 2017-01-19 15:54:52 -08:00
Cedric Beust
fa2ef81e2c NPE fix. 2017-01-19 15:54:39 -08:00
Cedric Beust
d32a84256c Better resolution message. 2017-01-19 15:54:23 -08:00
Cedric Beust
63c9369041 0.913. 2017-01-19 15:34:55 -08:00
Cedric Beust
ec2fff5205 Forgot a file. 2017-01-19 14:56:26 -08:00
Cedric Beust
816c609c17 Add compiler version and flags in KotlinConfig. 2017-01-19 14:53:37 -08:00
Cedric Beust
48bbdfd1ff Remove public. 2017-01-19 13:32:50 -08:00
Cedric Beust
62b193f378 0.912. 2017-01-19 13:18:17 -08:00
Cedric Beust
22468647eb Launch Kotlin compiler in separate process. 2017-01-19 10:26:32 -08:00
Cedric Beust
915a8427f4 Extract compiler version in Constants. 2017-01-19 10:25:35 -08:00
Cedric Beust
5d9263eda9 Warnings. 2017-01-19 10:24:25 -08:00
Cedric Beust
39d0e4e464 Remove public. 2017-01-17 14:33:54 -08:00
Cedric Beust
9a249c2a6c Adjust KotlinTestRunner. 2017-01-15 07:56:21 -08:00
Cedric Beust
a80e19d53a Remove AndroidManifest.xml. 2017-01-14 18:16:41 -08:00
Cedric Beust
991887e280 Add <kobaltCompilerFlagss> in settings.xml. 2017-01-14 10:14:34 -08:00
Cedric Beust
fb0da19f24 Better message. 2017-01-14 10:14:14 -08:00
Cedric Beust
c01605996b kotlin-eap-1.1. 2017-01-14 08:48:54 -08:00
Cedric Beust
230aeca03f 0.911. 2017-01-14 08:46:55 -08:00
Cedric Beust
24174b40f1 Add support for KotlinTest. 2017-01-14 08:46:26 -08:00
Cedric Beust
70e1a179f4 IDEA files. 2017-01-11 15:16:00 -08:00
Cedric Beust
a2bd140d75 Fix IDEA file. 2017-01-11 15:14:14 -08:00
Cedric Beust
6535245339 0.910. 2017-01-11 15:11:40 -08:00
Cedric Beust
6171bec8d9 Rebase. 2017-01-11 15:11:26 -08:00
Cedric Beust
32cd78f73a IDEA files. 2017-01-11 15:10:45 -08:00
Cedric Beust
39b380f385 1.0.6. 2017-01-11 15:10:26 -08:00
Cedric Beust
1efbabe6bd Manage github API errors better. 2017-01-11 15:10:26 -08:00
Cedric Beust
3bf91feffe 0.909. 2017-01-07 14:12:34 -08:00
Cedric Beust
e111fec8bc IDEA files. 2017-01-07 14:12:07 -08:00
Cedric Beust
66b87981b1 1.0.6. 2017-01-07 14:11:41 -08:00
Cedric Beust
25a5ef9195 0.908. 2017-01-05 12:28:46 -08:00
Cedric Beust
ff94cc5e3f Implements args() for application {}. 2017-01-05 12:23:55 -08:00
Cedric Beust
a5c3c93657 Set JAR_NAME correctly. 2017-01-05 12:23:31 -08:00
Cedric Beust
78c9a80937 Bump this error to level 1. 2017-01-05 11:47:37 -08:00
Cedric Beust
83c097917e Don’t need this dependency. 2017-01-05 11:32:32 -08:00
Cedric Beust
596c0812c0 0.907. 2017-01-05 11:19:48 -08:00
Cedric Beust
5d31e55a4a Use the correct directory for javadoc. 2017-01-05 10:22:17 -08:00
Cedric Beust
f563d274dd Generate javadocs in {build}/docs/javadoc. 2017-01-05 10:13:52 -08:00
Cedric Beust
ffbe5491f2 Merge branch 'master' of github.com:cbeust/kobalt 2017-01-04 15:20:02 -08:00
Cedric Beust
162bf7b313 IDEA files. 2017-01-04 15:19:42 -08:00
Cedric Beust
5609bb27aa Fix Javadoc generation. 2017-01-04 15:19:34 -08:00
Cedric Beust
df90911ff2 Merge pull request #309 from pysaumont/master
Reading kobalt config file
2016-12-09 09:11:48 -08:00
pysaumont
bcf723141b Reading kobalt config file ~/.config/kobalt/settings.xml for HTTP proxy configuration using only Java standard lib 2016-12-09 13:29:50 +01:00
Cedric Beust
8589c46b43 IDEA files. 2016-12-07 13:51:06 -08:00
Cedric Beust
06194abbe4 New wrapper. 2016-12-07 13:50:52 -08:00
Cedric Beust
7ec673c41e 1.0.5. 2016-12-07 13:50:46 -08:00
Cedric Beust
8c29914193 0.906 2016-12-07 13:49:58 -08:00
Cedric Beust
744038b7af IDEA files. 2016-12-07 13:49:51 -08:00
Cedric Beust
e2f210823e Restore the proxy name to proxy_host. 2016-12-07 13:26:01 -08:00
Cedric Beust
a94705c1e9 Forgot the environment variable. 2016-12-06 14:44:49 -08:00
Cedric Beust
387b3b4c2e Reformat the httpProxy patch. 2016-12-06 14:44:13 -08:00
Cedric Beust
160d955a32 Merge pull request #308 from pysaumont/master
Added use of proxy as set by env variable 'http_proxy'
2016-12-06 14:41:10 -08:00
pysaumont
366b635c11 Added use of proxy as set by env variable 'http_proxy' 2016-12-06 22:41:05 +01:00
Cedric Beust
7bff267b9f 0.905. 2016-10-03 13:01:30 -07:00
Cedric Beust
c9563b27d8 Fix the scripting changes that broke plugin loading. 2016-10-03 12:57:52 -07:00
Cedric Beust
4df3baf685 Travis build fix attempt 2016-09-29 10:53:02 -07:00
Cedric Beust
dbb42fd833 0.904. 2016-09-29 10:40:39 -07:00
Cedric Beust
bc4a28727f Use direct dependencies to determine the test runner. 2016-09-29 10:40:28 -07:00
Cedric Beust
743ec4e177 Remove --logTags 2016-09-23 12:38:06 -07:00
Cedric Beust
baf6c94400 Refactor. 2016-09-23 12:30:46 -07:00
Cedric Beust
54e5669349 Remove public. 2016-09-23 12:30:09 -07:00
Cedric Beust
bed02f9678 IDEA files. 2016-09-23 12:27:30 -07:00
Cedric Beust
58a74a3e41 Forgot a dependency. 2016-09-23 12:27:01 -07:00
Cedric Beust
cb006ba2b5 0.903. 2016-09-23 12:22:15 -07:00
Cedric Beust
336ba11dcc kotlin 1.0.4. 2016-09-23 12:22:04 -07:00
Cedric Beust
850e335843 Added autoGitTag to github and bintray configurations. 2016-09-23 12:20:44 -07:00
Cedric Beust
1b7eb08074 0.902. 2016-09-23 11:46:42 -07:00
Cedric Beust
736062ab8b Prevent duplicate dependency tags in the .pom. 2016-09-23 11:32:50 -07:00
Cedric Beust
bee7bd84dd provided and optional dependencies still need to be used to compile. 2016-09-23 11:15:46 -07:00
Cedric Beust
b80c996e05 Generate the correct pom file for provided(). 2016-09-22 11:12:19 -07:00
Cedric Beust
91baf6e86f Optional compile dependencies with "compileOptional(...)". 2016-09-22 11:05:39 -07:00
Cedric Beust
37ef22cccc Reformat. 2016-09-21 13:50:32 -07:00
Cedric Beust
5a8fd219eb Refactor. 2016-09-21 13:50:27 -07:00
Cedric Beust
ffc56002c3 Proper assisted injection. 2016-09-12 13:22:48 -07:00
Cedric Beust
8608df4618 Refactor build compilation in anticipation of scripting support. 2016-09-12 13:00:48 -07:00
Cedric Beust
d8283d6dd8 Remove final. 2016-09-12 13:00:35 -07:00
Cedric Beust
f6cef6ba5f Forgot two files. 2016-09-07 09:57:13 -07:00
Cedric Beust
6ac1260e8b Temporary fix for kotlinc 1.1. 2016-09-07 09:55:29 -07:00
Cedric Beust
9fb3eb87a2 Launch the test JVM with "-ea".
Fixes https://github.com/cbeust/kobalt/issues/303.
2016-09-07 09:53:32 -07:00
Cedric Beust
079890b2e7 0.900. 2016-09-06 09:37:21 -07:00
Cedric Beust
b8194acd09 Fixes #304.
Fixes https://github.com/cbeust/kobalt/issues/304
2016-09-06 09:37:00 -07:00
Cedric Beust
5dd11e22e5 0.899. 2016-08-12 00:24:36 -08:00
Cedric Beust
c2c4a156de Handle zero projects more gracefully. 2016-08-12 00:24:22 -08:00
Cedric Beust
2498284043 Silly bug when there's just one project. 2016-08-12 00:24:04 -08:00
Cedric Beust
aa29172bd6 0.898. 2016-08-11 22:37:09 -08:00
Cedric Beust
eb0b4b1e0f Make parallel builds the default. 2016-08-11 22:36:50 -08:00
Cedric Beust
39c1b6f8d3 Playing with thread log display. 2016-08-11 22:32:58 -08:00
Cedric Beust
cad5984dae Warnings. 2016-08-11 21:25:54 -08:00
Cedric Beust
ecfe1a07fa 0.897. 2016-08-11 19:34:07 -07:00
Cedric Beust
834e48fc6d Display regular logs. 2016-08-11 19:33:45 -07:00
Cedric Beust
c3ee130432 0.896. 2016-08-11 19:23:41 -07:00
Cedric Beust
6d9ec2c9ec Task ordering fix. 2016-08-11 19:23:20 -07:00
Cedric Beust
906e4aa60f 0.895. 2016-08-11 03:19:51 -08:00
Cedric Beust
2da9f86de8 Unnecessary parameter. 2016-08-11 03:19:36 -08:00
Cedric Beust
34d78ec828 0.894. 2016-08-11 03:15:22 -08:00
Cedric Beust
c125f45eda Fix task dependencies. 2016-08-11 03:15:12 -08:00
219 changed files with 8169 additions and 4347 deletions

10
.gitignore vendored
View file

@ -1,15 +1,15 @@
.gradle .gradle
annotations annotations
.idea/* .idea/*
!.idea/modules.xml *.iml
!.idea/libraries nonBuildScript
!.idea/misc.xml
buildScript
kobaltBuild kobaltBuild
local.properties local.properties
classes classes
libs libs
.kobalt/ .kobalt/
./build/
out out
.DS_Store .DS_Store
lib/kotlin-*
build
.history

View file

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

View file

@ -1,11 +0,0 @@
<component name="libraryTable">
<library name="kobalt.jar">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/wrapper/dist/kobalt-0.863/kobalt/wrapper/kobalt-0.863.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.kobalt/wrapper/dist/kobalt-0.863/kobalt/wrapper/kobalt-0.863.jar!/" />
</SOURCES>
</library>
</component>

9
.idea/misc.xml generated
View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

11
.idea/modules.xml generated
View file

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<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.iml" filepath="$PROJECT_DIR$/kobalt.iml" />
<module fileurl="file://$PROJECT_DIR$/modules/kobalt-plugin-api/kobalt-plugin-api.iml" filepath="$PROJECT_DIR$/modules/kobalt-plugin-api/kobalt-plugin-api.iml" />
<module fileurl="file://$PROJECT_DIR$/modules/wrapper/kobalt-wrapper.iml" filepath="$PROJECT_DIR$/modules/wrapper/kobalt-wrapper.iml" />
</modules>
</component>
</project>

View file

@ -1,13 +0,0 @@
cache:
directories:
- $HOME/.m2
- $HOME/.kobalt
language: java
jdk:
- oraclejdk8
install: true
script: ./build-travis.sh

View file

@ -1,11 +1,14 @@
# Kobalt [![Build Status](https://travis-ci.org/cbeust/kobalt.svg?branch=master)](https://travis-ci.org/cbeust/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)
Kobalt is a universal build system. 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,5 +1,7 @@
ulimit -s 1082768
#java -Xmx2048m -jar $(dirname $0)/kobalt/wrapper/kobalt-wrapper.jar $* clean #java -Xmx2048m -jar $(dirname $0)/kobalt/wrapper/kobalt-wrapper.jar $* clean
java -Xmx2048m -jar $(dirname $0)/kobalt/wrapper/kobalt-wrapper.jar $* clean assemble test --parallel --logTags graph java -Xmx2048m -jar $(dirname $0)/kobalt/wrapper/kobalt-wrapper.jar $* clean assemble test --parallel

58
build.gradle Normal file
View file

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

11
dist/kobaltw vendored
View file

@ -1,2 +1,11 @@
#!/usr/bin/env sh #!/usr/bin/env sh
java -jar "`dirname "$0"`/../kobalt/wrapper/kobalt-wrapper.jar" $*
case "$(uname)" in
CYGWIN*) DIRNAME=$(cygpath -d "$(dirname "$(readlink -f "$0")")");;
Darwin*) DIRNAME=$(dirname "$(readlink "$0")");;
*) DIRNAME=$(dirname "$(readlink -f "$0")");;
esac
if [ "$DIRNAME" = "." ]; then
DIRNAME="$(dirname "$0")"
fi
java -jar "${DIRNAME}/../kobalt/wrapper/kobalt-wrapper.jar" $*

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

Binary file not shown.

View file

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

188
gradlew vendored Executable file
View file

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

100
gradlew.bat vendored Normal file
View file

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

View file

@ -1,409 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="kobalt" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="KOBALT" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="false">
<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/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/kotlin" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/kotlin" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<excludeFolder url="file://$MODULE_DIR$/kobaltBuild" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="kobalt-plugin-api" />
<orderEntry type="module-library">
<library name="Kobalt: org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:1.0.4-eap-62">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.0.4-eap-62/kotlin-compiler-embeddable-1.0.4-eap-62.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.beanshell:bsh:jar:2.0b4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/beanshell/bsh/2.0b4/bsh-2.0b4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: com.beust:jcommander:jar:1.48">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/beust/jcommander/1.48/jcommander-1.48.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: biz.aQute.bnd:bndlib:jar:2.4.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/biz/aQute/bnd/bndlib/2.4.0/bndlib-2.4.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.guava:guava:jar:16.0.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/guava/guava/16.0.1/guava-16.0.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty:jetty-xml:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/jetty-xml/9.3.6.v20151106/jetty-xml-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.code.findbugs:jsr305:jar:3.0.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.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: 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: org.eclipse.jetty.websocket:websocket-server:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/websocket/websocket-server/9.3.6.v20151106/websocket-server-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty.websocket:websocket-client:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/websocket/websocket-client/9.3.6.v20151106/websocket-client-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.okhttp3:okhttp:jar:3.2.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/okhttp3/okhttp/3.2.0/okhttp-3.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty:jetty-servlet:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/jetty-servlet/9.3.6.v20151106/jetty-servlet-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty:jetty-util:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/jetty-util/9.3.6.v20151106/jetty-util-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.okhttp3:logging-interceptor:jar:3.2.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/okhttp3/logging-interceptor/3.2.0/logging-interceptor-3.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty:jetty-http:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/jetty-http/9.3.6.v20151106/jetty-http-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.beust:jcommander:jar:1.48">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/beust/jcommander/1.48/jcommander-1.48.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty.websocket:websocket-common:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/websocket/websocket-common/9.3.6.v20151106/websocket-common-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty.websocket:websocket-api:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/websocket/websocket-api/9.3.6.v20151106/websocket-api-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty:jetty-security:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/jetty-security/9.3.6.v20151106/jetty-security-9.3.6.v20151106.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.slf4j:slf4j-api:jar:1.7.13">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/slf4j/slf4j-api/1.7.13/slf4j-api-1.7.13.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.google.code.gson:gson:jar:2.6.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/code/gson/gson/2.6.2/gson-2.6.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty.websocket:websocket-servlet:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/websocket/websocket-servlet/9.3.6.v20151106/websocket-servlet-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.osgi:org.osgi.core:jar:4.3.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/osgi/org.osgi.core/4.3.1/org.osgi.core-4.3.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty:jetty-webapp:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/jetty-webapp/9.3.6.v20151106/jetty-webapp-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.github.spullara.mustache.java:compiler:jar:0.9.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/github/spullara/mustache/java/compiler/0.9.1/compiler-0.9.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.sparkjava:spark-core:jar:2.5">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/sparkjava/spark-core/2.5/spark-core-2.5.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty:jetty-io:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/jetty-io/9.3.6.v20151106/jetty-io-9.3.6.v20151106.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.okio:okio:jar:1.6.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: javax.servlet:javax.servlet-api:jar:3.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/javax/servlet/javax.servlet-api/3.1.0/javax.servlet-api-3.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.jetty:jetty-server:jar:9.3.6.v20151106">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/jetty/jetty-server/9.3.6.v20151106/jetty-server-9.3.6.v20151106.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: 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" module-name="kobalt-wrapper" />
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.okhttp3:okhttp-ws:jar:3.2.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/okhttp3/okhttp-ws/3.2.0/okhttp-ws-3.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.retrofit2:retrofit:jar:2.0.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/retrofit2/retrofit/2.0.2/retrofit-2.0.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.retrofit2:converter-gson:jar:2.0.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/retrofit2/converter-gson/2.0.2/converter-gson-2.0.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.apache.ant:ant:jar:1.7.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/ant/ant/1.7.0/ant-1.7.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.assertj:assertj-core:jar:3.4.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/assertj/assertj-core/3.4.1/assertj-core-3.4.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.apache.ant:ant-launcher:jar:1.7.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="Kobalt: org.testng:testng:jar:6.9.11">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/testng/testng/6.9.11/testng-6.9.11.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
</component>
</module>

View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<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="library" name="kobalt.jar" level="project" />
</component>
</module>

View file

@ -1,17 +1,14 @@
import com.beust.kobalt.*
import com.beust.kobalt.TaskResult
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.api.annotation.Task import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.homeDir
import com.beust.kobalt.plugin.application.application import com.beust.kobalt.plugin.application.application
import com.beust.kobalt.plugin.java.javaCompiler import com.beust.kobalt.plugin.java.javaCompiler
import com.beust.kobalt.plugin.kotlin.kotlinCompiler import com.beust.kobalt.plugin.kotlin.kotlinCompiler
import com.beust.kobalt.plugin.packaging.assemble 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.plugin.publish.bintray
import com.beust.kobalt.plugin.publish.github import com.beust.kobalt.plugin.publish.github
import com.beust.kobalt.project
import com.beust.kobalt.test
import org.apache.maven.model.Developer import org.apache.maven.model.Developer
import org.apache.maven.model.License import org.apache.maven.model.License
import org.apache.maven.model.Model import org.apache.maven.model.Model
@ -20,17 +17,41 @@ import java.io.File
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Paths import java.nio.file.Paths
import java.nio.file.StandardCopyOption import java.nio.file.StandardCopyOption
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
val bs = buildScript {
repos("https://dl.bintray.com/cbeust/maven")
}
object Versions { object Versions {
val okhttp = "3.2.0" val kotlin = "1.2.71"
val okio = "1.6.0" val okhttp = "3.9.1"
val retrofit = "2.1.0" val okio = "1.13.0"
val gson = "2.6.2" val retrofit = "2.3.0"
val aether = "1.1.0" val gson = "2.8.2"
val sonatypeAether = "1.13.1" val guice = "4.2.2"
val maven = "3.3.9" val maven = "3.5.2"
val mavenResolver = "1.1.0"
val slf4j = "1.7.3"
val aether = "1.0.2.v20150114"
val testng = "6.12"
val jcommander = "1.72"
// JUnit 5
val junit = "4.12"
val junitPlatform = "1.1.0"
val junitJupiter = "5.1.0"
} }
fun mavenResolver(vararg m: String)
= m.map { "org.apache.maven.resolver:maven-resolver-$it:${Versions.mavenResolver}" }
.toTypedArray()
fun aether(vararg m: String)
= m.map { "org.eclipse.aether:aether-$it:${Versions.aether}" }
.toTypedArray()
val wrapper = project { val wrapper = project {
name = "kobalt-wrapper" name = "kobalt-wrapper"
group = "com.beust" group = "com.beust"
@ -43,6 +64,7 @@ val wrapper = project {
} }
assemble { assemble {
jar { }
jar { jar {
name = projectName + ".jar" name = projectName + ".jar"
manifest { manifest {
@ -54,6 +76,13 @@ val wrapper = project {
application { application {
mainClass = "com.beust.kobalt.wrapper.Main" mainClass = "com.beust.kobalt.wrapper.Main"
} }
bintray {
publish = true
sign = true
}
pom = createPom(name, "Wrapper for Kobalt")
} }
val kobaltPluginApi = project { val kobaltPluginApi = project {
@ -63,52 +92,44 @@ val kobaltPluginApi = project {
version = readVersion() version = readVersion()
directory = "modules/kobalt-plugin-api" directory = "modules/kobalt-plugin-api"
description = "A build system in Kotlin" description = "A build system in Kotlin"
url = "http://beust.com/kobalt" url = "https://beust.com/kobalt"
pom = Model().apply { pom = createPom(name, "A build system in Kotlin")
name = project.name
description = "A build system in Kotlin"
url = "http://beust.com/kobalt"
licenses = listOf(License().apply {
name = "Apache 2.0"
url = "http://www.apache .org/licenses/LICENSE-2.0"
})
scm = Scm().apply {
url = "http://github.com/cbeust/kobalt"
connection = "https://github.com/cbeust/kobalt.git"
developerConnection = "git@github.com:cbeust/kobalt.git"
}
developers = listOf(Developer().apply {
name = "Cedric Beust"
email = "cedric@beust.com"
})
}
dependencies { dependencies {
compile( compile(
"com.google.inject:guice:4.0", "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}",
"com.google.inject.extensions:guice-assistedinject:4.0", "com.google.inject:guice:${Versions.guice}",
"com.google.inject.extensions:guice-assistedinject:4.1.0",
"javax.inject:javax.inject:1", "javax.inject:javax.inject:1",
"com.google.guava:guava:19.0", "com.google.guava:guava:27.0.1-jre",
"org.apache.maven:maven-model:${Versions.maven}", "org.apache.maven:maven-model:${Versions.maven}",
"io.reactivex:rxjava:1.1.5", "io.reactivex:rxjava:1.3.3",
"com.squareup.okio:okio:${Versions.okio}", "com.squareup.okio:okio:${Versions.okio}",
"com.google.code.gson:gson:${Versions.gson}", "com.google.code.gson:gson:${Versions.gson}",
"com.squareup.okhttp3:okhttp:${Versions.okhttp}", "com.squareup.okhttp3:okhttp:${Versions.okhttp}",
"com.squareup.retrofit2:retrofit:${Versions.retrofit}", "com.squareup.retrofit2:retrofit:${Versions.retrofit}",
"com.squareup.retrofit2:converter-gson:${Versions.retrofit}", "com.squareup.retrofit2:converter-gson:${Versions.retrofit}",
"com.beust:jcommander:1.48", "com.beust:jcommander:${Versions.jcommander}",
"org.eclipse.jgit:org.eclipse.jgit:4.9.0.201710071750-r",
"org.slf4j:slf4j-simple:${Versions.slf4j}",
*mavenResolver("api", "spi", "util", "impl", "connector-basic", "transport-http", "transport-file"),
"org.apache.maven:maven-aether-provider:3.3.9",
"org.testng.testng-remote:testng-remote:1.3.2",
"org.testng:testng:${Versions.testng}",
"org.junit.platform:junit-platform-surefire-provider:${Versions.junitPlatform}",
"org.junit.platform:junit-platform-runner:${Versions.junitPlatform}",
"org.junit.platform:junit-platform-engine:${Versions.junitPlatform}",
"org.junit.platform:junit-platform-console:${Versions.junitPlatform}",
"org.junit.jupiter:junit-jupiter-engine:${Versions.junitJupiter}",
"org.junit.vintage:junit-vintage-engine:${Versions.junitJupiter}",
"org.apache.commons:commons-compress:1.15",
"commons-io:commons-io:2.6",
"org.slf4j:slf4j-nop:1.6.0", // Java 9
"org.eclipse.aether:aether-spi:${Versions.aether}", "javax.xml.bind:jaxb-api:2.3.0"
"org.eclipse.aether:aether-impl:${Versions.aether}",
"org.eclipse.aether:aether-connector-basic:${Versions.aether}",
"org.eclipse.aether:aether-transport-file:${Versions.aether}",
"org.eclipse.aether:aether-transport-http:${Versions.aether}",
"org.sonatype.aether:aether-api:${Versions.sonatypeAether}",
"org.sonatype.aether:aether-connector-wagon:1.13.1",
"org.apache.maven:maven-aether-provider:${Versions.maven}"
) )
exclude(*aether("impl", "spi", "util", "api"))
} }
@ -121,12 +142,8 @@ val kobaltPluginApi = project {
} }
} }
// install {
// libDir = "lib-test"
// }
kotlinCompiler { kotlinCompiler {
args("-nowarn") args("nowarn")
} }
bintray { bintray {
@ -142,26 +159,35 @@ val kobaltApp = project(kobaltPluginApi, wrapper) {
dependencies { dependencies {
// Used by the plugins // Used by the plugins
compile("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.0.3") compile("org.jetbrains.kotlin:kotlin-compiler-embeddable:${Versions.kotlin}")
// Used by the main app // Used by the main app
compile("com.github.spullara.mustache.java:compiler:0.9.1", compile(
"org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}",
"com.github.spullara.mustache.java:compiler:0.9.5",
"javax.inject:javax.inject:1", "javax.inject:javax.inject:1",
"com.google.inject:guice:4.0", "com.google.inject:guice:${Versions.guice}",
"com.google.inject.extensions:guice-assistedinject:4.0", "com.google.inject.extensions:guice-assistedinject:${Versions.guice}",
"com.beust:jcommander:1.48", "com.beust:jcommander:${Versions.jcommander}",
"org.apache.maven:maven-model:${Versions.maven}", "org.apache.maven:maven-model:${Versions.maven}",
"com.google.code.findbugs:jsr305:3.0.1", "com.google.code.findbugs:jsr305:3.0.2",
"com.google.code.gson:gson:${Versions.gson}", "com.google.code.gson:gson:${Versions.gson}",
"com.squareup.retrofit2:retrofit:${Versions.retrofit}", "com.squareup.retrofit2:retrofit:${Versions.retrofit}",
"com.squareup.retrofit2:converter-gson:${Versions.retrofit}", "com.squareup.retrofit2:converter-gson:${Versions.retrofit}",
"com.squareup.okhttp3:okhttp-ws:${Versions.okhttp}", // "com.squareup.okhttp3:okhttp-ws:3.4.2",
"org.codehaus.plexus:plexus-utils:3.0.22", "biz.aQute.bnd:biz.aQute.bndlib:3.5.0",
"biz.aQute.bnd:bndlib:2.4.0", *mavenResolver("spi"),
"com.squareup.okhttp3:logging-interceptor:3.2.0", "com.squareup.okhttp3:logging-interceptor:3.9.0",
"com.sparkjava:spark-core:2.5" "com.sparkjava:spark-core:2.6.0",
"org.codehaus.groovy:groovy:2.4.12",
// Java 9
"javax.xml.bind:jaxb-api:2.3.0",
"com.sun.xml.bind:jaxb-impl:2.3.0",
"com.sun.xml.bind:jaxb-core:2.3.0",
"com.sun.activation:javax.activation:1.2.0"
// "org.eclipse.jetty:jetty-server:${Versions.jetty}", // "org.eclipse.jetty:jetty-server:${Versions.jetty}",
// "org.eclipse.jetty:jetty-servlet:${Versions.jetty}", // "org.eclipse.jetty:jetty-servlet:${Versions.jetty}",
@ -175,8 +201,11 @@ val kobaltApp = project(kobaltPluginApi, wrapper) {
} }
dependenciesTest { dependenciesTest {
compile("org.testng:testng:6.9.11", compile("org.jetbrains.kotlin:kotlin-test:${Versions.kotlin}",
"org.assertj:assertj-core:3.4.1") "org.testng:testng:${Versions.testng}",
"org.assertj:assertj-core:3.8.0",
*mavenResolver("util")
)
} }
assemble { assemble {
@ -188,17 +217,27 @@ val kobaltApp = project(kobaltPluginApi, wrapper) {
} }
zip { zip {
val dir = "kobalt-$version" val dir = "kobalt-$version"
include(from("dist"), to("$dir/bin"), "kobaltw") val files = listOf(
include(from("dist"), to("$dir/bin"), "kobaltw.bat") "dist", "$dir/bin", "kobaltw",
include(from("$buildDirectory/libs"), to("$dir/kobalt/wrapper"), "dist", "$dir/bin", "kobaltw.bat",
"$projectName-$version.jar") "$buildDirectory/libs", "$dir/kobalt/wrapper", "$projectName-$version.jar",
include(from("modules/wrapper/$buildDirectory/libs"), to("$dir/kobalt/wrapper"), "modules/wrapper/$buildDirectory/libs", "$dir/kobalt/wrapper", "$projectName-wrapper.jar")
"$projectName-wrapper.jar")
(0 .. files.size - 1 step 3).forEach { i ->
include(from(files[i]), to(files[i + 1]), files[i + 2])
}
// Package the sources
val currentDir = Paths.get(".").toAbsolutePath().normalize().toString()
zipFolders("$currentDir/$buildDirectory/libs/all-sources/$projectName-$version-sources.jar",
"$currentDir/$directory/src/main/kotlin",
"$currentDir/${kobaltPluginApi.directory}/src/main/kotlin")
include(from("$buildDirectory/libs/all-sources"), to("$dir/kobalt/wrapper"), "$projectName-$version-sources.jar")
} }
} }
kotlinCompiler { kotlinCompiler {
args("-nowarn") args("nowarn")
} }
bintray { bintray {
@ -212,6 +251,32 @@ val kobaltApp = project(kobaltPluginApi, wrapper) {
test { test {
args("-log", "2", "src/test/resources/testng.xml") args("-log", "2", "src/test/resources/testng.xml")
} }
autoGitTag {
enabled = true
}
}
fun zipFolders(zipFilePath: String, vararg foldersPath: String) {
val zip = Paths.get(zipFilePath)
Files.deleteIfExists(zip)
Files.createDirectories(zip.parent)
val zipPath = Files.createFile(zip)
ZipOutputStream(Files.newOutputStream(zipPath)).use {
foldersPath.map {Paths.get(it)}.forEach { folderPath ->
Files.walk(folderPath)
.filter { path -> !Files.isDirectory(path) }
.forEach { path ->
val zipEntry = ZipEntry(folderPath.relativize(path).toString())
try {
it.putNextEntry(zipEntry)
Files.copy(path, it)
it.closeEntry()
} catch (e: Exception) {
}
}
}
}
} }
fun readVersion() : String { fun readVersion() : String {
@ -231,9 +296,31 @@ fun taskCopyVersionForWrapper(project: Project) : TaskResult {
File(toString).mkdirs() File(toString).mkdirs()
val from = Paths.get("src/main/resources/kobalt.properties") val from = Paths.get("src/main/resources/kobalt.properties")
val to = Paths.get("$toString/kobalt.properties") val to = Paths.get("$toString/kobalt.properties")
Files.copy(from, // Only copy if necessary so we don't break incremental compilation
to, if (! to.toFile().exists() || (from.toFile().readLines() != to.toFile().readLines())) {
StandardCopyOption.REPLACE_EXISTING) Files.copy(from,
to,
StandardCopyOption.REPLACE_EXISTING)
}
} }
return TaskResult() return TaskResult()
} }
fun createPom(projectName: String, projectDescription: String) = Model().apply {
name = projectName
description = projectDescription
url = "https://beust.com/kobalt"
licenses = listOf(License().apply {
name = "Apache-2.0"
url = "https://www.apache.org/licenses/LICENSE-2.0"
})
scm = Scm().apply {
url = "https://github.com/cbeust/kobalt"
connection = "https://github.com/cbeust/kobalt.git"
developerConnection = "git@github.com:cbeust/kobalt.git"
}
developers = listOf(Developer().apply {
name = "Cedric Beust"
email = "cedric@beust.com"
})
}

Binary file not shown.

View file

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

View file

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

8
kobaltw-test Executable file
View file

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

View file

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

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

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

View file

@ -1,428 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="kobalt-plugin-api" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="KOBALT" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/../../kobaltBuild/classes" />
<output-test url="file://$MODULE_DIR$/../../kobaltBuild/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/kotlin" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/kotlin" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<excludeFolder url="file://$MODULE_DIR$/kobaltBuild" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="inheritedJdk" />
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-api:jar:1.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-api/1.1.0/aether-api-1.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.ideaLibSources/aether-api-1.1.0-sources.jar!/" />
</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: org.apache.maven.wagon:wagon-provider-api:jar:1.0-beta-6">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/maven/wagon/wagon-provider-api/1.0-beta-6/wagon-provider-api-1.0-beta-6.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.sonatype.aether:aether-spi:jar:1.13.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/sonatype/aether/aether-spi/1.13.1/aether-spi-1.13.1.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-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.sonatype.sisu:sisu-inject-bean:jar:2.2.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/sonatype/sisu/sisu-inject-bean/2.2.3/sisu-inject-bean-2.2.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.sonatype.aether:aether-api:jar:1.13.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/sonatype/aether/aether-api/1.13.1/aether-api-1.13.1.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-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: org.eclipse.aether:aether-spi:jar:1.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-spi/1.1.0/aether-spi-1.1.0.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: org.codehaus.plexus:plexus-classworlds:jar:2.4">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/codehaus/plexus/plexus-classworlds/2.4/plexus-classworlds-2.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.okhttp3:okhttp:jar:3.2.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/okhttp3/okhttp/3.2.0/okhttp-3.2.0.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.sonatype.aether:aether-connector-wagon:jar:1.13.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/sonatype/aether/aether-connector-wagon/1.13.1/aether-connector-wagon-1.13.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-transport-http:jar:1.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-transport-http/1.1.0/aether-transport-http-1.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.ideaLibSources/aether-transport-http-1.1.0-sources.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.apache.httpcomponents:httpclient:jar:4.3.5">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/httpcomponents/httpclient/4.3.5/httpclient-4.3.5.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-transport-file:jar:1.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-transport-file/1.1.0/aether-transport-file-1.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.sonatype.aether:aether-util:jar:1.13.1">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/sonatype/aether/aether-util/1.13.1/aether-util-1.13.1.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.sonatype.sisu:sisu-guice:jar:no_aop:3.0.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/sonatype/sisu/sisu-guice/3.0.3/sisu-guice-3.0.3-no_aop.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.beust:jcommander:jar:1.48">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/beust/jcommander/1.48/jcommander-1.48.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: 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.httpcomponents:httpcore:jar:4.3.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.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: org.slf4j:slf4j-api:jar:1.6.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/slf4j/slf4j-api/1.6.2/slf4j-api-1.6.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.google.code.gson:gson:jar:2.6.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/google/code/gson/gson/2.6.2/gson-2.6.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-connector-basic:jar:1.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-connector-basic/1.1.0/aether-connector-basic-1.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.eclipse.aether:aether-util:jar:1.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-util/1.1.0/aether-util-1.1.0.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.eclipse.aether:aether-impl:jar:1.1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/eclipse/aether/aether-impl/1.1.0/aether-impl-1.1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: com.squareup.okio:okio:jar:1.6.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.sonatype.sisu:sisu-inject-plexus:jar:2.2.3">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/sonatype/sisu/sisu-inject-plexus/2.2.3/sisu-inject-plexus-2.2.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: 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: 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: 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: com.squareup.retrofit2:retrofit:jar:2.0.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/retrofit2/retrofit/2.0.2/retrofit-2.0.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="Kobalt: org.slf4j:slf4j-nop:jar:1.6.0">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/org/slf4j/slf4j-nop/1.6.0/slf4j-nop-1.6.0.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:converter-gson:jar:2.0.2">
<CLASSES>
<root url="jar://$USER_HOME$/.kobalt/cache/com/squareup/retrofit2/converter-gson/2.0.2/converter-gson-2.0.2.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="library" name="KotlinJavaRuntime" level="project" />
</component>
</module>

View file

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

View file

@ -0,0 +1,21 @@
package com.beust.kobalt
import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project
import com.beust.kobalt.archive.Zip
import com.beust.kobalt.misc.KFiles
import java.io.File
interface ArchiveGenerator {
fun findIncludedFiles(project: Project, context: KobaltContext, zip: Zip) : List<IncludedFile>
val suffix: String
fun generateArchive(project: Project, context: KobaltContext, zip: Zip, files: List<IncludedFile>) : File
fun fullArchiveName(project: Project, context: KobaltContext, archiveName: String?) : File {
val fullArchiveName = context.variant.archiveName(project, archiveName, suffix)
val archiveDir = File(KFiles.libsDir(project))
val result = File(archiveDir.path, fullArchiveName)
return result
}
}

View file

@ -7,7 +7,7 @@ class Args {
var targets: List<String> = arrayListOf() var targets: List<String> = arrayListOf()
@Parameter(names = arrayOf("-bf", "--buildFile"), description = "The build file") @Parameter(names = arrayOf("-bf", "--buildFile"), description = "The build file")
var buildFile: String? = null var buildFile: String? = "kobalt/src/Build.kt"
@Parameter(names = arrayOf("--checkVersions"), description = "Check if there are any newer versions of the " + @Parameter(names = arrayOf("--checkVersions"), description = "Check if there are any newer versions of the " +
"dependencies") "dependencies")
@ -22,6 +22,10 @@ class Args {
@Parameter(names = arrayOf("--download"), description = "Force a download from the downloadUrl in the wrapper") @Parameter(names = arrayOf("--download"), description = "Force a download from the downloadUrl in the wrapper")
var download: Boolean = false var download: Boolean = false
@Parameter(names = arrayOf("--downloadSources"),
description = "Force a download of sources and javadocs when resolving dependencies")
var downloadSources: Boolean = false
@Parameter(names = arrayOf("--dryRun"), description = "Display all the tasks that will get run without " + @Parameter(names = arrayOf("--dryRun"), description = "Display all the tasks that will get run without " +
"actually running them") "actually running them")
var dryRun: Boolean = false var dryRun: Boolean = false
@ -43,7 +47,7 @@ class Args {
var listTemplates: Boolean = false var listTemplates: Boolean = false
@Parameter(names = arrayOf("--log"), description = "Define the log level " + @Parameter(names = arrayOf("--log"), description = "Define the log level " +
"(${Constants.LOG_DEFAULT_LEVEL}-${Constants.LOG_MAX_LEVEL})") "(${Constants.LOG_QUIET_LEVEL}-${Constants.LOG_MAX_LEVEL})")
var log: Int = Constants.LOG_DEFAULT_LEVEL var log: Int = Constants.LOG_DEFAULT_LEVEL
@Parameter(names = arrayOf("--logTags"), @Parameter(names = arrayOf("--logTags"),
@ -57,8 +61,8 @@ 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("--parallel"), description = "Build all the projects in parallel whenever possible") @Parameter(names = arrayOf("--offline"), description = "Don't try to download dependencies even if there is no cached version")
var parallel: Boolean = false 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
@ -82,6 +86,16 @@ class Args {
@Parameter(names = arrayOf("--projectInfo"), description = "Display information about the current projects") @Parameter(names = arrayOf("--projectInfo"), description = "Display information about the current projects")
var projectInfo: Boolean = false var projectInfo: Boolean = false
@Parameter(names = arrayOf("--noIncrementalKotlin"), description = "Disable incremental Kotlin compilation")
var noIncrementalKotlin: Boolean = false
companion object {
const val SEQUENTIAL = "--sequential"
}
@Parameter(names = arrayOf(Args.SEQUENTIAL), description = "Build all the projects in sequence")
var sequential: Boolean = false
@Parameter(names = arrayOf("--server"), description = "Run in server mode") @Parameter(names = arrayOf("--server"), description = "Run in server mode")
var serverMode: Boolean = false var serverMode: Boolean = false
@ -90,5 +104,8 @@ class Args {
@Parameter(names = arrayOf("--update"), description = "Update to the latest version of Kobalt") @Parameter(names = arrayOf("--update"), description = "Update to the latest version of Kobalt")
var update: Boolean = false var update: Boolean = false
@Parameter(names = arrayOf("--version"), description = "Display the current version of Kobalt")
var version: Boolean = false
} }

View file

@ -17,16 +17,16 @@ class AsciiArt {
companion object { companion object {
private val BANNERS = arrayOf( private val BANNERS = arrayOf(
" __ __ __ __ __ \n" + " __ __ __ __ __ \n" +
" / //_/ ____ / /_ ____ _ / / / /_\n" + " / //_/ ____ / /_ ____ _ / / / /_\n" +
" / ,< / __ \\ / __ \\ / __ `/ / / / __/\n" + " / ,< / __ \\ / __ \\ / __ `/ / / / __/\n" +
" / /| | / /_/ / / /_/ // /_/ / / / / /_ \n" + " / /| | / /_/ / / /_/ // /_/ / / / / /_ \n" +
" /_/ |_| \\____/ /_.___/ \\__,_/ /_/ \\__/ ", " /_/ |_| \\____/ /_.___/ \\__,_/ /_/ \\__/ ",
" _ __ _ _ _ \n" + " _ __ _ _ _ \n" +
" | |/ / ___ | |__ __ _ | | | |_ \n" + " | |/ / ___ | |__ __ _ | | | |_ \n" +
" | ' / / _ \\ | '_ \\ / _` | | | | __|\n" + " | ' / / _ \\ | '_ \\ / _` | | | | __|\n" +
" | . \\ | (_) | | |_) | | (_| | | | | |_ \n" + " | . \\ | (_) | | |_) | | (_| | | | | |_ \n" +
" |_|\\_\\ \\___/ |_.__/ \\__,_| |_| \\__| " " |_|\\_\\ \\___/ |_.__/ \\__,_| |_| \\__| "
) )
val banner : String get() = BANNERS[Random().nextInt(BANNERS.size)] val banner : String get() = BANNERS[Random().nextInt(BANNERS.size)]
@ -85,7 +85,7 @@ class AsciiArt {
} }
fun logBox(s: String, bl: String = bottomLeft, br: String = bottomRight, indent: Int = 0) fun logBox(s: String, bl: String = bottomLeft, br: String = bottomRight, indent: Int = 0)
= logBox(listOf(s), bl, br, indent) = logBox(listOf(s), bl, br, indent)
fun fill(n: Int) = buildString { repeat(n, { append(" ")})}.toString() fun fill(n: Int) = buildString { repeat(n, { append(" ")})}.toString()
@ -105,7 +105,7 @@ class AsciiArt {
const val CYAN = "\u001B[36m" const val CYAN = "\u001B[36m"
const val WHITE = "\u001B[37m" const val WHITE = "\u001B[37m"
private fun wrap(s: CharSequence, color: String) = color + s + RESET fun wrap(s: CharSequence, color: String) = color + s + RESET
private fun blue(s: CharSequence) = wrap(s, BLUE) private fun blue(s: CharSequence) = wrap(s, BLUE)
private fun red(s: CharSequence) = wrap(s, RED) private fun red(s: CharSequence) = wrap(s, RED)
private fun yellow(s: CharSequence) = wrap(s, YELLOW) private fun yellow(s: CharSequence) = wrap(s, YELLOW)
@ -141,18 +141,18 @@ class AsciiTable {
fun build() : String { fun build() : String {
val formattedHeaders = val formattedHeaders =
headers.mapIndexed { index, s -> headers.mapIndexed { index, s ->
val s2 = col(widths[index], s) val s2 = col(widths[index], s)
s2 s2
}.joinToString(vb) }.joinToString(vb)
val result = StringBuffer().apply { val result = StringBuffer().apply {
append(AsciiArt.logBox(formattedHeaders, AsciiArt.bottomLeft2, AsciiArt.bottomRight2)) append(AsciiArt.logBox(formattedHeaders, AsciiArt.bottomLeft2, AsciiArt.bottomRight2))
append("\n") append("\n")
} }
var lineLength = 0 var lineLength = 0
rows.forEachIndexed { index, row -> rows.forEachIndexed { _, row ->
val formattedRow = row.mapIndexed { i, s -> col(widths[i], s) }.joinToString(vb) val formattedRow = row.mapIndexed { i, s -> col(widths[i], s) }.joinToString(vb)
val line = vb + " " + formattedRow + " " + vb val line = "$vb $formattedRow $vb"
result.append(line).append("\n") result.append(line).append("\n")
lineLength = line.length lineLength = line.length
} }

View file

@ -7,10 +7,42 @@ import com.beust.kobalt.internal.KobaltSettings
import com.beust.kobalt.internal.PluginInfo import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.dependency.FileDependency import com.beust.kobalt.maven.dependency.FileDependency
import com.beust.kobalt.misc.KobaltLogger
import org.eclipse.aether.repository.Proxy import org.eclipse.aether.repository.Proxy
import java.io.File import java.io.File
import java.net.InetSocketAddress import java.net.InetSocketAddress
var BUILD_SCRIPT_CONFIG : BuildScriptConfig? = null
class BuildScriptConfig {
/** The list of repos used to locate plug-ins. */
@Directive
fun repos(vararg r: String) = newRepos(*r)
/** The list of plug-ins to use for this build file. */
@Directive
fun plugins(vararg pl: String) = newPlugins(*pl)
/** The build file classpath. */
@Directive
fun buildFileClasspath(vararg bfc: String) = newBuildFileClasspath(*bfc)
/** Options passed to Kobalt */
@Directive
fun kobaltOptions(vararg options: String) = Kobalt.addKobaltOptions(options)
/** Where to find additional build files */
@Directive
fun buildSourceDirs(vararg dirs: String) = Kobalt.addBuildSourceDirs(dirs)
// The following settings modify the compiler used to compile the build file, which regular users should
// probably never need to do. Projects should use kotlinCompiler { compilerVersion } to configure the
// Kotin compiler for their source files.
var kobaltCompilerVersion : String? = null
var kobaltCompilerRepo: String? = null
var kobaltCompilerFlags: String? = null
}
@Directive @Directive
fun homeDir(vararg dirs: String) : String = SystemProperties.homeDir + fun homeDir(vararg dirs: String) : String = SystemProperties.homeDir +
File.separator + dirs.toMutableList().joinToString(File.separator) File.separator + dirs.toMutableList().joinToString(File.separator)
@ -18,13 +50,18 @@ fun homeDir(vararg dirs: String) : String = SystemProperties.homeDir +
@Directive @Directive
fun file(file: String) : String = FileDependency.PREFIX_FILE + file fun file(file: String) : String = FileDependency.PREFIX_FILE + file
@Directive
fun plugins(vararg dependency : IClasspathDependency) { fun plugins(vararg dependency : IClasspathDependency) {
dependency.forEach { Plugins.addDynamicPlugin(it) } dependency.forEach { Plugins.addDynamicPlugin(it) }
} }
@Directive
fun plugins(vararg dependencies : String) { fun plugins(vararg dependencies : String) {
KobaltLogger.logger.warn("Build.kt",
"Invoking plugins() directly is deprecated, use the buildScript{} directive")
newPlugins(*dependencies)
}
@Directive
fun newPlugins(vararg dependencies : String) {
val factory = Kobalt.INJECTOR.getInstance(DependencyManager::class.java) val factory = Kobalt.INJECTOR.getInstance(DependencyManager::class.java)
dependencies.forEach { dependencies.forEach {
Plugins.addDynamicPlugin(factory.create(it)) Plugins.addDynamicPlugin(factory.create(it))
@ -37,7 +74,18 @@ data class ProxyConfig(val host: String = "", val port: Int = 0, val type: Strin
fun toAetherProxy() = Proxy(type, host, port) // TODO make support for proxy auth fun toAetherProxy() = Proxy(type, host, port) // TODO make support for proxy auth
} }
data class HostConfig(var url: String = "", var username: String? = null, var password: String? = null) { data class HostConfig(var url: String = "", var name: String = HostConfig.createRepoName(url),
var username: String? = null, var password: String? = null) {
companion object {
/**
* For repos specified in the build file (repos()) that don't have an associated unique name,
* create such a name from the URL. This is a requirement from Maven Resolver, and failing to do
* this leads to very weird resolution errors.
*/
private fun createRepoName(url: String) = url.replace("/", "_").replace("\\", "_").replace(":", "_")
}
fun hasAuth() : Boolean { fun hasAuth() : Boolean {
return (! username.isNullOrBlank()) && (! password.isNullOrBlank()) return (! username.isNullOrBlank()) && (! password.isNullOrBlank())
} }
@ -51,13 +99,24 @@ data class HostConfig(var url: String = "", var username: String? = null, var pa
} }
} }
@Directive
fun repos(vararg repos : String) { fun repos(vararg repos : String) {
KobaltLogger.logger.warn("Build.kt",
"Invoking repos() directly is deprecated, use the buildScript{} directive")
newRepos(*repos)
}
fun newRepos(vararg repos: String) {
repos.forEach { Kobalt.addRepo(HostConfig(it)) } repos.forEach { Kobalt.addRepo(HostConfig(it)) }
} }
@Directive
fun buildFileClasspath(vararg deps: String) { fun buildFileClasspath(vararg deps: String) {
KobaltLogger.logger.warn("Build.kt",
"Invoking buildFileClasspath() directly is deprecated, use the buildScript{} directive")
newBuildFileClasspath(*deps)
}
fun newBuildFileClasspath(vararg deps: String) {
//FIXME newBuildFileClasspath called twice
deps.forEach { Kobalt.addBuildFileClasspath(it) } deps.forEach { Kobalt.addBuildFileClasspath(it) }
} }
@ -67,7 +126,7 @@ fun authRepos(vararg repos : HostConfig) {
} }
@Directive @Directive
fun authRepo(init: HostConfig.() -> Unit) = HostConfig().apply { init() } fun authRepo(init: HostConfig.() -> Unit) = HostConfig(name = "").apply { init() }
@Directive @Directive
fun glob(g: String) : IFileSpec.GlobSpec = IFileSpec.GlobSpec(g) fun glob(g: String) : IFileSpec.GlobSpec = IFileSpec.GlobSpec(g)

View file

@ -3,18 +3,19 @@ package com.beust.kobalt
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
object Constants { object Constants {
const val LOG_QUIET_LEVEL = 0
const val LOG_DEFAULT_LEVEL = 1 const val LOG_DEFAULT_LEVEL = 1
const val LOG_MAX_LEVEL = 3 const val LOG_MAX_LEVEL = 3
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"
internal val DEFAULT_REPOS = listOf<String>( internal val DEFAULT_REPOS = listOf<HostConfig>(
// "https://maven-central.storage.googleapis.com/", // "https://maven-central.storage.googleapis.com/",
"http://repo1.maven.org/maven2/", HostConfig("https://repo1.maven.org/maven2/", "Maven"),
"https://jcenter.bintray.com/", HostConfig("https://jcenter.bintray.com/", "JCenter")
"http://repository.jetbrains.com/all/", // "https://repository.jetbrains.com/all/", // <-- contains snapshots
"https://dl.bintray.com/kotlin/kotlin-eap"
// snapshots // snapshots
// "https://oss.sonatype.org/content/repositories/snapshots/" // "https://oss.sonatype.org/content/repositories/snapshots/"

View file

@ -4,9 +4,11 @@ import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.internal.JvmCompilerPlugin import com.beust.kobalt.internal.JvmCompilerPlugin
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
@Directive @Directive
public fun project(vararg projects: Project, init: Project.() -> Unit): Project { fun project(vararg projects: Project, init: Project.() -> Unit): Project {
return Project("").apply { return Project("").apply {
init() init()
(Kobalt.findPlugin(JvmCompilerPlugin.PLUGIN_NAME) as JvmCompilerPlugin) (Kobalt.findPlugin(JvmCompilerPlugin.PLUGIN_NAME) as JvmCompilerPlugin)
@ -14,3 +16,24 @@ public fun project(vararg projects: Project, init: Project.() -> Unit): Project
} }
} }
@Directive
fun buildScript(init: BuildScriptConfig.() -> Unit): BuildScriptConfig {
val buildScriptConfig = BuildScriptConfig().apply { init() }
BUILD_SCRIPT_CONFIG = buildScriptConfig
return buildScriptConfig
}
@Directive
fun profile(): ReadWriteProperty<Nothing?, Boolean> {
val result = object: ReadWriteProperty<Nothing?, Boolean> {
var value: Boolean = false
override operator fun getValue(thisRef: Nothing?, property: KProperty<*>): Boolean {
return value
}
override operator fun setValue(thisRef: Nothing?, property: KProperty<*>, value: Boolean) {
this.value = value
}
}
return result
}

View file

@ -28,15 +28,15 @@ sealed class IFileSpec {
private fun isIncluded(includeMatchers: Glob, excludes: List<Glob>, rel: Path) : Boolean { private fun isIncluded(includeMatchers: Glob, excludes: List<Glob>, rel: Path) : Boolean {
excludes.forEach { excludes.forEach {
if (it.matches(rel)) { if (it.matches(rel)) {
kobaltLog(3, "Excluding ${rel.toFile()}") kobaltLog(3, " Excluding ${rel.toFile()}")
return false return false
} }
} }
if (includeMatchers.matches(rel)) { if (includeMatchers.matches(rel)) {
kobaltLog(3, "Including ${rel.toFile().path}") kobaltLog(3, " Including ${rel.toFile().path}")
return true return true
} }
kobaltLog(2, "Excluding ${rel.toFile()} (not matching any include pattern") kobaltLog(2, " Excluding ${rel.toFile()} (not matching any include pattern")
return false return false
} }

View file

@ -0,0 +1,43 @@
package com.beust.kobalt
import com.beust.kobalt.api.annotation.Directive
import java.io.File
/**
* Base classes for directives that support install(from,to) (e.g. install{} or jar{}).
*/
open class IncludeFromTo {
/**
* Prefix path to be removed from the zip file. For example, if you add "build/lib/a.jar" to the zip
* file and the excludePrefix is "build/lib", then "a.jar" will be added at the root of the zip file.
*/
val includedFiles = arrayListOf<IncludedFile>()
@Directive
fun from(s: String) = From(s)
@Directive
fun to(s: String) = To(s)
@Directive
fun copy(from: From, to: To) {
val dir = File(from.path).absoluteFile.parentFile
includedFiles.add(IncludedFile(from(dir.absolutePath), to, listOf(IFileSpec.FileSpec(from.path))))
}
@Directive
fun include(vararg files: String) {
includedFiles.add(IncludedFile(files.map { IFileSpec.FileSpec(it) }))
}
@Directive
fun include(from: From, to: To, vararg specs: String) {
includedFiles.add(IncludedFile(from, to, specs.map { IFileSpec.FileSpec(it) }))
}
@Directive
fun include(from: From, to: To, vararg specs: IFileSpec.GlobSpec) {
includedFiles.add(IncludedFile(from, to, listOf(*specs)))
}
}

View file

@ -0,0 +1,44 @@
package com.beust.kobalt
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.toString
import java.io.File
import java.nio.file.Paths
class IncludedFile(val fromOriginal: From, val toOriginal: To, val specs: List<IFileSpec>,
val expandJarFiles: Boolean = false) {
constructor(specs: List<IFileSpec>, expandJarFiles: Boolean = false) : this(From(""), To(""), specs, expandJarFiles)
fun from(s: String) = File(if (fromOriginal.isCurrentDir()) s else KFiles.joinDir(from, s))
val from: String get() = fromOriginal.path.replace("\\", "/")
fun to(s: String) = File(if (toOriginal.isCurrentDir()) s else KFiles.joinDir(to, s))
val to: String get() = toOriginal.path.replace("\\", "/")
override fun toString() = toString("IncludedFile",
"files - ", specs.map { it.toString() },
"from", from,
"to", to)
fun allFromFiles(directory: String? = null): List<File> {
val result = arrayListOf<File>()
specs.forEach { spec ->
// val fullDir = if (directory == null) from else KFiles.joinDir(directory, from)
spec.toFiles(directory, from).forEach { source ->
result.add(if (source.isAbsolute) source else File(source.path))
}
}
return result.map { Paths.get(it.path).normalize().toFile()}
}
}
open class Direction(open val p: String) {
override fun toString() = path
fun isCurrentDir() = path == "./"
val path: String get() =
if (p.isEmpty()) "./"
else if (p.startsWith("/") || p.endsWith("/")) p
else p + "/"
}
class From(override val p: String) : Direction(p)
class To(override val p: String) : Direction(p)

View file

@ -3,22 +3,22 @@ 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.Jar import com.beust.kobalt.archive.MetaArchive
import com.beust.kobalt.internal.ParallelLogger 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
import com.beust.kobalt.misc.* import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.kobaltLog
import com.google.inject.Inject import com.google.inject.Inject
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.OutputStream
import java.nio.file.Paths import java.nio.file.Paths
import java.util.jar.JarOutputStream
import java.util.jar.Manifest import java.util.jar.Manifest
class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) { class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) : ArchiveGenerator {
companion object { companion object {
fun findIncludedFiles(directory: String, files: List<IncludedFile>, excludes: List<Glob>) fun findIncludedFiles(directory: String, files: List<IncludedFile>, excludes: List<Glob>,
throwOnError: Boolean = true)
: List<IncludedFile> { : List<IncludedFile> {
val result = arrayListOf<IncludedFile>() val result = arrayListOf<IncludedFile>()
files.forEach { includedFile -> files.forEach { includedFile ->
@ -28,7 +28,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
if (File(directory, fromPath).exists()) { if (File(directory, fromPath).exists()) {
spec.toFiles(directory, fromPath).forEach { file -> spec.toFiles(directory, fromPath).forEach { file ->
val fullFile = File(KFiles.joinDir(directory, fromPath, file.path)) val fullFile = File(KFiles.joinDir(directory, fromPath, file.path))
if (! fullFile.exists()) { if (! fullFile.exists() && throwOnError) {
throw AssertionError("File should exist: $fullFile") throw AssertionError("File should exist: $fullFile")
} }
@ -41,7 +41,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
} }
} else { } else {
kobaltLog(2, "Directory $fromPath doesn't exist, not including it in the jar") kobaltLog(2, " Directory $fromPath doesn't exist, not including it in the jar")
} }
} }
if (includedSpecs.size > 0) { if (includedSpecs.size > 0) {
@ -53,7 +53,9 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
} }
} }
fun findIncludedFiles(project: Project, context: KobaltContext, jar: Jar) : List<IncludedFile> { override val suffix = ".jar"
override fun findIncludedFiles(project: Project, context: KobaltContext, zip: Zip) : List<IncludedFile> {
// //
// Add all the applicable files for the current project // Add all the applicable files for the current project
// //
@ -61,7 +63,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
val result = arrayListOf<IncludedFile>() val result = arrayListOf<IncludedFile>()
val classesDir = KFiles.makeDir(buildDir.path, "classes") val classesDir = KFiles.makeDir(buildDir.path, "classes")
if (jar.includedFiles.isEmpty()) { if (zip.includedFiles.isEmpty()) {
// If no includes were specified, assume the user wants a simple jar file made of the // If no includes were specified, assume the user wants a simple jar file made of the
// classes of the project, so we specify a From("build/classes/"), To("") and // classes of the project, so we specify a From("build/classes/"), To("") and
// a list of files containing everything under it // a list of files containing everything under it
@ -71,7 +73,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
// Class files // Class files
val files = KFiles.findRecursively(classesDir).map { File(relClassesDir.toFile(), it) } val files = KFiles.findRecursively(classesDir).map { File(relClassesDir.toFile(), it) }
val filesNotExcluded : List<File> = files.filter { val filesNotExcluded : List<File> = files.filter {
! KFiles.Companion.isExcluded(KFiles.joinDir(project.directory, it.path), jar.excludes) ! KFiles.Companion.isExcluded(KFiles.joinDir(project.directory, it.path), zip.excludes)
} }
val fileSpecs = arrayListOf<IFileSpec>() val fileSpecs = arrayListOf<IFileSpec>()
filesNotExcluded.forEach { filesNotExcluded.forEach {
@ -87,16 +89,14 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
// //
// The user specified an include, just use it verbatim // The user specified an include, just use it verbatim
// //
val includedFiles = findIncludedFiles(project.directory, jar.includedFiles, jar.excludes) val includedFiles = findIncludedFiles(project.directory, zip.includedFiles, zip.excludes, false)
result.addAll(includedFiles) result.addAll(includedFiles)
} }
// //
// If fatJar is true, add all the transitive dependencies as well: compile, runtime and dependent projects // If fatJar is true, add all the transitive dependencies as well: compile, runtime and dependent projects
// //
if (jar.fatJar) { if (zip.fatJar) {
context.logger.log(project.name, 2, "Finding included files for fat jar")
val seen = hashSetOf<String>() val seen = hashSetOf<String>()
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val allDependencies = project.compileDependencies + project.compileRuntimeDependencies + val allDependencies = project.compileDependencies + project.compileRuntimeDependencies +
@ -105,13 +105,13 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
context.variant.productFlavor.compileDependencies + context.variant.productFlavor.compileDependencies +
context.variant.productFlavor.compileRuntimeDependencies context.variant.productFlavor.compileRuntimeDependencies
val transitiveDependencies = dependencyManager.calculateDependencies(project, context, val transitiveDependencies = dependencyManager.calculateDependencies(project, context,
listOf(Scope.COMPILE), allDependencies) scopes = listOf(Scope.COMPILE), passedDependencies = allDependencies)
transitiveDependencies.map { transitiveDependencies.map {
it.jarFile.get() it.jarFile.get()
}.forEach { file : File -> }.forEach { file : File ->
if (! seen.contains(file.path)) { if (! seen.contains(file.path)) {
seen.add(file.path) seen.add(file.path)
if (! KFiles.Companion.isExcluded(file, jar.excludes)) { if (! KFiles.Companion.isExcluded(file, zip.excludes)) {
result.add(IncludedFile(specs = arrayListOf(IFileSpec.FileSpec(file.absolutePath)), result.add(IncludedFile(specs = arrayListOf(IFileSpec.FileSpec(file.absolutePath)),
expandJarFiles = true)) expandJarFiles = true))
} }
@ -122,19 +122,18 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager)
return result return result
} }
fun generateJar(project: Project, context: KobaltContext, jar: Jar, kobaltLog: ParallelLogger) : File { override fun generateArchive(project: Project, context: KobaltContext, zip: Zip,
val includedFiles = findIncludedFiles(project, context, jar) includedFiles: List<IncludedFile>) : File {
// //
// Generate the manifest // Generate the manifest
// If manifest attributes were specified in the build file, use those to generateAndSave the manifest. Otherwise, // If manifest attributes were specified in the build file, use those to generateAndSave the manifest. Otherwise,
// try to find a META-INF/MANIFEST.MF and use that one if we find any. Otherwise, use the default manifest. // try to find a META-INF/MANIFEST.MF and use that one if we find any. Otherwise, use the default manifest.
// //
val manifest = val manifest =
if (jar.attributes.size > 1) { if (zip.attributes.size > 1) {
context.logger.log(project.name, 2, "Creating MANIFEST.MF from " + jar.attributes.size + " attributes") context.logger.log(project.name, 2, "Creating MANIFEST.MF from " + zip.attributes.size + " attributes")
Manifest().apply { Manifest().apply {
jar.attributes.forEach { attribute -> zip.attributes.forEach { attribute ->
mainAttributes.putValue(attribute.first, attribute.second) mainAttributes.putValue(attribute.first, attribute.second)
} }
} }
@ -143,7 +142,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("META-INF/MANIFEST.MF") } val manifestFiles = allFiles.filter { it.path.contains(MetaArchive.MANIFEST_MF) }
return if (manifestFiles.any()) manifestFiles[0] else null return if (manifestFiles.any()) manifestFiles[0] else null
} }
@ -152,14 +151,12 @@ 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 {
Manifest() null
} }
} }
val jarFactory = { os: OutputStream -> JarOutputStream(os, manifest) } return Archives.generateArchive(project, context, zip.name, ".jar", includedFiles,
true /* expandJarFiles */, manifest)
return Archives.generateArchive(project, context, jar.name, ".jar", includedFiles,
true /* expandJarFiles */, jarFactory)
} }
} }

View file

@ -2,18 +2,18 @@ package com.beust.kobalt
import java.io.File import java.io.File
abstract public class JavaInfo { abstract class JavaInfo {
public var javaExecutable: File? = null val javaExecutable: File?
get() = findExecutable("java") get() = findExecutable("java")
public var javacExecutable: File? = null val javacExecutable: File?
get() = findExecutable("javac") get() = findExecutable("javac")
public var javadocExecutable: File? = null val javadocExecutable: File?
get() = findExecutable("javadoc") get() = findExecutable("javadoc")
abstract public var javaHome: File? abstract var javaHome: File?
abstract public var runtimeJar: File? abstract var runtimeJar: File?
abstract public var toolsJar: File? abstract var toolsJar: File?
abstract public fun findExecutable(command: String) : File abstract fun findExecutable(command: String) : File
companion object { companion object {
fun create(javaBase: File?): Jvm { fun create(javaBase: File?): Jvm {

View file

@ -5,14 +5,14 @@ import com.beust.kobalt.misc.warn
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
public open class Jvm constructor( open class Jvm constructor(
val os: OperatingSystem, val os: OperatingSystem,
var javaBase: File? = null) : JavaInfo() { var javaBase: File? = null) : JavaInfo() {
private var _javaHome: File? = null private var _javaHome: File? = null
override public var javaHome: File? = null override var javaHome: File? = null
get() = _javaHome!! get() = _javaHome!!
override public var runtimeJar: File? = null override var runtimeJar: File? = null
private fun findRuntimeJar() : File? { private fun findRuntimeJar() : File? {
var runtimeJar = File(javaBase, "lib/rt.jar") var runtimeJar = File(javaBase, "lib/rt.jar")
if (runtimeJar.exists()) { if (runtimeJar.exists()) {
@ -21,7 +21,7 @@ public open class Jvm constructor(
runtimeJar = File(javaBase, "jre/lib/rt.jar") runtimeJar = File(javaBase, "jre/lib/rt.jar")
return if (runtimeJar.exists()) runtimeJar else null return if (runtimeJar.exists()) runtimeJar else null
} }
override public var toolsJar: File? = null override var toolsJar: File? = null
private var userSupplied: Boolean? = false private var userSupplied: Boolean? = false
private var javaVersion: String? = null private var javaVersion: String? = null
@ -67,7 +67,7 @@ public 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 @@ public 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
@ -89,7 +89,7 @@ public open class Jvm constructor(
return null return null
} }
// open public fun isIbmJvm(): Boolean { // open fun isIbmJvm(): Boolean {
// return false // return false
// } // }
@ -97,7 +97,7 @@ public open class Jvm constructor(
if (javaHome != null) { if (javaHome != null) {
val jdkHome = if (javaHome!!.endsWith("jre")) javaHome!!.parentFile else javaHome val jdkHome = if (javaHome!!.endsWith("jre")) javaHome!!.parentFile else javaHome
val exec = File(jdkHome, "bin/" + command) val exec = File(jdkHome, "bin/" + command)
var executable = File(os.getExecutableName(exec.absolutePath)) val executable = File(os.getExecutableName(exec.absolutePath))
if (executable.isFile) { if (executable.isFile) {
return executable return executable
} }

View file

@ -4,11 +4,14 @@ import com.beust.kobalt.api.*
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.internal.IncrementalManager import com.beust.kobalt.internal.IncrementalManager
import com.beust.kobalt.internal.KobaltSettings
import com.beust.kobalt.internal.PluginInfo import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.internal.TaskManager import com.beust.kobalt.internal.TaskManager
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.LocalRepo import com.beust.kobalt.misc.JarUtils
import com.beust.kobalt.misc.* import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.KobaltExecutors
import com.beust.kobalt.misc.kobaltLog
import com.google.inject.Provider import com.google.inject.Provider
import java.io.File import java.io.File
import java.lang.reflect.Method import java.lang.reflect.Method
@ -23,9 +26,8 @@ import javax.inject.Singleton
class Plugins @Inject constructor (val taskManagerProvider : Provider<TaskManager>, class Plugins @Inject constructor (val taskManagerProvider : Provider<TaskManager>,
val files: KFiles, val files: KFiles,
val depManager: DependencyManager, val depManager: DependencyManager,
val localRepo: LocalRepo, val settings: KobaltSettings,
val executors: KobaltExecutors, val executors: KobaltExecutors,
val pluginInfo: PluginInfo,
val incrementalManagerFactory: IncrementalManager.IFactory, val incrementalManagerFactory: IncrementalManager.IFactory,
val taskManager: TaskManager) { val taskManager: TaskManager) {
@ -168,6 +170,9 @@ class Plugins @Inject constructor (val taskManagerProvider : Provider<TaskManage
val dependencies = arrayListOf<IClasspathDependency>() val dependencies = arrayListOf<IClasspathDependency>()
// @Inject
// lateinit var pluginInfo: PluginInfo
fun installPlugins(dependencies: List<IClasspathDependency>, scriptClassLoader: ClassLoader) { fun installPlugins(dependencies: List<IClasspathDependency>, scriptClassLoader: ClassLoader) {
val executor = executors.newExecutor("Plugins", 5) val executor = executors.newExecutor("Plugins", 5)
dependencies.forEach { dependencies.forEach {
@ -188,6 +193,8 @@ class Plugins @Inject constructor (val taskManagerProvider : Provider<TaskManage
// The plug-in is pointing to a jar file, read kobalt-plugin.xml from it // The plug-in is pointing to a jar file, read kobalt-plugin.xml from it
JarUtils.extractTextFile(JarFile(file), PluginInfo.PLUGIN_XML) JarUtils.extractTextFile(JarFile(file), PluginInfo.PLUGIN_XML)
} }
val pluginInfo = Kobalt.INJECTOR.getInstance(PluginInfo::class.java)
if (pluginXml != null) { if (pluginXml != null) {
val pluginClassLoader = URLClassLoader(arrayOf(file.toURI().toURL())) val pluginClassLoader = URLClassLoader(arrayOf(file.toURI().toURL()))
val thisPluginInfo = PluginInfo.readPluginXml(pluginXml, pluginClassLoader, scriptClassLoader) val thisPluginInfo = PluginInfo.readPluginXml(pluginXml, pluginClassLoader, scriptClassLoader)

View file

@ -3,11 +3,11 @@ package com.beust.kobalt
import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.IClasspathDependency
import com.beust.kobalt.maven.LocalRepo import com.beust.kobalt.maven.LocalRepo
import com.beust.kobalt.maven.MavenId import com.beust.kobalt.maven.MavenId
import com.beust.kobalt.maven.aether.KobaltAether import com.beust.kobalt.maven.aether.*
import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.misc.*
import com.beust.kobalt.misc.Node
import com.beust.kobalt.misc.kobaltLog
import com.google.inject.Inject import com.google.inject.Inject
import org.eclipse.aether.artifact.DefaultArtifact
import org.eclipse.aether.graph.DependencyNode
import java.util.* import java.util.*
/** /**
@ -15,7 +15,7 @@ import java.util.*
*/ */
class ResolveDependency @Inject constructor( class ResolveDependency @Inject constructor(
val localRepo: LocalRepo, val localRepo: LocalRepo,
val aether: KobaltAether, val aether: KobaltMavenResolver,
val executors: KobaltExecutors) { val executors: KobaltExecutors) {
val increment = 8 val increment = 8
val leftFirst = "\u2558" val leftFirst = "\u2558"
@ -27,11 +27,35 @@ class ResolveDependency @Inject constructor(
fun run(id: String) = displayDependenciesFor(id) fun run(id: String) = displayDependenciesFor(id)
private fun latestMavenArtifact(group: String, artifactId: String, extension: String = "jar"): DependencyNode {
val artifact = DefaultArtifact(group, artifactId, extension, "(0,]")
val resolved = aether.resolveRange(artifact)
if (resolved != null) {
val newArtifact = DefaultArtifact(artifact.groupId, artifact.artifactId, artifact.extension,
resolved.highestVersion.toString())
val artifactResult = aether.resolve(KobaltMavenResolver.artifactToId(newArtifact), null)
return artifactResult.root
} else {
throw KobaltException("Couldn't find latest artifact for $group:$artifactId")
}
}
class PairResult(val dependency: IClasspathDependency, val repoUrl: String)
fun latestArtifact(group: String, artifactId: String, extension: String = "jar"): PairResult
= latestMavenArtifact(group, artifactId, extension).let {
PairResult(AetherDependency(it.artifact), "(TBD repo)")
}
private fun displayDependenciesFor(id: String) { private fun displayDependenciesFor(id: String) {
val mavenId = MavenId.create(id) val mavenId = MavenId.create(id)
val resolved = val resolved : PairResult =
if (mavenId.hasVersion) aether.resolve(id) if (mavenId.hasVersion) {
else aether.latestArtifact(mavenId.groupId, mavenId.artifactId) val node = aether.resolve(id, filter = Filters.EXCLUDE_OPTIONAL_FILTER)
PairResult(AetherDependency(node.root.artifact), node.artifactResults[0].repository.toString())
} else {
latestArtifact(mavenId.groupId, mavenId.artifactId)
}
displayDependencies(resolved.dependency, resolved.repoUrl) displayDependencies(resolved.dependency, resolved.repoUrl)
} }
@ -45,7 +69,7 @@ class ResolveDependency @Inject constructor(
kobaltLog(1, AsciiArt.logBox(listOf(dep.id, url, dep.jarFile.get()).map { " $it" })) kobaltLog(1, AsciiArt.logBox(listOf(dep.id, url, dep.jarFile.get()).map { " $it" }))
display(root.children) display(root.children)
println("") kobaltLog(1, "")
} }
private fun display(nodes: List<Node<Dep>>) { private fun display(nodes: List<Node<Dep>>) {
@ -57,10 +81,12 @@ class ResolveDependency @Inject constructor(
else leftMiddle else leftMiddle
val indent = level * increment val indent = level * increment
for(i in 0..indent - 2) { for(i in 0..indent - 2) {
if (i % increment == 0) print(vertical) if (!KobaltLogger.isQuiet) {
else print(" ") if (i == 0 || ((i + 1) % increment == 0)) print(vertical)
else print(" ")
}
} }
println(left + " " + dep.id) kobaltLog(1, left + " " + dep.id + (if (dep.optional) " (optional)" else ""))
display(node.children) display(node.children)
} }
} }
@ -76,7 +102,12 @@ class ResolveDependency @Inject constructor(
kobaltLog(2, "Found dependency ${dep.dep.id} level: ${dep.level}") kobaltLog(2, "Found dependency ${dep.dep.id} level: ${dep.level}")
result.add(node) result.add(node)
seen.add(it.id) seen.add(it.id)
node.addChildren(findChildren(node, seen)) try {
node.addChildren(findChildren(node, seen))
} catch(ex: Exception) {
if (! it.optional) warn("Couldn't resolve " + node)
// else don't warn about missing optional dependencies
}
} }
} }
kobaltLog(2, "Children for ${root.value.dep.id}: ${result.size}") kobaltLog(2, "Children for ${root.value.dep.id}: ${result.size}")

View file

@ -1,9 +1,17 @@
package com.beust.kobalt package com.beust.kobalt
public class SystemProperties { class SystemProperties {
companion object { companion object {
val javaBase = System.getProperty("java.home") ?: val javaBase : String
(System.getenv("JAVA_HOME") ?: throw IllegalArgumentException("JAVA_HOME not defined")) get() {
val jh = System.getenv("JAVA_HOME")
?: System.getProperty("java.home")
?: 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

@ -1,3 +1,8 @@
package com.beust.kobalt package com.beust.kobalt
open public class TaskResult(val success: Boolean = true, val errorMessage: String? = null) class TestResult(val success: Boolean, val shortMessage: String? = null, val longMessage: String? = null)
open class TaskResult(val success: Boolean = true,
val testResult: TestResult? = null,
val errorMessage: String? = null
)

View file

@ -0,0 +1,40 @@
package com.beust.kobalt
import com.beust.kobalt.api.Project
import com.beust.kobalt.api.annotation.Directive
class TestConfig(val project: Project, val isDefault : Boolean = false) {
val testArgs = arrayListOf<String>()
val jvmArgs = arrayListOf<String>()
val testIncludes = arrayListOf("**/*Test.class")
val testExcludes = arrayListOf<String>()
@Directive
var name: String = ""
@Directive
fun args(vararg arg: String) {
testArgs.addAll(arg)
}
@Directive
fun jvmArgs(vararg arg: String) {
jvmArgs.addAll(arg)
}
@Directive
fun include(vararg arg: String) {
testIncludes.apply {
clear()
addAll(arg)
}
}
@Directive
fun exclude(vararg arg: String) {
testExcludes.apply {
clear()
addAll(arg)
}
}
}

View file

@ -3,43 +3,13 @@ package com.beust.kobalt
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Directive
class TestConfig(val project: Project, val isDefault : Boolean = false) {
val testArgs = arrayListOf<String>()
val jvmArgs = arrayListOf<String>()
val testIncludes = arrayListOf("**/*Test.class")
val testExcludes = arrayListOf<String>()
var name: String = ""
fun args(vararg arg: String) {
testArgs.addAll(arg)
}
fun jvmArgs(vararg arg: String) {
jvmArgs.addAll(arg)
}
fun include(vararg arg: String) {
testIncludes.apply {
clear()
addAll(arg)
}
}
fun exclude(vararg arg: String) {
testExcludes.apply {
clear()
addAll(arg)
}
}
}
@Directive @Directive
fun Project.test(init: TestConfig.() -> Unit) = let { project -> fun Project.test(init: TestConfig.() -> Unit): TestConfig = let { project ->
with(testConfigs) { with(testConfigs) {
val tf = TestConfig(project).apply { init() } val tf = TestConfig(project).apply { init() }
if (! map { it.name }.contains(tf.name)) { if (! map { it.name }.contains(tf.name)) {
add(tf) add(tf)
tf
} else { } else {
throw KobaltException("Test configuration \"${tf.name}\" already exists, give it a different " throw KobaltException("Test configuration \"${tf.name}\" already exists, give it a different "
+ "name with test { name = ... }") + "name with test { name = ... }")

View file

@ -29,7 +29,7 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
/** /**
* for {internal, release}, return [internalRelease, internal, release] * for {internal, release}, return [internalRelease, internal, release]
*/ */
fun allDirectories(project: Project): List<String> { fun allDirectories(): List<String> {
return arrayListOf<String>().apply { return arrayListOf<String>().apply {
add(toCamelcaseDir()) add(toCamelcaseDir())
add(productFlavor.name) add(productFlavor.name)
@ -70,7 +70,7 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
val result = arrayListOf<File>() val result = arrayListOf<File>()
val sourceDirectories = sourceSet.correctSourceSet(project) val sourceDirectories = sourceSet.correctSourceSet(project)
.filter { File(project.directory, it).exists() } .filter { File(project.directory, it).exists() }
.map { File(it) } .map(::File)
if (isDefault) { if (isDefault) {
result.addAll(sourceDirectories) result.addAll(sourceDirectories)
@ -88,7 +88,7 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
result.add(dir) result.add(dir)
} }
result.addAll(allDirectories(project) result.addAll(allDirectories()
.map { File(KFiles.joinDir("src", it, suffix)) } .map { File(KFiles.joinDir("src", it, suffix)) }
.filter(File::exists)) .filter(File::exists))
@ -113,8 +113,8 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
if (isDefault) { if (isDefault) {
archiveName ?: project.name + "-" + project.version + suffix archiveName ?: project.name + "-" + project.version + suffix
} else { } else {
val base = if (archiveName != null) archiveName.substring(0, archiveName.length - suffix.length) val base = archiveName?.substring(0, archiveName.length - suffix.length)
else project.name + "-" + project.version ?: project.name + "-" + project.version
val flavor = if (productFlavor.name.isEmpty()) "" else "-" + productFlavor.name val flavor = if (productFlavor.name.isEmpty()) "" else "-" + productFlavor.name
val type = if (buildType.name.isEmpty()) "" else "-" + buildType.name val type = if (buildType.name.isEmpty()) "" else "-" + buildType.name
val result: String = base + flavor + type + suffix val result: String = base + flavor + type + suffix
@ -124,18 +124,16 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
return result return result
} }
val shortArchiveName = if (isDefault) "" else "-" + productFlavor.name + "-" + buildType.name
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 ?: null 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 ?: null return project.productFlavors[buildTypeName]?.buildConfig
} }
/** /**
@ -164,7 +162,8 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
?: throw KobaltException( ?: throw KobaltException(
"packageName needs to be defined on the project in order to generateAndSave BuildConfig") "packageName needs to be defined on the project in order to generateAndSave BuildConfig")
val contributor = ActorUtils.selectAffinityActor(context.pluginInfo.buildConfigContributors, project) val contributor = ActorUtils.selectAffinityActor(project, context,
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"))
@ -222,7 +221,7 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null,
} }
fun toCamelcaseDir() : String { fun toCamelcaseDir() : String {
fun lci(s : String) = if (s.length == 0 || s.length == 1) s else s[0].toLowerCase() + s.substring(1) fun lci(s : String) = if (s.isEmpty() || s.length == 1) s else s[0].toLowerCase() + s.substring(1)
return lci(productFlavor.name) + buildType.name.capitalize() return lci(productFlavor.name) + buildType.name.capitalize()
} }

View file

@ -11,4 +11,6 @@ data class CompilerActionInfo(val directory: String?,
val suffixesBeingCompiled: List<String>, val suffixesBeingCompiled: List<String>,
val outputDir: File, val outputDir: File,
val compilerArgs: List<String>, val compilerArgs: List<String>,
val friendPaths: List<String>) val friendPaths: List<String>,
val forceRecompile: Boolean,
val compilerSeparateProcess: Boolean = false)

View file

@ -11,7 +11,9 @@ interface IDependencyHolder {
var project: Project var project: Project
val compileDependencies : ArrayList<IClasspathDependency> val compileDependencies : ArrayList<IClasspathDependency>
val optionalDependencies : ArrayList<IClasspathDependency>
val compileProvidedDependencies : ArrayList<IClasspathDependency> val compileProvidedDependencies : ArrayList<IClasspathDependency>
val compileOnlyDependencies : ArrayList<IClasspathDependency>
val compileRuntimeDependencies : ArrayList<IClasspathDependency> val compileRuntimeDependencies : ArrayList<IClasspathDependency>
val excludedDependencies : ArrayList<IClasspathDependency> val excludedDependencies : ArrayList<IClasspathDependency>
val nativeDependencies : ArrayList<IClasspathDependency> val nativeDependencies : ArrayList<IClasspathDependency>
@ -26,7 +28,9 @@ interface IDependencyHolder {
open class DependencyHolder : IDependencyHolder { open class DependencyHolder : IDependencyHolder {
override lateinit var project: Project override lateinit var project: Project
override val compileDependencies : ArrayList<IClasspathDependency> = arrayListOf() override val compileDependencies : ArrayList<IClasspathDependency> = arrayListOf()
override val optionalDependencies : ArrayList<IClasspathDependency> = arrayListOf()
override val compileProvidedDependencies : ArrayList<IClasspathDependency> = arrayListOf() override val compileProvidedDependencies : ArrayList<IClasspathDependency> = arrayListOf()
override val compileOnlyDependencies : ArrayList<IClasspathDependency> = arrayListOf()
override val compileRuntimeDependencies : ArrayList<IClasspathDependency> = arrayListOf() override val compileRuntimeDependencies : ArrayList<IClasspathDependency> = arrayListOf()
override val excludedDependencies : ArrayList<IClasspathDependency> = arrayListOf() override val excludedDependencies : ArrayList<IClasspathDependency> = arrayListOf()
override val nativeDependencies : ArrayList<IClasspathDependency> = arrayListOf() override val nativeDependencies : ArrayList<IClasspathDependency> = arrayListOf()
@ -34,8 +38,8 @@ open class DependencyHolder : IDependencyHolder {
override var dependencies : Dependencies? = null override var dependencies : Dependencies? = null
override fun dependencies(init: Dependencies.() -> Unit) : Dependencies { override fun dependencies(init: Dependencies.() -> Unit) : Dependencies {
dependencies = Dependencies(project, compileDependencies, compileProvidedDependencies, dependencies = Dependencies(project, compileDependencies, optionalDependencies, compileProvidedDependencies,
compileRuntimeDependencies, excludedDependencies, nativeDependencies) compileOnlyDependencies, compileRuntimeDependencies, excludedDependencies, nativeDependencies)
dependencies!!.init() dependencies!!.init()
return dependencies!! return dependencies!!
} }

View file

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

View file

@ -4,8 +4,12 @@ package com.beust.kobalt.api
* Plug-ins that listen to build events. * Plug-ins that listen to build events.
*/ */
interface IBuildListener : IListener { interface IBuildListener : IListener {
class TaskEndInfo(val success: Boolean, val shortMessage: String? = null,
val longMessage: String? = null)
fun taskStart(project: Project, context: KobaltContext, taskName: String) {} fun taskStart(project: Project, context: KobaltContext, taskName: String) {}
fun taskEnd(project: Project, context: KobaltContext, taskName: String, success: Boolean) {} fun taskEnd(project: Project, context: KobaltContext, taskName: String, info: TaskEndInfo) {}
fun projectStart(project: Project, context: KobaltContext) {} fun projectStart(project: Project, context: KobaltContext) {}
fun projectEnd(project: Project, context: KobaltContext, status: ProjectBuildStatus) {} fun projectEnd(project: Project, context: KobaltContext, status: ProjectBuildStatus) {}

View file

@ -22,15 +22,20 @@ interface IClasspathDependency {
/** @return true if this dependency represents a Maven coordinate */ /** @return true if this dependency represents a Maven coordinate */
val isMaven: Boolean val isMaven: Boolean
/** @return true if this dependency is optional */
val optional: Boolean
/** Absolute path to the jar file on the local file system */ /** Absolute path to the jar file on the local file system */
val jarFile: Future<File> val jarFile: Future<File>
/** Convert to a Maven <dependency> model tag */ /** Convert to a Maven <dependency> model tag */
fun toMavenDependencies() : Dependency fun toMavenDependencies(scope: String? = null) : Dependency
/** The list of dependencies for this element (not the transitive closure) */ /** The list of dependencies for this element (not the transitive closure) */
fun directDependencies(): List<IClasspathDependency> fun directDependencies(): List<IClasspathDependency>
/** Used to only keep the most recent version for an artifact if no version was specified */ /** Used to only keep the most recent version for an artifact if no version was specified */
val shortId: String val shortId: String
val excluded: ArrayList<Dependencies.ExcludeConfig>
} }

View file

@ -1,7 +1,6 @@
package com.beust.kobalt.api package com.beust.kobalt.api
import com.beust.kobalt.TaskResult import com.beust.kobalt.TaskResult
import com.beust.kobalt.misc.warn
interface ICompilerDescription : Comparable<ICompilerDescription> { interface ICompilerDescription : Comparable<ICompilerDescription> {
/** /**
@ -55,13 +54,15 @@ class CompilerDescription(override val name: String, override val sourceDirecto
override val canCompileDirectories: Boolean = false) : ICompilerDescription { override val canCompileDirectories: Boolean = false) : ICompilerDescription {
override fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo): TaskResult { override fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo): TaskResult {
val result = val result =
if (info.sourceFiles.size > 0) { if (info.sourceFiles.isNotEmpty()) {
compiler.compile(project, context, info) compiler.compile(project, context, info)
} else { } else {
warn("Couldn't find any source files to compile") context.logger.log(project.name, 2, "$name couldn't find any source files to compile")
TaskResult() TaskResult()
} }
return result return result
} }
override fun toString() = name + " compiler"
} }

View file

@ -3,13 +3,27 @@ package com.beust.kobalt.api
/** /**
* Plugins that add compiler flags. * Plugins that add compiler flags.
*/ */
interface ICompilerFlagContributor : IContributor { class FlagContributor(val flagPriority: Int = DEFAULT_FLAG_PRIORITY,
fun flagsFor(project: Project, context: KobaltContext, currentFlags: List<String>, val closure: (project: Project, context: KobaltContext, currentFlags: List<String>,
suffixesBeingCompiled: List<String>): List<String> suffixesBeingCompiled: List<String>) -> List<String>) : IContributor {
val flagPriority: Int
get() = DEFAULT_FLAG_PRIORITY
companion object { companion object {
val DEFAULT_FLAG_PRIORITY = 20 val DEFAULT_FLAG_PRIORITY = 20
} }
fun flagsFor(project: Project, context: KobaltContext, currentFlags: List<String>,
suffixesBeingCompiled: List<String>) = closure(project, context, currentFlags, suffixesBeingCompiled)
} }
interface IFlagBase {
val flagPriority: Int get() = FlagContributor.DEFAULT_FLAG_PRIORITY
}
interface ICompilerFlagContributor : IContributor, IFlagBase {
fun compilerFlagsFor(project: Project, context: KobaltContext, currentFlags: List<String>,
suffixesBeingCompiled: List<String>): List<String>
}
interface IDocFlagContributor : IContributor, IFlagBase {
fun docFlagsFor(project: Project, context: KobaltContext, currentFlags: List<String>,
suffixesBeingCompiled: List<String>): List<String>
}

View file

@ -1,6 +1,11 @@
package com.beust.kobalt.api package com.beust.kobalt.api
import com.beust.kobalt.maven.aether.Filters.EXCLUDE_OPTIONAL_FILTER
import com.beust.kobalt.maven.aether.KobaltMavenResolver
import com.beust.kobalt.maven.aether.Scope import com.beust.kobalt.maven.aether.Scope
import com.beust.kobalt.misc.kobaltLog
import org.eclipse.aether.graph.DependencyFilter
import org.eclipse.aether.graph.DependencyNode
/** /**
* Manage the creation of dependencies and also provide dependencies for projects. * Manage the creation of dependencies and also provide dependencies for projects.
@ -9,12 +14,12 @@ interface IDependencyManager {
/** /**
* Parse the id and return the correct IClasspathDependency * Parse the id and return the correct IClasspathDependency
*/ */
fun create(id: String, projectDirectory: String? = null): IClasspathDependency fun create(id: String, optional: Boolean = false, projectDirectory: String? = null): IClasspathDependency
/** /**
* Create an IClasspathDependency from a Maven id. * Create an IClasspathDependency from a Maven id.
*/ */
fun createMaven(id: String): IClasspathDependency fun createMaven(id: String, optional: Boolean = false): IClasspathDependency
/** /**
* Create an IClasspathDependency from a path. * Create an IClasspathDependency from a path.
@ -24,7 +29,7 @@ interface IDependencyManager {
/** /**
* @return the source dependencies for this project, including the contributors. * @return the source dependencies for this project, including the contributors.
*/ */
fun dependencies(project: Project, context: KobaltContext): List<IClasspathDependency> fun dependencies(project: Project, context: KobaltContext, scopes: List<Scope>): List<IClasspathDependency>
/** /**
* @return the test dependencies for this project, including the contributors. * @return the test dependencies for this project, including the contributors.
@ -36,6 +41,48 @@ interface IDependencyManager {
* allDependencies is typically either compileDependencies or testDependencies * allDependencies is typically either compileDependencies or testDependencies
*/ */
fun calculateDependencies(project: Project?, context: KobaltContext, fun calculateDependencies(project: Project?, context: KobaltContext,
scopeFilters: Collection<Scope> = listOf(Scope.COMPILE), dependencyFilter: DependencyFilter =
createDependencyFilter(project, project?.compileDependencies ?: emptyList()),
scopes: List<Scope> = listOf(Scope.COMPILE),
vararg passedDependencies: List<IClasspathDependency>): List<IClasspathDependency> vararg passedDependencies: List<IClasspathDependency>): List<IClasspathDependency>
/**
* Create an Aether dependency filter that uses the dependency configuration included in each
* IClasspathDependency.
*/
fun createDependencyFilter(project: Project?, dependencies: List<IClasspathDependency>) : DependencyFilter {
return DependencyFilter { p0, p1 ->
fun isNodeExcluded(node: DependencyNode, passedDep: IClasspathDependency) : Boolean {
val dep = create(KobaltMavenResolver.artifactToId(node.artifact))
return passedDep.excluded.any { ex -> ex.isExcluded(dep)}
}
fun isDepExcluded(node: DependencyNode, excluded: List<IClasspathDependency>?) : Boolean {
val dep = create(KobaltMavenResolver.artifactToId(node.artifact))
return excluded?.map { it.id }?.contains(dep.id) ?: false
}
val accept = dependencies.isEmpty() || dependencies.any {
// Is this dependency excluded?
val isExcluded = isNodeExcluded(p0, it) || isDepExcluded(p0, project?.excludedDependencies)
// Is the parent dependency excluded?
val isParentExcluded =
if (p1.any()) {
isNodeExcluded(p1[0], it) || isDepExcluded(p1[0], project?.excludedDependencies)
} else {
false
}
// Only accept if no exclusions were found
! isExcluded && ! isParentExcluded
}
if (! accept) {
kobaltLog(2, "Excluding $p0")
}
if (accept) EXCLUDE_OPTIONAL_FILTER.accept(p0, p1)
else accept
}
}
} }

View file

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

@ -23,9 +23,10 @@ class DynamicTask(override val plugin: IPlugin, override val name: String, overr
override fun call(): TaskResult2<ITask> { override fun call(): TaskResult2<ITask> {
val taskResult = closure.invoke(project) val taskResult = closure.invoke(project)
return TaskResult2(taskResult.success, taskResult.errorMessage, this) return TaskResult2(taskResult.success, errorMessage = taskResult.errorMessage, value = this)
} }
override fun toString() = "[DynamicTask $name dependsOn=$dependsOn reverseDependsOn=$reverseDependsOn]" override fun toString() =
"[DynamicTask ${project.name}:$name dependsOn=$dependsOn reverseDependsOn=$reverseDependsOn]"
} }

View file

@ -0,0 +1,55 @@
package com.beust.kobalt.api
import com.beust.kobalt.Args
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.kobaltLog
import java.io.*
import java.net.URL
import java.util.jar.JarInputStream
/**
* Base class for templates that decompress a jar file.
*/
interface InputStreamJarTemplate : ITemplate {
val inputStream: InputStream
override fun generateTemplate(args: Args, classLoader: ClassLoader) {
val destDir = File(".")
JarInputStream(inputStream).use { ins ->
var entry = ins.nextEntry
while (entry != null) {
val f = File(destDir.path + File.separator + entry.name)
if (entry.isDirectory) {
f.mkdir()
entry = ins.nextEntry
continue
}
kobaltLog(2, " Extracting: $entry to ${f.absolutePath}")
FileOutputStream(f).use { fos ->
KFiles.copy(ins, fos)
}
entry = ins.nextEntry
}
}
}
}
abstract class ResourceJarTemplate(jarName: String, val classLoader: ClassLoader) : InputStreamJarTemplate {
override val inputStream : InputStream = classLoader.getResource(jarName).openConnection().inputStream
}
abstract class FileJarTemplate(val fileName: String) : InputStreamJarTemplate {
override val inputStream = FileInputStream(File(fileName))
}
abstract class HttpJarTemplate(val url: String) : InputStreamJarTemplate {
override val inputStream : InputStream
get() {
try {
return URL(url).openConnection().inputStream
} catch(ex: IOException) {
throw IllegalArgumentException("Couldn't connect to $url")
}
}
}

View file

@ -1,41 +0,0 @@
package com.beust.kobalt.api
import com.beust.kobalt.Args
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.kobaltLog
import java.io.File
import java.io.FileOutputStream
import java.util.jar.JarInputStream
/**
* Base class for templates that simply decompress a jar file to generate their project.
*/
abstract class JarTemplate(val jarName: String) : ITemplate {
companion object {
fun extractFile(ins: JarInputStream, destDir: File) {
var entry = ins.nextEntry
while (entry != null) {
val f = File(destDir.path + File.separator + entry.name)
if (entry.isDirectory) {
f.mkdir()
entry = ins.nextEntry
continue
}
kobaltLog(2, "Extracting: $entry to ${f.absolutePath}")
FileOutputStream(f).use { fos ->
KFiles.copy(ins, fos)
}
entry = ins.nextEntry
}
}
}
override fun generateTemplate(args: Args, classLoader: ClassLoader) {
kobaltLog(2, "Generating template with class loader $classLoader")
val destDir = File(".")
val ins = JarInputStream(classLoader.getResource(jarName).openConnection().inputStream)
extractFile(ins, destDir)
}
}

View file

@ -5,6 +5,7 @@ import com.beust.kobalt.HostConfig
import com.beust.kobalt.Plugins import com.beust.kobalt.Plugins
import com.beust.kobalt.internal.PluginInfo import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.aether.KobaltMavenResolver
import com.google.inject.Guice import com.google.inject.Guice
import com.google.inject.Injector import com.google.inject.Injector
import com.google.inject.Module import com.google.inject.Module
@ -35,12 +36,12 @@ class Kobalt {
*/ */
val repos : Set<HostConfig> val repos : Set<HostConfig>
get() { get() {
val settingsRepos = Kobalt.context?.settings?.defaultRepos ?: emptyList() val settingsRepos = Kobalt.context?.settings?.defaultRepos?.map { HostConfig(it) } ?: emptyList()
// Repos from <default-repos> in the settings // Repos from <default-repos> in the settings
val result = ArrayList( val result = ArrayList(
(if (settingsRepos.isEmpty()) Constants.DEFAULT_REPOS (if (settingsRepos.isEmpty()) Constants.DEFAULT_REPOS
else settingsRepos) else settingsRepos)
.map { HostConfig(it) }) )
// Repo from <kobalt-compiler-repo> in the settings // Repo from <kobalt-compiler-repo> in the settings
Kobalt.context?.settings?.kobaltCompilerRepo?.let { Kobalt.context?.settings?.kobaltCompilerRepo?.let {
@ -55,6 +56,9 @@ class Kobalt {
// Repos from the build file // Repos from the build file
result.addAll(reposFromBuildFiles) result.addAll(reposFromBuildFiles)
result.forEach {
KobaltMavenResolver.initAuthentication(it)
}
return result.toHashSet() return result.toHashSet()
} }
@ -118,5 +122,20 @@ class Kobalt {
get() = Duration.parse( kobaltProperties.getProperty(PROPERTY_KOBALT_VERSION_CHECK_TIMEOUT) ?: "P1D") get() = Duration.parse( kobaltProperties.getProperty(PROPERTY_KOBALT_VERSION_CHECK_TIMEOUT) ?: "P1D")
fun findPlugin(name: String) = Plugins.findPlugin(name) fun findPlugin(name: String) = Plugins.findPlugin(name)
val optionsFromBuild = arrayListOf<String>()
fun addKobaltOptions(options: Array<out String>) {
optionsFromBuild.addAll(options)
}
val buildSourceDirs = arrayListOf<String>()
fun addBuildSourceDirs(dirs: Array<out String>) {
buildSourceDirs.addAll(dirs)
}
fun cleanUp() {
buildSourceDirs.clear()
buildFileClasspath.clear()
}
} }
} }

View file

@ -12,7 +12,7 @@ import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.MavenId import com.beust.kobalt.maven.MavenId
import com.beust.kobalt.maven.PomGenerator import com.beust.kobalt.maven.PomGenerator
import com.beust.kobalt.maven.SimpleDep import com.beust.kobalt.maven.SimpleDep
import com.beust.kobalt.maven.aether.KobaltAether import com.beust.kobalt.maven.aether.KobaltMavenResolver
import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.misc.KobaltExecutors
import java.io.File import java.io.File
@ -53,9 +53,9 @@ class KobaltContext(val args: Args) {
FileType.JAVADOC -> toQualifier(dep, "", "javadoc") FileType.JAVADOC -> toQualifier(dep, "", "javadoc")
FileType.OTHER -> id FileType.OTHER -> id
} }
val resolved = aether.resolveToArtifact(fullId) val resolved = resolver.resolveToArtifact(fullId)
if (resolved != null) { if (resolved != null) {
return resolved.artifact.file return resolved.file
} else { } else {
throw KobaltException("Couldn't resolve $id") throw KobaltException("Couldn't resolve $id")
} }
@ -81,7 +81,7 @@ class KobaltContext(val args: Args) {
lateinit var executors: KobaltExecutors lateinit var executors: KobaltExecutors
lateinit var settings: KobaltSettings lateinit var settings: KobaltSettings
lateinit var incrementalManager: IncrementalManager lateinit var incrementalManager: IncrementalManager
lateinit var aether: KobaltAether lateinit var resolver: KobaltMavenResolver
lateinit var pomGeneratorFactory: PomGenerator.IFactory lateinit var pomGeneratorFactory: PomGenerator.IFactory
lateinit var logger: ILogger lateinit var logger: ILogger
} }
@ -105,4 +105,12 @@ class InternalContext {
* The absolute directory of the current project. * The absolute directory of the current project.
*/ */
var absoluteDir: File? = null var absoluteDir: File? = null
/**
* If true, will force a recompile of the files even if using the incremental compile
*/
var forceRecompile: Boolean = false
var noIncrementalKotlin: Boolean = false
} }

View file

@ -3,15 +3,16 @@ package com.beust.kobalt.api
import com.beust.kobalt.TestConfig import com.beust.kobalt.TestConfig
import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.aether.KobaltAether import com.beust.kobalt.maven.aether.AetherDependency
import com.beust.kobalt.maven.aether.KobaltMavenResolver
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.log
import org.apache.maven.model.Model import org.apache.maven.model.Model
import java.io.File import java.io.File
import java.util.* import java.util.*
import java.util.concurrent.Future import java.util.concurrent.Future
import java.util.concurrent.FutureTask import java.util.concurrent.FutureTask
import java.util.regex.Pattern
open class Project( open class Project(
@Directive open var name: String = "", @Directive open var name: String = "",
@ -25,6 +26,7 @@ open class Project(
@Directive open var url: String? = null, @Directive open var url: String? = null,
@Directive open var pom: Model? = null, @Directive open var pom: Model? = null,
@Directive open var dependsOn: ArrayList<Project> = arrayListOf<Project>(), @Directive open var dependsOn: ArrayList<Project> = arrayListOf<Project>(),
@Directive open var testsDependOn: ArrayList<Project> = arrayListOf<Project>(),
@Directive open var packageName: String? = group) @Directive open var packageName: String? = group)
: IBuildConfig, IDependencyHolder by DependencyHolder() { : IBuildConfig, IDependencyHolder by DependencyHolder() {
@ -32,13 +34,15 @@ open class Project(
this.project = this this.project = this
} }
fun allProjectDependedOn() = project.dependsOn + project.testsDependOn
class ProjectExtra(project: Project) { class ProjectExtra(project: Project) {
var isDirty = false var isDirty = false
/** /**
* @return true if any of the projects we depend on is dirty. * @return true if any of the projects we depend on is dirty.
*/ */
fun dependsOnDirtyProjects(project: Project) = project.dependsOn.any { it.projectExtra.isDirty } fun dependsOnDirtyProjects(project: Project) = project.allProjectDependedOn().any { it.projectExtra.isDirty }
} }
/** /**
@ -86,7 +90,8 @@ open class Project(
@Directive @Directive
fun dependenciesTest(init: Dependencies.() -> Unit) : Dependencies { fun dependenciesTest(init: Dependencies.() -> Unit) : Dependencies {
dependencies = Dependencies(this, testDependencies, testProvidedDependencies, compileRuntimeDependencies, dependencies = Dependencies(this, testDependencies, arrayListOf(),
testProvidedDependencies, compileOnlyDependencies, compileRuntimeDependencies,
excludedDependencies, nativeDependencies) excludedDependencies, nativeDependencies)
dependencies!!.init() dependencies!!.init()
return dependencies!! return dependencies!!
@ -95,6 +100,9 @@ open class Project(
val testDependencies : ArrayList<IClasspathDependency> = arrayListOf() val testDependencies : ArrayList<IClasspathDependency> = arrayListOf()
val testProvidedDependencies : ArrayList<IClasspathDependency> = arrayListOf() val testProvidedDependencies : ArrayList<IClasspathDependency> = arrayListOf()
fun testsDependOn(vararg projects: Project) = testsDependOn.addAll(projects)
fun dependsOn(vararg projects: Project) = dependsOn.addAll(projects)
/** Used to disambiguate various name properties */ /** Used to disambiguate various name properties */
@Directive @Directive
val projectName: String get() = name val projectName: String get() = name
@ -121,6 +129,18 @@ open class Project(
return result return result
} }
class Dep(val file: File, val id: String)
/**
* @return a list of the transitive dependencies (absolute paths to jar files) for the given dependencies.
* Can be used for example as `collect(compileDependencies)`.
*/
@Directive
fun collect(dependencies: List<IClasspathDependency>) : List<Dep> {
return (Kobalt.context?.dependencyManager?.transitiveClosure(dependencies) ?: emptyList())
.map { Dep(it.jarFile.get(), it.id) }
}
override fun toString() = "[Project $name]" override fun toString() = "[Project $name]"
} }
@ -133,7 +153,9 @@ class Sources(val project: Project, val sources: HashSet<String>) {
class Dependencies(val project: Project, class Dependencies(val project: Project,
val dependencies: ArrayList<IClasspathDependency>, val dependencies: ArrayList<IClasspathDependency>,
val optionalDependencies: ArrayList<IClasspathDependency>,
val providedDependencies: ArrayList<IClasspathDependency>, val providedDependencies: ArrayList<IClasspathDependency>,
val compileOnlyDependencies: ArrayList<IClasspathDependency>,
val runtimeDependencies: ArrayList<IClasspathDependency>, val runtimeDependencies: ArrayList<IClasspathDependency>,
val excludedDependencies: ArrayList<IClasspathDependency>, val excludedDependencies: ArrayList<IClasspathDependency>,
val nativeDependencies: ArrayList<IClasspathDependency>) { val nativeDependencies: ArrayList<IClasspathDependency>) {
@ -145,27 +167,98 @@ class Dependencies(val project: Project,
* future tasks receive a get(), the repos will be correct. * future tasks receive a get(), the repos will be correct.
*/ */
private fun addToDependencies(project: Project, dependencies: ArrayList<IClasspathDependency>, private fun addToDependencies(project: Project, dependencies: ArrayList<IClasspathDependency>,
dep: Array<out String>): List<Future<File>> dep: Array<out String>, optional: Boolean = false, excludeConfig: ExcludeConfig? = null): List<Future<File>>
= with(dep.map { = with(dep.map {
val resolved = val resolved =
if (KobaltAether.isRangeVersion(it)) { if (KobaltMavenResolver.isRangeVersion(it)) {
val result = Kobalt.INJECTOR.getInstance(KobaltAether::class.java).resolve(it).dependency.id // Range id
val node = Kobalt.INJECTOR.getInstance(KobaltMavenResolver::class.java).resolveToArtifact(it)
val result = KobaltMavenResolver.artifactToId(node)
kobaltLog(2, "Resolved range id $it to $result") kobaltLog(2, "Resolved range id $it to $result")
result result
} else { } else {
it it
} }
DependencyManager.create(resolved, project.directory) DependencyManager.create(resolved, optional, project.directory)
}) { }) {
dependencies.addAll(this) dependencies.addAll(this)
if (excludeConfig != null) {
this.forEach { it.excluded.add(excludeConfig) }
}
this.map { FutureTask { it.jarFile.get() } } this.map { FutureTask { it.jarFile.get() } }
} }
@Directive @Directive
fun compile(vararg dep: String) = addToDependencies(project, dependencies, dep) fun compile(vararg dep: String) = addToDependencies(project, dependencies, dep)
class ExcludeConfig {
val ids = arrayListOf<String>()
@Directive
fun exclude(vararg passedIds: String) = ids.addAll(passedIds)
class ArtifactConfig(
var groupId: String? = null,
var artifactId: String? = null,
var version: String? = null
)
val artifacts = arrayListOf<ArtifactConfig>()
@Directive
fun exclude(groupId: String? = null, artifactId: String? = null, version: String? = null)
= artifacts.add(ArtifactConfig(groupId, artifactId, version))
fun match(pattern: String?, id: String) : Boolean {
return pattern == null || Pattern.compile(pattern).matcher(id).matches()
}
/**
* @return true if the dependency is excluded with any of the exclude() directives. The matches
* are performed by a regular expression match against the dependency.
*/
fun isExcluded(dep: IClasspathDependency) : Boolean {
// Straight id match
var result = ids.any { match(it, dep.id) }
// Match on any combination of (groupId, artifactId, version)
if (! result && dep.isMaven) {
val mavenDep = dep as AetherDependency
val artifact = mavenDep.artifact
result = artifacts.any {
val match1 = it.groupId == null || match(it.groupId, artifact.groupId)
val match2 = it.artifactId == null || match(it.artifactId, artifact.artifactId)
val match3 = it.version == null || match(it.version, artifact.version)
match1 && match2 && match3
}
}
return result
}
}
@Directive @Directive
fun provided(vararg dep: String) = addToDependencies(project, providedDependencies, dep) fun compile(dep: String, init: ExcludeConfig.() -> Unit) {
val excludeConfig = ExcludeConfig().apply {
init()
}
addToDependencies(project, dependencies, arrayOf(dep), excludeConfig = excludeConfig)
}
@Directive
fun compileOnly(vararg dep: String) = addToDependencies(project, compileOnlyDependencies, dep)
@Directive
fun compileOptional(vararg dep: String) {
addToDependencies(project, optionalDependencies, dep, optional = true)
addToDependencies(project, dependencies, dep, optional = true)
}
@Directive
fun provided(vararg dep: String) {
addToDependencies(project, providedDependencies, dep)
}
@Directive @Directive
fun runtime(vararg dep: String) = addToDependencies(project, runtimeDependencies, dep) fun runtime(vararg dep: String) = addToDependencies(project, runtimeDependencies, dep)

View file

@ -44,6 +44,25 @@ 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

@ -1,25 +1,24 @@
package com.beust.kobalt.archive package com.beust.kobalt.archive
import com.beust.kobalt.Features import com.beust.kobalt.*
import com.beust.kobalt.IFileSpec
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.api.annotation.ExportedProjectProperty import com.beust.kobalt.api.annotation.ExportedProjectProperty
import com.beust.kobalt.misc.* import com.beust.kobalt.misc.JarUtils
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.kobaltLog
import java.io.File import java.io.File
import java.io.FileOutputStream
import java.io.OutputStream
import java.util.* import java.util.*
import java.util.zip.ZipOutputStream
class Archives { class Archives {
companion object { companion object {
@ExportedProjectProperty(doc = "The name of the jar file", type = "String") @ExportedProjectProperty(doc = "The name of the jar file", type = "String")
const val JAR_NAME = "jarName" const val JAR_NAME = "jarName"
@ExportedProjectProperty(doc = "The name of the a jar file with a main() method", type = "String")
const val JAR_NAME_WITH_MAIN_CLASS = "jarNameWithMainClass"
private val DEFAULT_STREAM_FACTORY = { os : OutputStream -> ZipOutputStream(os) } fun defaultArchiveName(project: Project) = project.name +
if (project.version.isNullOrBlank()) "" else "-${project.version}"
fun defaultArchiveName(project: Project) = project.name + "-" + project.version
fun generateArchive(project: Project, fun generateArchive(project: Project,
context: KobaltContext, context: KobaltContext,
@ -27,15 +26,15 @@ class Archives {
suffix: String, suffix: String,
includedFiles: List<IncludedFile>, includedFiles: List<IncludedFile>,
expandJarFiles : Boolean = false, expandJarFiles : Boolean = false,
outputStreamFactory: (OutputStream) -> ZipOutputStream = DEFAULT_STREAM_FACTORY) : File { manifest: java.util.jar.Manifest? = null) : File {
val fullArchiveName = context.variant.archiveName(project, archiveName, suffix) val fullArchiveName = context.variant.archiveName(project, archiveName, suffix)
val archiveDir = File(KFiles.libsDir(project)) val archiveDir = File(KFiles.libsDir(project))
val result = File(archiveDir.path, fullArchiveName) val result = File(archiveDir.path, fullArchiveName)
context.logger.log(project.name, 3, "Creating $result") context.logger.log(project.name, 3, "Creating $result")
if (! Features.USE_TIMESTAMPS || isOutdated(project.directory, includedFiles, result)) { if (! Features.USE_TIMESTAMPS || isOutdated(project.directory, includedFiles, result)) {
try { try {
outputStreamFactory(FileOutputStream(result)).use { MetaArchive(result, manifest).use { metaArchive ->
JarUtils.addFiles(project.directory, includedFiles, it, expandJarFiles) JarUtils.addFiles(project.directory, includedFiles, metaArchive, expandJarFiles)
context.logger.log(project.name, 2, "Added ${includedFiles.size} files to $result") context.logger.log(project.name, 2, "Added ${includedFiles.size} files to $result")
context.logger.log(project.name, 1, " Created $result") context.logger.log(project.name, 1, " Created $result")
} }
@ -50,8 +49,6 @@ class Archives {
context.logger.log(project.name, 3, " $result is up to date") context.logger.log(project.name, 3, " $result is up to date")
} }
project.projectProperties.put(JAR_NAME, result.absolutePath)
return result return result
} }

View file

@ -8,7 +8,7 @@ import com.beust.kobalt.api.annotation.Directive
*/ */
open class Jar(override val project: Project, open class Jar(override val project: Project,
override var name : String = Archives.defaultArchiveName(project) + ".jar", override var name : String = Archives.defaultArchiveName(project) + ".jar",
var fatJar: Boolean = false) : Zip(project, name), AttributeHolder { override var fatJar: Boolean = false) : Zip(project, name, fatJar), AttributeHolder {
@Directive @Directive
fun manifest(init: Manifest.(p: Manifest) -> Unit) : Manifest { fun manifest(init: Manifest.(p: Manifest) -> Unit) : Manifest {
val m = Manifest(this) val m = Manifest(this)
@ -18,7 +18,7 @@ open class Jar(override val project: Project,
// Need to specify the version or attributes will just be dropped // Need to specify the version or attributes will just be dropped
@Directive @Directive
val attributes = arrayListOf(Pair("Manifest-Version", "1.0")) override val attributes = arrayListOf(Pair("Manifest-Version", "1.0"))
override fun addAttribute(k: String, v: String) { override fun addAttribute(k: String, v: String) {
attributes.add(Pair(k, v)) attributes.add(Pair(k, v))

View file

@ -0,0 +1,125 @@
package com.beust.kobalt.archive
import com.beust.kobalt.Glob
import com.beust.kobalt.misc.KFiles
import org.apache.commons.compress.archivers.ArchiveEntry
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
import java.io.Closeable
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.util.jar.Manifest
import org.apache.commons.compress.archivers.zip.ZipFile as ApacheZipFile
/**
* Abstraction of a zip/jar/war archive that automatically manages the addition of expanded jar files.
* Uses ZipArchiveOutputStream for fast inclusion of expanded jar files.
*/
class MetaArchive(outputFile: File, val manifest: Manifest?) : Closeable {
companion object {
const val MANIFEST_MF = "META-INF/MANIFEST.MF"
}
private val zos= ZipArchiveOutputStream(outputFile).apply {
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?) {
maybeCreateParentDirectories(f)
addFile2(f, entryFile, path)
}
private fun addFile2(f: File, entryFile: File, path: String?) {
val file = f.normalize()
FileInputStream(file).use { inputStream ->
val actualPath = KFiles.fixSlashes(if (path != null) path + entryFile.path else entryFile.path)
ZipArchiveEntry(actualPath).let { entry ->
maybeCreateParentDirectories(File(actualPath))
maybeAddEntry(entry) {
addEntry(entry, inputStream)
}
}
}
}
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) {
ApacheZipFile(jarFile).use { jar ->
val jarEntries = jar.entries
for (entry in jarEntries) {
maybeAddEntry(entry) {
zos.addRawArchiveEntry(entry, jar.getRawInputStream(entry))
}
}
}
}
private fun okToAdd(name: String) : Boolean {
val result = !KFiles.isExcluded(name,
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")
return result
}
override fun close() = zos.close()
private fun addEntry(entry: ArchiveEntry, inputStream: FileInputStream?) {
zos.putArchiveEntry(entry)
inputStream?.use { ins ->
ins.copyTo(zos, 50 * 1024)
}
zos.closeArchiveEntry()
}
private val seen = hashSetOf<String>()
private fun maybeAddEntry(entry: ArchiveEntry, action:() -> Unit) {
entry.name.let { name ->
if (!seen.contains(name) && okToAdd(name)) {
action()
}
seen.add(name)
}
}
}

View file

@ -6,7 +6,7 @@ import com.beust.kobalt.glob
class War(override val project: Project, override var name: String = Archives.defaultArchiveName(project) + ".war") class War(override val project: Project, override var name: String = Archives.defaultArchiveName(project) + ".war")
: Jar(project, name), AttributeHolder { : Jar(project, name), AttributeHolder {
init { init {
include(from("src/main/webapp"),to(""), glob("**")) include(from("src/main/webapp"), to(""), glob("**"))
include(from("kobaltBuild/classes"), to("WEB-INF/classes"), glob("**")) include(from("kobaltBuild/classes"), to("WEB-INF/classes"), glob("**"))
} }
} }

View file

@ -1,22 +1,13 @@
package com.beust.kobalt.archive package com.beust.kobalt.archive
import com.beust.kobalt.Glob import com.beust.kobalt.*
import com.beust.kobalt.IFileSpec
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.misc.From
import com.beust.kobalt.misc.IncludedFile
import com.beust.kobalt.misc.To
open class Zip(open val project: Project, open var name: String = Archives.defaultArchiveName(project) + ".zip") { open class Zip(open val project: Project, open var name: String = Archives.defaultArchiveName(project) + ".zip",
open var fatJar: Boolean = false): AttributeHolder, IncludeFromTo() {
val excludes = arrayListOf<Glob>() val excludes = arrayListOf<Glob>()
@Directive
fun from(s: String) = From(s)
@Directive
fun to(s: String) = To(s)
@Directive @Directive
fun exclude(vararg files: String) { fun exclude(vararg files: String) {
files.forEach { excludes.add(Glob(it)) } files.forEach { excludes.add(Glob(it)) }
@ -28,26 +19,9 @@ open class Zip(open val project: Project, open var name: String = Archives.defau
} }
@Directive @Directive
fun include(vararg files: String) { open val attributes = arrayListOf(Pair("Manifest-Version", "1.0"))
includedFiles.add(IncludedFile(files.map { IFileSpec.FileSpec(it) }))
override fun addAttribute(k: String, v: String) {
attributes.add(Pair(k, v))
} }
@Directive
fun include(from: From, to: To, vararg specs: String) {
includedFiles.add(IncludedFile(from, to, specs.map { IFileSpec.FileSpec(it) }))
}
@Directive
fun include(from: From, to: To, vararg specs: IFileSpec.GlobSpec) {
includedFiles.add(IncludedFile(from, to, listOf(*specs)))
}
/**
* Prefix path to be removed from the zip file. For example, if you add "build/lib/a.jar" to the zip
* file and the excludePrefix is "build/lib", then "a.jar" will be added at the root of the zip file.
*/
val includedFiles = arrayListOf<IncludedFile>()
} }

View file

@ -1,7 +1,6 @@
package com.beust.kobalt.internal package com.beust.kobalt.internal
import com.beust.kobalt.api.IProjectAffinity import com.beust.kobalt.api.IProjectAffinity
import com.beust.kobalt.api.ISimpleAffinity
import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
@ -11,19 +10,13 @@ class ActorUtils {
* Return the plug-in actor with the highest affinity. * Return the plug-in actor with the highest affinity.
*/ */
fun <T : IProjectAffinity> selectAffinityActor(project: Project, context: KobaltContext, actors: List<T>) fun <T : IProjectAffinity> selectAffinityActor(project: Project, context: KobaltContext, actors: List<T>)
= actors.maxBy { it.affinity(project, context) } = actors.maxBy { it.affinity(project, context) }
/** /**
* Return all the plug-in actors with a non zero affinity sorted from the highest to the lowest. * Return all the plug-in actors with a non zero affinity sorted from the highest to the lowest.
*/ */
fun <T : IProjectAffinity> selectAffinityActors(project: Project, context: KobaltContext, actors: List<T>) fun <T : IProjectAffinity> selectAffinityActors(project: Project, context: KobaltContext, actors: List<T>)
= actors.filter { it.affinity(project, context) > 0 } = actors.filter { it.affinity(project, context) > 0 }
.sortedByDescending { it.affinity(project, context) } .sortedByDescending { it.affinity(project, context) }
/**
* Return the plug-in actor with the highest affinity.
*/
fun <T : ISimpleAffinity<A>, A> selectAffinityActor(actors: List<T>, arg: A) = actors.maxBy { it.affinity(arg) }
} }
} }

View file

@ -12,7 +12,7 @@ abstract class BaseJvmPlugin<T>(open val configActor: ConfigActor<T>) :
ICompilerFlagContributor { ICompilerFlagContributor {
companion object { companion object {
// Run before other flag contributors // Run before other flag contributors
val FLAG_CONTRIBUTOR_PRIORITY = ICompilerFlagContributor.DEFAULT_FLAG_PRIORITY - 10 val FLAG_CONTRIBUTOR_PRIORITY = FlagContributor.DEFAULT_FLAG_PRIORITY - 10
} }
protected fun maybeCompilerArgs(sourceSuffixes: List<String>, suffixesBeingCompiled: List<String>, protected fun maybeCompilerArgs(sourceSuffixes: List<String>, suffixesBeingCompiled: List<String>,
@ -21,14 +21,17 @@ abstract class BaseJvmPlugin<T>(open val configActor: ConfigActor<T>) :
override val flagPriority = FLAG_CONTRIBUTOR_PRIORITY override val flagPriority = FLAG_CONTRIBUTOR_PRIORITY
override fun accept(project: Project) = hasSourceFiles(project) override fun accept(project: Project) = sourceFileCount(project) > 0
// IBuildConfigContributor // IBuildConfigContributor
protected fun sourceFileCount(project: Project)
= KFiles.findSourceFiles(project.directory, project.sourceDirectories, sourceSuffixes()).size +
KFiles.findSourceFiles(project.directory, project.sourceDirectoriesTest, sourceSuffixes()).size
private fun hasSourceFiles(project: Project) fun affinity(project: Project) = sourceFileCount(project)
= KFiles.findSourceFiles(project.directory, project.sourceDirectories, sourceSuffixes()).size > 0
fun affinity(project: Project) = if (hasSourceFiles(project)) 1 else 0 // IDocContributor
open fun affinity(project: Project, context: KobaltContext) = sourceFileCount(project)
abstract fun sourceSuffixes() : List<String> abstract fun sourceSuffixes() : List<String>
} }

View file

@ -1,5 +1,7 @@
package com.beust.kobalt.internal package com.beust.kobalt.internal
import com.beust.kobalt.TestResult
import com.beust.kobalt.api.IBuildListener
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.api.ProjectBuildStatus import com.beust.kobalt.api.ProjectBuildStatus
@ -25,9 +27,14 @@ abstract class BaseProjectRunner {
} }
fun runBuildListenersForTask(project: Project, context: KobaltContext, taskName: String, start: Boolean, fun runBuildListenersForTask(project: Project, context: KobaltContext, taskName: String, start: Boolean,
success: Boolean = false) { success: Boolean = false, testResult: TestResult? = null) {
context.pluginInfo.buildListeners.forEach { context.pluginInfo.buildListeners.forEach {
if (start) it.taskStart(project, context, taskName) else it.taskEnd(project, context, taskName, success) if (start) {
it.taskStart(project, context, taskName)
} else {
val info = IBuildListener.TaskEndInfo(success, testResult?.shortMessage, testResult?.longMessage)
it.taskEnd(project, context, taskName, info)
}
} }
} }
@ -50,6 +57,20 @@ abstract class BaseProjectRunner {
accept: (T) -> Boolean): accept: (T) -> Boolean):
DynamicGraph<T> { DynamicGraph<T> {
/**
* Add an edge from @param from to all its tasks.
*/
fun addEdge(result: DynamicGraph<T>, from: String, to: String, newToProcess: ArrayList<T>, text: String) {
val froms = nodeMap[from]
froms.forEach { f: T ->
nodeMap[to].forEach { t: T ->
kobaltLog(TAG, " Adding edge ($text) $f -> $t")
result.addEdge(f, t)
newToProcess.add(t)
}
}
}
val result = DynamicGraph<T>() val result = DynamicGraph<T>()
val newToProcess = arrayListOf<T>() val newToProcess = arrayListOf<T>()
val seen = hashSetOf<String>() val seen = hashSetOf<String>()
@ -79,20 +100,6 @@ abstract class BaseProjectRunner {
while (toProcess.size > 0) { while (toProcess.size > 0) {
/**
* Add an edge from @param from to all its tasks.
*/
fun addEdge(result: DynamicGraph<T>, from: String, to: String, newToProcess: ArrayList<T>, text: String) {
val froms = nodeMap[from]
froms.forEach { f: T ->
nodeMap[to].forEach { t: T ->
kobaltLog(TAG, " Adding edge ($text) $f -> $t")
result.addEdge(f, t)
newToProcess.add(t)
}
}
}
/** /**
* Whenever a task is added to the graph, we also add its alwaysRunAfter tasks. * Whenever a task is added to the graph, we also add its alwaysRunAfter tasks.
*/ */
@ -144,27 +151,35 @@ abstract class BaseProjectRunner {
addEdge(result, taskName, to, newToProcess, "dependsOn") addEdge(result, taskName, to, newToProcess, "dependsOn")
} }
//
// runBefore and runAfter (task ordering) are only considered for explicit tasks (tasks that were
// explicitly requested by the user)
//
passedTasks.map { it.taskName }.let { taskNames ->
runBefore[taskName].forEach { from ->
addEdge(result, from, taskName, newToProcess, "runBefore")
}
runAfter[taskName].forEach { to ->
addEdge(result, to, taskName, newToProcess, "runAfter")
}
}
seen.add(taskName) seen.add(taskName)
} }
newToProcess.forEach { processAlways(always, it) } newToProcess.forEach { processAlways(always, it) }
toProcess.clear() toProcess.clear()
toProcess.addAll(newToProcess.filter { !seen.contains(toName(it)) }.map { TaskManager.TaskInfo(toName(it)) }) toProcess.addAll(
newToProcess
.filter { !seen.contains(toName(it)) }
.map { TaskManager.TaskInfo(toName(it)) })
newToProcess.clear() newToProcess.clear()
} }
//
// Now that we have all the tasks tnat need to run, process runBefore/runAfter, which
// are not allowed to add new tasks. Therefore, we only add edges to the graph if both
// the from and the to are already present.
//
val finalTaskNames = result.nodes.map { TaskManager.TaskInfo(it.toString()).taskName }
finalTaskNames.forEach { taskName ->
runBefore[taskName].filter { finalTaskNames.contains(it) }.forEach { from ->
addEdge(result, from, taskName, newToProcess, "runBefore")
}
runAfter[taskName].filter { finalTaskNames.contains(it) }.forEach { to ->
addEdge(result, to, taskName, newToProcess, "runAfter")
}
}
return result return result
} }
} }

View file

@ -11,7 +11,8 @@ import java.util.concurrent.ConcurrentHashMap
*/ */
class BuildListeners : IBuildListener, IBuildReportContributor { class BuildListeners : IBuildListener, IBuildReportContributor {
class ProfilerInfo(val taskName: String, val durationMillis: Long) class ProfilerInfo(val taskName: String, val durationMillis: Long)
class ProjectInfo(val projectName: String, var durationMillis: Long = 0) class ProjectInfo(val projectName: String, var durationMillis: Long = 0,
var shortMessage: String? = null, var longMessage: String? = null)
private val startTimes = ConcurrentHashMap<String, Long>() private val startTimes = ConcurrentHashMap<String, Long>()
private val timings = arrayListOf<ProfilerInfo>() private val timings = arrayListOf<ProfilerInfo>()
@ -29,18 +30,21 @@ class BuildListeners : IBuildListener, IBuildReportContributor {
} }
// IBuildListener // IBuildListener
override fun taskEnd(project: Project, context: KobaltContext, taskName: String, success: Boolean) { override fun taskEnd(project: Project, context: KobaltContext, taskName: String, info: IBuildListener.TaskEndInfo) {
val success = info.success
if (! success) hasFailures = true if (! success) hasFailures = true
startTimes[taskName]?.let { startTimes[taskName]?.let {
val taskTime = System.currentTimeMillis() - it val taskTime = System.currentTimeMillis() - it
timings.add(ProfilerInfo(taskName, taskTime)) timings.add(ProfilerInfo(taskName, taskTime))
projectInfos[project.name]?.let { projectInfos[project.name]?.let {
it.durationMillis += taskTime.toLong() it.durationMillis += taskTime
if (info.shortMessage != null && it.shortMessage == null) it.shortMessage = info.shortMessage
if (info.longMessage != null && it.longMessage == null) it.longMessage = info.longMessage
} }
} }
} }
private val projectStatuses = arrayListOf<Pair<Project, ProjectBuildStatus>>() private val projectStatuses = arrayListOf<Pair<Project, String>>()
// IBuildListener // IBuildListener
override fun projectStart(project: Project, context: KobaltContext) { override fun projectStart(project: Project, context: KobaltContext) {
@ -49,7 +53,9 @@ class BuildListeners : IBuildListener, IBuildReportContributor {
// IBuildListener // IBuildListener
override fun projectEnd(project: Project, context: KobaltContext, status: ProjectBuildStatus) { override fun projectEnd(project: Project, context: KobaltContext, status: ProjectBuildStatus) {
projectStatuses.add(Pair(project, status)) val shortMessage = projectInfos[project.name]?.shortMessage
val statusText = status.toString() + (if (shortMessage != null) " ($shortMessage)" else "")
projectStatuses.add(Pair(project, statusText))
} }
// IBuildReportContributor // IBuildReportContributor
@ -59,7 +65,6 @@ class BuildListeners : IBuildListener, IBuildReportContributor {
fun formatMillisLeft(millis: Long, length: Int) = formatMillis(millis, "%1\$-$length.2f") fun formatMillisLeft(millis: Long, length: Int) = formatMillis(millis, "%1\$-$length.2f")
fun millisToSeconds(millis: Long) = (millis.toDouble() / 1000).toInt() fun millisToSeconds(millis: Long) = (millis.toDouble() / 1000).toInt()
val buildTime = millisToSeconds(System.currentTimeMillis() - buildStartTime!!)
val profiling = args.profiling val profiling = args.profiling
if (profiling) { if (profiling) {
@ -71,10 +76,15 @@ class BuildListeners : IBuildListener, IBuildReportContributor {
} }
// Calculate the longest short message so we can create a column long enough to contain it
val width = 12 + (projectInfos.values.map { it.shortMessage?.length ?: 0 }.maxBy { it } ?: 0)
fun col1(s: String) = String.format(" %1\$-30s", s) fun col1(s: String) = String.format(" %1\$-30s", s)
fun col2(s: String) = String.format(" %1\$-13s", s) fun col2(s: String) = String.format(" %1\$-${width}s", s)
fun col3(s: String) = String.format(" %1\$-8s", s) fun col3(s: String) = String.format(" %1\$-8s", s)
// Only print the build report if there is more than one project and at least one of them failed // Only print the build report if there is more than one project and at least one of them failed
if (timings.any()) { if (timings.any()) {
// if (timings.size > 1 && hasFailures) { // if (timings.size > 1 && hasFailures) {
@ -84,7 +94,7 @@ class BuildListeners : IBuildListener, IBuildReportContributor {
table.append(AsciiArt.logBox(listOf(line), AsciiArt.bottomLeft2, AsciiArt.bottomRight2, indent = 10) + "\n") table.append(AsciiArt.logBox(listOf(line), AsciiArt.bottomLeft2, AsciiArt.bottomRight2, indent = 10) + "\n")
projectStatuses.forEach { pair -> projectStatuses.forEach { pair ->
val projectName = pair.first.name val projectName = pair.first.name
val cl = listOf(col1(projectName), col2(pair.second.toString()), val cl = listOf(col1(projectName), col2(pair.second),
col3(formatMillisLeft(projectInfos[projectName]!!.durationMillis, 8))) col3(formatMillisLeft(projectInfos[projectName]!!.durationMillis, 8)))
.joinToString(AsciiArt.verticalBar) .joinToString(AsciiArt.verticalBar)
table.append(" " + AsciiArt.verticalBar + " " + cl + " " + AsciiArt.verticalBar + "\n") table.append(" " + AsciiArt.verticalBar + " " + cl + " " + AsciiArt.verticalBar + "\n")
@ -94,14 +104,19 @@ class BuildListeners : IBuildListener, IBuildReportContributor {
// } // }
} }
val buildTime =
if (buildStartTime != null)
millisToSeconds(System.currentTimeMillis() - buildStartTime!!)
else
0
// BUILD SUCCESSFUL / FAILED message // BUILD SUCCESSFUL / FAILED message
val message = val message =
if (hasFailures) { if (hasFailures) {
String.format("BUILD FAILED", buildTime) String.format("BUILD FAILED", buildTime)
} else if (args.parallel) { } else if (! args.sequential) {
val sequentialBuildTime = ((projectInfos.values.sumByDouble { it.durationMillis.toDouble() }) / 1000) val sequentialBuildTime = ((projectInfos.values.sumByDouble { it.durationMillis.toDouble() }) / 1000)
.toInt() .toInt()
String.format("PARALLEL BUILD SUCCESSFUL (%d SECONDS), sequential build sould have taken %d seconds", String.format("PARALLEL BUILD SUCCESSFUL (%d SECONDS), sequential build would have taken %d seconds",
buildTime, sequentialBuildTime) buildTime, sequentialBuildTime)
} else { } else {
String.format("BUILD SUCCESSFUL (%d SECONDS)", buildTime) String.format("BUILD SUCCESSFUL (%d SECONDS)", buildTime)

View file

@ -3,7 +3,6 @@ package com.beust.kobalt.internal
import com.beust.kobalt.TaskResult import com.beust.kobalt.TaskResult
import com.beust.kobalt.api.* import com.beust.kobalt.api.*
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.DependencyManager2
import com.beust.kobalt.maven.aether.Scope import com.beust.kobalt.maven.aether.Scope
import com.beust.kobalt.maven.dependency.FileDependency import com.beust.kobalt.maven.dependency.FileDependency
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
@ -15,14 +14,12 @@ import java.util.*
/** /**
* Central place to compile files, used by plug-ins and non plug-ins. * Central place to compile files, used by plug-ins and non plug-ins.
*/ */
class CompilerUtils @Inject constructor(val files: KFiles, class CompilerUtils @Inject constructor(val files: KFiles, val dependencyManager: DependencyManager) {
val dependencyManager: DependencyManager,
val dependencyManager2: DependencyManager2) {
class CompilerResult(val successResults: List<TaskResult>, val failedResult: TaskResult?) class CompilerResult(val successResults: List<TaskResult>, val failedResult: TaskResult?)
fun invokeCompiler(project: Project, context: KobaltContext, compiler: ICompilerDescription, fun invokeCompiler(project: Project, context: KobaltContext, compiler: ICompilerDescription,
sourceDirectories: List<File>, isTest: Boolean): CompilerResult { sourceDirectories: List<File>, isTest: Boolean, buildDirectory: File): CompilerResult {
val results = arrayListOf<TaskResult>() val results = arrayListOf<TaskResult>()
var failedResult: TaskResult? = null var failedResult: TaskResult? = null
val contributedSourceDirs = val contributedSourceDirs =
@ -33,11 +30,11 @@ class CompilerUtils @Inject constructor(val files: KFiles,
} }
val sourceFiles = KFiles.findSourceFiles(project.directory, val sourceFiles = KFiles.findSourceFiles(project.directory,
contributedSourceDirs.map { it.path }, compiler.sourceSuffixes) contributedSourceDirs.map { it.path }, compiler.sourceSuffixes)
if (sourceFiles.size > 0) { if (sourceFiles.isNotEmpty()) {
// TODO: createCompilerActionInfo recalculates the source files, only compute them // TODO: createCompilerActionInfo recalculates the source files, only compute them
// once and pass them // once and pass them
val info = createCompilerActionInfo(project, context, compiler, isTest, val info = createCompilerActionInfo(project, context, compiler, isTest,
sourceDirectories, sourceSuffixes = compiler.sourceSuffixes) sourceDirectories, sourceSuffixes = compiler.sourceSuffixes, buildDirectory = buildDirectory)
val thisResult = invokeCompiler(project, context, compiler, info) val thisResult = invokeCompiler(project, context, compiler, info)
results.addAll(thisResult.successResults) results.addAll(thisResult.successResults)
if (failedResult == null) { if (failedResult == null) {
@ -68,32 +65,22 @@ class CompilerUtils @Inject constructor(val files: KFiles,
* Runs all the contributors and interceptors relevant to that task. * Runs all the contributors and interceptors relevant to that task.
*/ */
fun createCompilerActionInfo(project: Project, context: KobaltContext, compiler: ICompilerDescription, fun createCompilerActionInfo(project: Project, context: KobaltContext, compiler: ICompilerDescription,
isTest: Boolean, sourceDirectories: List<File>, sourceSuffixes: List<String>): CompilerActionInfo { isTest: Boolean, sourceDirectories: List<File>, sourceSuffixes: List<String>, buildDirectory: File)
: CompilerActionInfo {
copyResources(project, context, SourceSet.of(isTest)) copyResources(project, context, SourceSet.of(isTest))
val fullClasspath = dependencyManager2.resolve(project, context, isTest, listOf(Scope.COMPILE, Scope.TEST)) val fullClasspath = dependencyManager.calculateDependencies(project, context,
scopes = if (isTest) {
listOf(Scope.COMPILE, Scope.COMPILEONLY, Scope.TEST)
} else {
listOf(Scope.COMPILE, Scope.COMPILEONLY)
})
// if (project.name == "ktor-core" && isTest) {
// val contains = fullClasspath.filter{it.id.contains("json")}
// val fc1 =
// if (isTest) dependencyManager.testDependencies(project, context)
// else dependencyManager.dependencies(project, context)
//
// println("DONOTCOMMIT")
// val d2 = dependencyManager2.resolve(project, context, isTest, listOf(Scope.COMPILE, Scope.TEST))
// }
// The directory where the classes get compiled
val buildDirectory =
if (isTest) File(project.buildDirectory, KFiles.TEST_CLASSES_DIR)
else File(project.classesDir(context))
File(project.directory, buildDirectory.path).mkdirs() File(project.directory, buildDirectory.path).mkdirs()
// Remove all the excluded dependencies from the classpath // Remove all the excluded dependencies from the classpath
var classpath = fullClasspath.filter { var classpath = fullClasspath
! isDependencyExcluded(it, project.excludedDependencies)
}
// The classpath needs to contain $buildDirectory/classes as well so that projects that contain // The classpath needs to contain $buildDirectory/classes as well so that projects that contain
// multiple languages can use classes compiled by the compiler run before them. // multiple languages can use classes compiled by the compiler run before them.
@ -137,7 +124,8 @@ class CompilerUtils @Inject constructor(val files: KFiles,
// depending on the compiler's ability, sourceFiles can actually contain a list of directories // depending on the compiler's ability, sourceFiles can actually contain a list of directories
// instead of individual source files. // instead of individual source files.
val projectDirectory = File(project.directory) val projectDirectory = File(project.directory)
val sourceFiles = if (compiler.canCompileDirectories) { val sourceFiles =
if (compiler.canCompileDirectories) {
allSourceDirectories.map { File(projectDirectory, it.path).path } allSourceDirectories.map { File(projectDirectory, it.path).path }
} else { } else {
files.findRecursively(projectDirectory, allSourceDirectories, files.findRecursively(projectDirectory, allSourceDirectories,
@ -185,7 +173,7 @@ class CompilerUtils @Inject constructor(val files: KFiles,
// Finally, alter the info with the compiler interceptors before returning it // Finally, alter the info with the compiler interceptors before returning it
val initialActionInfo = CompilerActionInfo(projectDirectory.path, classpath, allSources, val initialActionInfo = CompilerActionInfo(projectDirectory.path, classpath, allSources,
sourceSuffixes, buildDirectory, emptyList() /* the flags will be provided by flag contributors */, sourceSuffixes, buildDirectory, emptyList() /* the flags will be provided by flag contributors */,
emptyList()) emptyList(), context.internalContext.forceRecompile)
val result = context.pluginInfo.compilerInterceptors.fold(initialActionInfo, { ai, interceptor -> val result = context.pluginInfo.compilerInterceptors.fold(initialActionInfo, { ai, interceptor ->
interceptor.intercept(project, context, ai) interceptor.intercept(project, context, ai)
}) })
@ -205,28 +193,40 @@ class CompilerUtils @Inject constructor(val files: KFiles,
val outputDir = sourceSet.outputDir val outputDir = sourceSet.outputDir
val variantSourceDirs = context.variant.resourceDirectories(project, sourceSet) val variantSourceDirs = context.variant.resourceDirectories(project, sourceSet)
if (variantSourceDirs.size > 0) { if (variantSourceDirs.isNotEmpty()) {
context.logger.log(project.name, 2, "Copying $sourceSet resources") context.logger.log(project.name, 2, "Copying $sourceSet resources")
val absOutputDir = File(KFiles.joinDir(project.directory, project.buildDirectory, outputDir)) val absOutputDir = File(KFiles.joinDir(project.directory, project.buildDirectory, outputDir))
variantSourceDirs variantSourceDirs
.map { File(project.directory, it.path) } .map { File(project.directory, it.path) }
.filter(File::exists) .filter(File::exists)
.forEach { .forEach {
context.logger.log(project.name, 2, "Copying from $it to $absOutputDir") context.logger.log(project.name, 2, "Copying from $it to $absOutputDir")
KFiles.copyRecursively(it, absOutputDir, deleteFirst = false) KFiles.copyRecursively(it, absOutputDir, replaceExisting = true)
} }
} else { } else {
context.logger.log(project.name, 2, "No resources to copy for $sourceSet") context.logger.log(project.name, 2, "No resources to copy for $sourceSet")
} }
} }
fun sourceCompilerFlags(project: Project?, context: KobaltContext, info: CompilerActionInfo) : List<String> {
val adapters = context.pluginInfo.compilerFlagContributors.map {
val closure = { project: Project, context: KobaltContext, currentFlags: List<String>,
suffixesBeingCompiled: List<String>
-> it.compilerFlagsFor(project, context, currentFlags, suffixesBeingCompiled) }
FlagContributor(it.flagPriority, closure)
}
return compilerFlags(project, context, info, adapters)
}
/** fun compilerFlags(project: Project?, context: KobaltContext, info: CompilerActionInfo,
* Naïve implementation: just exclude all dependencies that start with one of the excluded dependencies. adapters: List<FlagContributor>) : List<String> {
* Should probably make exclusion more generic (full on string) or allow exclusion to be specified val result = arrayListOf<String>()
* formally by groupId or artifactId. if (project != null) {
*/ adapters.sortedBy { it.flagPriority }
private fun isDependencyExcluded(id: IClasspathDependency, excluded: List<IClasspathDependency>) adapters.forEach {
= excluded.any { id.id.startsWith(it.id) } result.addAll(it.flagsFor(project, context, result, info.suffixesBeingCompiled))
}
}
return result
}
} }

View file

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

View file

@ -1,17 +1,14 @@
package com.beust.kobalt.internal package com.beust.kobalt.internal
import com.beust.kobalt.AsciiTable import com.beust.kobalt.*
import com.beust.kobalt.KobaltException import com.beust.kobalt.misc.*
import com.beust.kobalt.TaskResult
import com.beust.kobalt.misc.NamedThreadFactory
import com.beust.kobalt.misc.error
import com.beust.kobalt.misc.kobaltLog
import com.google.common.collect.HashMultimap import com.google.common.collect.HashMultimap
import java.lang.reflect.InvocationTargetException import java.lang.reflect.InvocationTargetException
import java.util.* import java.util.*
import java.util.concurrent.* import java.util.concurrent.*
open class TaskResult2<T>(success: Boolean, errorMessage: String?, val value: T) : TaskResult(success, errorMessage) { open class TaskResult2<T>(success: Boolean, testResult: TestResult? = null,
errorMessage: String? = null, val value: T) : TaskResult(success, testResult, errorMessage) {
override fun toString() = com.beust.kobalt.misc.toString("TaskResult", "value", value, "success", success) override fun toString() = com.beust.kobalt.misc.toString("TaskResult", "value", value, "success", success)
} }
@ -64,15 +61,18 @@ class DynamicGraph<T> {
} }
} }
fun <T> transitiveClosureGraph(roots: List<T>, childrenFor: (T) -> List<T>) : List<Node<T>> fun <T> transitiveClosureGraph(roots: List<T>, childrenFor: (T) -> List<T>,
= roots.map { transitiveClosureGraph(it, childrenFor) } filter: (T) -> Boolean): List<Node<T>>
= roots.map { transitiveClosureGraph(it, childrenFor, filter) }
fun <T> transitiveClosureGraph(root: T, childrenFor: (T) -> List<T>, seen: HashSet<T> = hashSetOf()) : Node<T> { fun <T> transitiveClosureGraph(root: T, childrenFor: (T) -> List<T>,
filter: (T) -> Boolean = { t: T -> true },
seen: HashSet<T> = hashSetOf()) : Node<T> {
val children = arrayListOf<Node<T>>() val children = arrayListOf<Node<T>>()
childrenFor(root).forEach { child -> childrenFor(root).filter(filter).forEach { child ->
if (! seen.contains(child)) { if (! seen.contains(child)) {
seen.add(child) seen.add(child)
val c = transitiveClosureGraph(child, childrenFor, seen) val c = transitiveClosureGraph(child, childrenFor, filter, seen)
children.add(c) children.add(c)
} }
} }
@ -189,7 +189,7 @@ class DynamicGraphExecutor<T>(val graph : DynamicGraph<T>, val factory: IThreadW
= Executors.newFixedThreadPool(threadCount, NamedThreadFactory("DynamicGraphExecutor")) = Executors.newFixedThreadPool(threadCount, NamedThreadFactory("DynamicGraphExecutor"))
val completion = ExecutorCompletionService<TaskResult2<T>>(executor) val completion = ExecutorCompletionService<TaskResult2<T>>(executor)
class HistoryLog(val name: String, val timestamp: Long, val threadId: Long, val start: Boolean) data class HistoryLog(val name: String, val timestamp: Long, val threadId: Long, val start: Boolean)
val historyLog = arrayListOf<HistoryLog>() val historyLog = arrayListOf<HistoryLog>()
val threadIds = ConcurrentHashMap<Long, Long>() val threadIds = ConcurrentHashMap<Long, Long>()
@ -282,60 +282,99 @@ class DynamicGraphExecutor<T>(val graph : DynamicGraph<T>, val factory: IThreadW
fun toSeconds(millis: Long) = (millis / 1000).toInt().toString() fun toSeconds(millis: Long) = (millis / 1000).toInt().toString()
// class CompressedLog(val timestamp: Long, val threadMap: HashMap<Long, String>) fun displayCompressedLog(table: AsciiTable.Builder) : AsciiTable.Builder {
// data class CompressedLog(val timestamp: Long, val threadMap: HashMap<Long, String>)
// fun compressLog(historyLog: List<HistoryLog>): ArrayList<CompressedLog> {
// val compressed = arrayListOf<CompressedLog>()
//
// var currentLog: CompressedLog? = null
//
// historyLog.forEach { hl ->
// if (currentLog == null) {
// currentLog = CompressedLog(hl.timestamp, hashMapOf(hl.threadId to hl.name))
// } else currentLog?.let { cl ->
// if (hl.timestamp - cl.timestamp < 1000) {
// cl.threadMap[hl.threadId] = hl.name
// } else {
// compressed.add(cl)
// currentLog = null
// }
// }
// }
// return compressed
// }
//
// compressLog(historyLog).forEach {
// val row = arrayListOf<String>()
// row.add(toSeconds(it.timestamp))
// it.threadMap.values.forEach {
// row.add(it)
// }
// table.addRow(row)
// }
val start = historyLog[0].timestamp fun compressLog(historyLog: List<HistoryLog>): ArrayList<CompressedLog> {
val projectStart = ConcurrentHashMap<String, Long>() val compressed = arrayListOf<CompressedLog>()
historyLog.forEach { line ->
val row = arrayListOf<String>() var currentLog: CompressedLog? = null
row.add(toSeconds(line.timestamp - start))
threadIds.keys.forEach { val projectStart = hashMapOf<String, Long>()
if (line.threadId == it) { fun toName(hl: HistoryLog) : String {
var duration = "" var duration = ""
if (line.start) { if (! hl.start) {
projectStart[line.name] = line.timestamp val start = projectStart[hl.name]
} else { if (start != null) {
duration = " (" + ((line.timestamp - projectStart[line.name]!!) / 1000) duration = " (" + ((hl.timestamp - start) / 1000)
.toInt().toString() + ")" .toInt().toString() + ")"
} else {
kobaltLog(1, "DONOTCOMMIT")
}
} }
row.add((line.name + duration)) return hl.name + duration
} else {
row.add("")
} }
historyLog.forEach { hl ->
kobaltLog(1, "CURRENT LOG: " + currentLog + " HISTORY LINE: " + hl)
if (hl.start) {
projectStart[hl.name] = hl.timestamp
}
if (currentLog == null) {
currentLog = CompressedLog(hl.timestamp, hashMapOf(hl.threadId to hl.name))
} else currentLog?.let { cl ->
if (! hl.start || hl.timestamp - cl.timestamp < 1000) {
kobaltLog(1, " CURRENT LOG IS WITHING ONE SECOND: $hl")
cl.threadMap[hl.threadId] = toName(hl)
} else {
kobaltLog(1, " ADDING COMPRESSED LINE $cl")
compressed.add(cl)
currentLog = CompressedLog(hl.timestamp, hashMapOf(hl.threadId to toName(hl)))
}
}
}
return compressed
} }
table.addRow(row)
compressLog(historyLog).forEach {
val row = arrayListOf<String>()
row.add(toSeconds(it.timestamp))
it.threadMap.values.forEach {
row.add(it)
}
table.addRow(row)
}
return table
} }
println(table.build()) fun displayRegularLog(table: AsciiTable.Builder) : AsciiTable.Builder {
if (historyLog.any()) {
if (historyLog[0] != null) {
val start = historyLog[0].timestamp
val projectStart = ConcurrentHashMap<String, Long>()
historyLog.forEach { line ->
val row = arrayListOf<String>()
row.add(toSeconds(line.timestamp - start))
threadIds.keys.forEach {
if (line.threadId == it) {
var duration = ""
if (line.start) {
projectStart[line.name] = line.timestamp
} else {
val projectStart = projectStart[line.name]
if (projectStart != null) {
duration = " (" + ((line.timestamp - projectStart) / 1000)
.toInt().toString() + ")"
} else {
warn("Couldn't determine project start: " + line.name)
}
}
row.add((line.name + duration))
} else {
row.add("")
}
}
table.addRow(row)
}
} else {
warn("Couldn't find historyLog")
}
}
return table
}
kobaltLog(1, displayRegularLog(table).build())
} }
} }
@ -355,7 +394,7 @@ fun main(argv: Array<String>) {
object: IWorker<String> { object: IWorker<String> {
override fun call(): TaskResult2<String>? { override fun call(): TaskResult2<String>? {
kobaltLog(1, " Running worker $it") kobaltLog(1, " Running worker $it")
return TaskResult2(true, null, it) return TaskResult2(true, value = it)
} }
override val priority: Int get() = 0 override val priority: Int get() = 0

View file

@ -2,9 +2,9 @@ package com.beust.kobalt.internal
import com.beust.kobalt.* import com.beust.kobalt.*
import com.beust.kobalt.api.* import com.beust.kobalt.api.*
import com.beust.kobalt.maven.DependencyManager2
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
import com.google.common.annotations.VisibleForTesting import com.google.common.annotations.VisibleForTesting
import com.google.inject.Inject
import java.io.File import java.io.File
import java.util.* import java.util.*
@ -16,17 +16,31 @@ abstract class GenericTestRunner: ITestRunnerContributor {
abstract val dependencyName : String abstract val dependencyName : String
abstract val mainClass: String abstract val mainClass: String
abstract val annotationPackage: String abstract val annotationPackage: String
abstract val runnerName: String
open var shortMessage: String? = null
open var longMessage: String? = null
@Inject
private lateinit var jvm: Jvm
abstract fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>, abstract fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>,
testConfig: TestConfig) : List<String> testConfig: TestConfig) : List<String>
open fun onFinish(project: Project) {}
open val extraClasspath: List<String> = emptyList()
open fun filterTestClasses(project: Project, context: KobaltContext, classes: List<String>) : List<String> = classes
override fun run(project: Project, context: KobaltContext, configName: String, override fun run(project: Project, context: KobaltContext, configName: String,
classpath: List<IClasspathDependency>) classpath: List<IClasspathDependency>) : TaskResult {
= TaskResult(runTests(project, context, classpath, configName)) val tr = runTests(project, context, classpath, configName)
return TaskResult(tr.success, testResult = tr)
}
override fun affinity(project: Project, context: KobaltContext) : Int { override fun affinity(project: Project, context: KobaltContext) : Int {
val td = Kobalt.INJECTOR.getInstance(DependencyManager2::class.java).resolve(project, context, isTest = true)
val result = val result =
if (td.any { it.id.contains(dependencyName) }) IAffinity.DEFAULT_POSITIVE_AFFINITY if (project.testDependencies.any { it.id.contains(dependencyName) }) IAffinity.DEFAULT_POSITIVE_AFFINITY
else 0 else 0
return result return result
} }
@ -55,7 +69,7 @@ abstract class GenericTestRunner: ITestRunnerContributor {
// } // }
context.logger.log(project.name, 2, "Found ${result.size} test classes") context.logger.log(project.name, 2, "Found ${result.size} test classes")
return result.map { it.second } return filterTestClasses(project, context, result.map { it.second })
} }
/** /**
@ -94,17 +108,20 @@ abstract class GenericTestRunner: ITestRunnerContributor {
/** /**
* @return true if all the tests passed * @return true if all the tests passed
*/ */
fun runTests(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>, open fun runTests(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>,
configName: String) : Boolean { configName: String) : TestResult {
var result = false var result = false
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) {
val java = JavaInfo.create(File(SystemProperties.javaBase)).javaExecutable val java = jvm.javaExecutable
val jvmArgs = calculateAllJvmArgs(project, context, testConfig, classpath, val jvmArgs = calculateAllJvmArgs(project, context, testConfig, classpath,
Kobalt.INJECTOR.getInstance (PluginInfo::class.java)) Kobalt.INJECTOR.getInstance (PluginInfo::class.java))
val allArgs = arrayListOf<String>().apply { val allArgs = arrayListOf<String>().apply {
@ -120,12 +137,7 @@ abstract class GenericTestRunner: ITestRunnerContributor {
context.logger.log(project.name, 2, "Running tests with classpath size ${classpath.size}") context.logger.log(project.name, 2, "Running tests with classpath size ${classpath.size}")
context.logger.log(project.name, 2, "Launching " + allArgs.joinToString(" ")) context.logger.log(project.name, 2, "Launching " + allArgs.joinToString(" "))
val process = pb.start() val process = pb.start()
val errorCode = process.waitFor() errorCode = process.waitFor()
if (errorCode == 0) {
context.logger.log(project.name, 1, "All tests passed")
} else {
context.logger.log(project.name, 1, "Test failures")
}
result = result || errorCode == 0 result = result || errorCode == 0
} else { } else {
context.logger.log(project.name, 1, " No tests to run") context.logger.log(project.name, 1, " No tests to run")
@ -134,7 +146,16 @@ abstract class GenericTestRunner: ITestRunnerContributor {
} else { } else {
throw KobaltException("Couldn't find a test configuration named \"$configName\"") throw KobaltException("Couldn't find a test configuration named \"$configName\"")
} }
return result
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)
} }
/* /*
@ -143,11 +164,13 @@ abstract class GenericTestRunner: ITestRunnerContributor {
@VisibleForTesting @VisibleForTesting
fun calculateAllJvmArgs(project: Project, context: KobaltContext, fun calculateAllJvmArgs(project: Project, context: KobaltContext,
testConfig: TestConfig, classpath: List<IClasspathDependency>, pluginInfo: IPluginInfo) : List<String> { testConfig: TestConfig, classpath: List<IClasspathDependency>, pluginInfo: IPluginInfo) : List<String> {
val fullClasspath = classpath.map { it.jarFile.get().absolutePath } + extraClasspath
// Default JVM args // Default JVM args
val jvmFlags = arrayListOf<String>().apply { val jvmFlags = arrayListOf<String>().apply {
addAll(testConfig.jvmArgs) addAll(testConfig.jvmArgs)
add("-ea")
add("-classpath") add("-classpath")
add(classpath.map { it.jarFile.get().absolutePath }.joinToString(File.pathSeparator)) add(fullClasspath.joinToString(File.pathSeparator))
} }
// JVM flags from the contributors // JVM flags from the contributors

View file

@ -0,0 +1,35 @@
package com.beust.kobalt.internal
/**
* Generic operations on graph-like structures.
*/
object GraphUtil {
/**
* Apply the operation in `closure` to all the nodes in the tree.
*/
fun <T> map(roots: List<T>, children: (T) -> List<T>, closure: (T) -> Unit) {
roots.forEach {
closure(it)
map(children(it), children, closure)
}
}
/**
* Display each node in the roots by calling the `display` function on each of them.
*/
fun <T> displayGraph(roots: List<T>,
children: (T) -> List<T>,
display: (node: T, indent: String) -> Unit) {
fun pd(node: T, indent: String) {
display(node, indent)
children(node).forEach {
pd(it, indent + " ")
}
}
roots.forEach {
pd(it, "")
}
}
}

View file

@ -0,0 +1,152 @@
package com.beust.kobalt.internal
import com.beust.jcommander.JCommander
import com.beust.jcommander.Parameter
import com.beust.kobalt.TestConfig
import com.beust.kobalt.api.IAffinity
import com.beust.kobalt.api.IClasspathDependency
import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.KobaltLogger
import com.google.inject.Inject
import org.junit.platform.engine.TestExecutionResult
import org.junit.platform.engine.discovery.DiscoverySelectors
import org.junit.platform.engine.reporting.ReportEntry
import org.junit.platform.engine.support.descriptor.MethodSource
import org.junit.platform.launcher.LauncherDiscoveryRequest
import org.junit.platform.launcher.TestExecutionListener
import org.junit.platform.launcher.TestIdentifier
import org.junit.platform.launcher.TestPlan
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder
import org.junit.platform.launcher.core.LauncherFactory
import java.io.File
import java.nio.file.Paths
/**
* Runner for JUnit 5 tests. This class also contains a main() entry point since JUnit 5 no longer supplies one.
*/
class JUnit5Runner @Inject constructor(kFiles: KFiles) : GenericTestRunner() {
override val dependencyName = "jupiter"
override val annotationPackage = "org.junit.jupiter.api"
override val mainClass = "com.beust.kobalt.internal.JUnit5RunnerKt"
override val runnerName = "JUnit 5"
override fun affinity(project: Project, context: KobaltContext) : Int {
val result =
if (project.testDependencies.any { it.id.contains("junit5") || it.id.contains("jupiter") })
IAffinity.DEFAULT_POSITIVE_AFFINITY + 100
else 0
return result
}
override fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>, testConfig: TestConfig): List<String> {
val testClassDir = KFiles.joinDir(project.buildDirectory, KFiles.TEST_CLASSES_DIR)
val classDir = KFiles.joinDir(project.buildDirectory, KFiles.CLASSES_DIR)
val args = listOf("--testClassDir", testClassDir,
"--classDir", classDir,
"--log", KobaltLogger.LOG_LEVEL.toString())
return args
}
override val extraClasspath = kFiles.kobaltJar
}
private class Args {
@Parameter(names = arrayOf("--log"))
var log: Int = 1
@Parameter(names = arrayOf("--testClassDir"))
var testClassDir: String = "kobaltBuild/test-classes"
@Parameter(names = arrayOf("--classDir"))
var classDir: String = "kobaltBuild/classes"
}
fun main(argv: Array<String>) {
val args = Args()
val jc = JCommander(args)
jc.parse(*argv)
val testClassDir = File(args.testClassDir).absolutePath
val classDir = File(args.classDir).absolutePath
val request : LauncherDiscoveryRequest = LauncherDiscoveryRequestBuilder()
.selectors(DiscoverySelectors.selectClasspathRoots(setOf(
Paths.get(testClassDir),
Paths.get(classDir)
)))
.selectors(DiscoverySelectors.selectDirectory(testClassDir))
.build()
fun testName(id: TestIdentifier) : String? {
val result =
if (id.source.isPresent) {
val source = id.source.get()
if (source is MethodSource) {
source.className + "." + source.methodName
} else {
null
}
} else {
null
}
return result
}
var passed = 0
var failed = 0
var skipped = 0
var aborted = 0
fun log(level: Int, s: String) {
if (level <= args.log) println(s)
}
val listener = object: TestExecutionListener {
override fun executionFinished(testIdentifier: TestIdentifier, testExecutionResult: TestExecutionResult) {
val testName = testName(testIdentifier)
if (testName != null) {
when(testExecutionResult.status) {
TestExecutionResult.Status.FAILED -> {
log(1, "FAILED: $testName, reason: " + testExecutionResult.throwable.get().toString())
failed++
}
TestExecutionResult.Status.ABORTED -> {
log(1, "ABORTED: $testName, reason: " + testExecutionResult.throwable.get().toString())
aborted++
}
TestExecutionResult.Status.SUCCESSFUL -> {
log(2, "PASSED: $testName")
passed++
} else -> {
}
}
}
}
override fun executionSkipped(testIdentifier: TestIdentifier, reason: String) {
testName(testIdentifier)?.let {
log(1, "Skipping $it because $reason")
skipped++
}
}
override fun executionStarted(testIdentifier: TestIdentifier) {
testName(testIdentifier)?.let {
log(2, "Starting $it")
}
}
override fun testPlanExecutionStarted(testPlan: TestPlan?) {}
override fun dynamicTestRegistered(testIdentifier: TestIdentifier?) {}
override fun reportingEntryPublished(testIdentifier: TestIdentifier?, entry: ReportEntry?) {}
override fun testPlanExecutionFinished(testPlan: TestPlan?) {}
}
LauncherFactory.create().execute(request, listener)
log(1, "TEST RESULTS: $passed PASSED, $failed FAILED, $skipped SKIPPED, $aborted ABORTED")
}

View file

@ -4,16 +4,29 @@ import com.beust.kobalt.TestConfig
import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.IClasspathDependency
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.maven.DependencyManager
import com.google.inject.Inject
import java.lang.reflect.Modifier
import java.net.URLClassLoader
open class JUnitRunner() : GenericTestRunner() { open class JUnitRunner() : GenericTestRunner() {
override val mainClass = "org.junit.runner.JUnitCore" override val mainClass = "org.junit.runner.JUnitCore"
override val annotationPackage = "org.junit" override val annotationPackage = "org.junit"
override val dependencyName = "junit" override val dependencyName = "junit"
override val runnerName = "JUnit 4"
override fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>, override fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>,
testConfig: TestConfig) = findTestClasses(project, context, testConfig) testConfig: TestConfig) = findTestClasses(project, context, testConfig)
@Inject
lateinit var dependencyManager: DependencyManager
override fun filterTestClasses(project: Project, context: KobaltContext, classes: List<String>) : List<String> {
val deps = dependencyManager.testDependencies(project, context)
val cl = URLClassLoader(deps.map { it.jarFile.get().toURI().toURL() }.toTypedArray())
return classes.filter { !Modifier.isAbstract(cl.loadClass(it).modifiers) }
}
} }

View file

@ -15,36 +15,25 @@ import java.util.*
* Also validates the classpath and run all the contributors. * Also validates the classpath and run all the contributors.
*/ */
class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager) { class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager) {
/** /**
* Take the given CompilerActionInfo and enrich it with all the applicable contributors and * Take the given CompilerActionInfo and enrich it with all the applicable contributors and
* then pass it to the ICompilerAction. * then pass it to the ICompilerAction.
*/ */
fun doCompile(project: Project?, context: KobaltContext?, action: ICompilerAction, info: CompilerActionInfo) fun doCompile(project: Project?, context: KobaltContext?, action: ICompilerAction, info: CompilerActionInfo,
: TaskResult { flags: List<String>): TaskResult {
// Dependencies // Dependencies
val allDependencies = (info.dependencies val allDependencies = (info.dependencies + dependencyManager.calculateDependencies(project, context!!,
+ dependencyManager.calculateDependencies(project, context!!, passedDependencies = info.dependencies)) passedDependencies = info.dependencies))
.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) {
val contributors = context.pluginInfo.compilerFlagContributors
contributors.sortBy { it.flagPriority }
context.pluginInfo.compilerFlagContributors.forEach {
currentFlags.addAll(it.flagsFor(project, context, currentFlags, info.suffixesBeingCompiled))
}
currentFlags
} else {
emptyList()
}
val addedFlags = contributorFlags + ArrayList(info.compilerArgs) val addedFlags = contributorFlags + ArrayList(info.compilerArgs)
validateClasspath(allDependencies.map { it.jarFile.get().absolutePath }) validateClasspath(allDependencies.map { it.jarFile.get().absolutePath })
return action.compile(project?.name, info.copy(dependencies = allDependencies, compilerArgs = addedFlags)) return action.compile(project, info.copy(dependencies = allDependencies, compilerArgs = addedFlags))
} }
private fun validateClasspath(cp: List<String>) { private fun validateClasspath(cp: List<String>) {
@ -57,5 +46,5 @@ class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager)
} }
interface ICompilerAction { interface ICompilerAction {
fun compile(projectName: String?, info: CompilerActionInfo): TaskResult fun compile(project: Project?, info: CompilerActionInfo): TaskResult
} }

View file

@ -9,9 +9,8 @@ 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.DependencyManager2
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.misc.KFiles import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.misc.KobaltExecutors
import com.beust.kobalt.misc.error import com.beust.kobalt.misc.error
@ -22,15 +21,13 @@ import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
/** /**
* This plug-in takes care of compilation: it declares a bunch of tasks ("compile", "compileTest") and * This plug-in takes care of compilation: it declares several common tasks ("compile", "compileTest")
* and picks up all the compiler contributors in order to run them whenever a compilation is requested. * and picks up all the compiler contributors in order to run them whenever a compilation is requested.
*/ */
@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 dependencyManager2: DependencyManager2,
open val executors: KobaltExecutors, open val executors: KobaltExecutors,
open val taskContributor : TaskContributor, open val taskContributor : TaskContributor,
val compilerUtils: CompilerUtils) val compilerUtils: CompilerUtils)
@ -88,9 +85,13 @@ open class JvmCompilerPlugin @Inject constructor(
context.pluginInfo.testRunnerContributors) context.pluginInfo.testRunnerContributors)
if (testContributor != null && testContributor.affinity(project, context) > 0) { if (testContributor != null && testContributor.affinity(project, context) > 0) {
// val td1 = dependencyManager.testDependencies(project, context) // val td1 = dependencyManager.testDependencies(project, context)
val testDependencies = dependencyManager2.resolve(project, context, isTest = true) val testDependencies = dependencyManager.calculateDependencies(project, context,
val compileDependencies = dependencyManager2.resolve(project, context, isTest = false) dependencyFilter = dependencyManager.createDependencyFilter(project, project.testDependencies),
return testContributor.run(project, context, configName, testDependencies + compileDependencies) scopes = listOf(Scope.TEST))
val compileDependencies = dependencyManager.calculateDependencies(project, context,
scopes = listOf(Scope.COMPILE, Scope.COMPILEONLY))
val allDependencies = (testDependencies + compileDependencies).distinct()
return testContributor.run(project, context, configName, allDependencies.toList())
} else { } else {
context.logger.log(project.name, 2, context.logger.log(project.name, 2,
"Couldn't find a test runner for project ${project.name}, did you specify dependenciesTest{}?") "Couldn't find a test runner for project ${project.name}, did you specify dependenciesTest{}?")
@ -150,13 +151,16 @@ open class JvmCompilerPlugin @Inject constructor(
val results = arrayListOf<TaskResult>() val results = arrayListOf<TaskResult>()
val compilerContributors = context.pluginInfo.compilerContributors val compilerContributors = context.pluginInfo.compilerContributors
ActorUtils.selectAffinityActors(project, context, ActorUtils.selectAffinityActors(project, context, context.pluginInfo.compilerContributors)
context.pluginInfo.compilerContributors)
var failedResult: TaskResult? = null var failedResult: TaskResult? = null
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()
/** /**
@ -170,7 +174,10 @@ 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
} }
@ -178,9 +185,14 @@ open class JvmCompilerPlugin @Inject constructor(
val hasKapt = project.projectProperties.get("kaptConfig") != null val hasKapt = project.projectProperties.get("kaptConfig") != null
val allCompilersSorted = if (hasKapt) swapJavaAndKotlin(allCompilers) else allCompilers val allCompilersSorted = if (hasKapt) swapJavaAndKotlin(allCompilers) else allCompilers
var done = false var done = false
// The directory where the classes get compiled
val buildDirectory =
if (isTest) File(KFiles.joinDir(project.buildDirectory, KFiles.TEST_CLASSES_DIR))
else File(KFiles.joinDir(project.classesDir(context)))
allCompilersSorted.doWhile({ ! done }) { compiler -> allCompilersSorted.doWhile({ ! done }) { compiler ->
val compilerResults = compilerUtils.invokeCompiler(project, context, compiler, val compilerResults = compilerUtils.invokeCompiler(project, context, compiler,
sourceDirectories(project, context, isTest), isTest) sourceDirectories(project, context, isTest), isTest, buildDirectory)
results.addAll(compilerResults.successResults) results.addAll(compilerResults.successResults)
if (failedResult == null) failedResult = compilerResults.failedResult if (failedResult == null) failedResult = compilerResults.failedResult
compilerResults.failedResult?.let { failedResult -> compilerResults.failedResult?.let { failedResult ->
@ -213,10 +225,12 @@ 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"))
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) {
val buildDirectory = File(project.buildDirectory, JvmCompilerPlugin.DOCS_DIRECTORY)
val contributors = val contributors =
ActorUtils.selectAffinityActors(project, context, context.pluginInfo.compilerContributors) ActorUtils.selectAffinityActors(project, context, context.pluginInfo.compilerContributors)
var result: TaskResult? = null var result: TaskResult? = null
@ -225,7 +239,7 @@ open class JvmCompilerPlugin @Inject constructor(
result = docGenerator.generateDoc(project, context, result = docGenerator.generateDoc(project, context,
compilerUtils.createCompilerActionInfo(project, context, compiler, compilerUtils.createCompilerActionInfo(project, context, compiler,
isTest = false, sourceDirectories = sourceDirectories(project, context, false), isTest = false, sourceDirectories = sourceDirectories(project, context, false),
sourceSuffixes = compiler.sourceSuffixes)) sourceSuffixes = compiler.sourceSuffixes, buildDirectory = buildDirectory))
} }
} }
return result!! return result!!

View file

@ -72,13 +72,13 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
val plugins = arrayListOf<IPlugin>() val plugins = arrayListOf<IPlugin>()
val projectContributors = arrayListOf<IProjectContributor>() val projectContributors = arrayListOf<IProjectContributor>()
val classpathContributors = arrayListOf<IClasspathContributor>() val classpathContributors = arrayListOf<IClasspathContributor>()
val initContributors = arrayListOf<ITemplateContributor>() val templateContributors = arrayListOf<ITemplateContributor>()
val repoContributors = arrayListOf<IRepoContributor>() val repoContributors = arrayListOf<IRepoContributor>()
val compilerFlagContributors = arrayListOf<ICompilerFlagContributor>() val compilerFlagContributors = arrayListOf<ICompilerFlagContributor>()
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>()
@ -98,6 +98,7 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
val localMavenRepoPathInterceptors = arrayListOf<ILocalMavenRepoPathInterceptor>() val localMavenRepoPathInterceptors = arrayListOf<ILocalMavenRepoPathInterceptor>()
val buildListeners = arrayListOf<IBuildListener>() val buildListeners = arrayListOf<IBuildListener>()
val buildReportContributors = arrayListOf<IBuildReportContributor>() val buildReportContributors = arrayListOf<IBuildReportContributor>()
val docFlagContributors = arrayListOf<IDocFlagContributor>()
// Note: intentionally repeating them here even though they are defined by our base class so // Note: intentionally repeating them here even though they are defined by our base class so
// that this class always contains the full list of contributors and interceptors // that this class always contains the full list of contributors and interceptors
@ -171,9 +172,8 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
} }
val result = loadClass(className, classLoader) val result = loadClass(className, classLoader)
?: Class.forName(className)
?: loadClass(className, pluginClassLoader) ?: loadClass(className, pluginClassLoader)
?: throw ClassNotFoundException(className) ?: Class.forName(className)
return result return result
} }
@ -193,11 +193,11 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
if (this is ICompilerFlagContributor) compilerFlagContributors.add(this) if (this is ICompilerFlagContributor) compilerFlagContributors.add(this)
if (this is ICompilerInterceptor) compilerInterceptors.add(this) if (this is ICompilerInterceptor) compilerInterceptors.add(this)
if (this is IDocContributor) docContributors.add(this) if (this is IDocContributor) docContributors.add(this)
if (this is ITemplateContributor) initContributors.add(this) if (this is ITemplateContributor) templateContributors.add(this)
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)
@ -216,25 +216,24 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
if (this is ILocalMavenRepoPathInterceptor) localMavenRepoPathInterceptors.add(this) if (this is ILocalMavenRepoPathInterceptor) localMavenRepoPathInterceptors.add(this)
if (this is IBuildListener) buildListeners.add(this) if (this is IBuildListener) buildListeners.add(this)
if (this is IBuildReportContributor) buildReportContributors.add(this) if (this is IBuildReportContributor) buildReportContributors.add(this)
if (this is IDocFlagContributor) docFlagContributors.add(this)
} }
} }
} }
fun cleanUp() { fun cleanUp() {
listOf(projectContributors, classpathContributors, initContributors, 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,
incrementalAssemblyContributors, testJvmFlagInterceptors, incrementalAssemblyContributors, testJvmFlagInterceptors,
jvmFlagContributors, localMavenRepoPathInterceptors, buildListeners, jvmFlagContributors, localMavenRepoPathInterceptors, buildListeners,
buildReportContributors buildReportContributors, docFlagContributors
).forEach { ).forEach {
it.forEach { it.forEach(IPluginActor::cleanUpActors)
it.cleanUpActors()
}
} }
} }
@ -247,13 +246,13 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
plugins.addAll(pluginInfo.plugins) plugins.addAll(pluginInfo.plugins)
classpathContributors.addAll(pluginInfo.classpathContributors) classpathContributors.addAll(pluginInfo.classpathContributors)
projectContributors.addAll(pluginInfo.projectContributors) projectContributors.addAll(pluginInfo.projectContributors)
initContributors.addAll(pluginInfo.initContributors) templateContributors.addAll(pluginInfo.templateContributors)
repoContributors.addAll(pluginInfo.repoContributors) repoContributors.addAll(pluginInfo.repoContributors)
compilerFlagContributors.addAll(pluginInfo.compilerFlagContributors) compilerFlagContributors.addAll(pluginInfo.compilerFlagContributors)
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)
@ -273,6 +272,7 @@ class PluginInfo(val xml: KobaltPluginXml, val pluginClassLoader: ClassLoader?,
localMavenRepoPathInterceptors.addAll(pluginInfo.localMavenRepoPathInterceptors) localMavenRepoPathInterceptors.addAll(pluginInfo.localMavenRepoPathInterceptors)
buildListeners.addAll(pluginInfo.buildListeners) buildListeners.addAll(pluginInfo.buildListeners)
buildReportContributors.addAll(pluginInfo.buildReportContributors) buildReportContributors.addAll(pluginInfo.buildReportContributors)
docFlagContributors.addAll(pluginInfo.docFlagContributors)
} }
} }

View file

@ -1,10 +1,11 @@
package com.beust.kobalt.internal package com.beust.kobalt.internal
import com.beust.kobalt.BUILD_SCRIPT_CONFIG
import com.beust.kobalt.Constants
import com.beust.kobalt.ProxyConfig import com.beust.kobalt.ProxyConfig
import com.beust.kobalt.homeDir import com.beust.kobalt.homeDir
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.log
import com.google.inject.Inject import com.google.inject.Inject
import com.google.inject.Singleton import com.google.inject.Singleton
import java.io.File import java.io.File
@ -24,17 +25,26 @@ class KobaltSettingsXml {
@XmlElement(name = "localMavenRepo") @JvmField @XmlElement(name = "localMavenRepo") @JvmField
var localMavenRepo: String = homeDir(KFiles.KOBALT_DOT_DIR, "localMavenRepo") var localMavenRepo: String = homeDir(KFiles.KOBALT_DOT_DIR, "localMavenRepo")
@XmlElement(name = "defaulRepos") @JvmField @XmlElement(name = "defaultRepos") @JvmField
var defaultRepos: DefaultReposXml? = null var defaultRepos: DefaultReposXml? = null
@XmlElement(name = "proxies") @JvmField @XmlElement(name = "proxies") @JvmField
var proxies: ProxiesXml? = null var proxies: ProxiesXml? = null
@XmlElement(name = "kobaltCompilerVersion") @JvmField @XmlElement(name = "kobaltCompilerVersion") @JvmField
var kobaltCompilerVersion: String = "1.0.4-eap-62" var kobaltCompilerVersion: String = Constants.KOTLIN_COMPILER_VERSION
@XmlElement(name = "kobaltCompilerRepo") @JvmField @XmlElement(name = "kobaltCompilerRepo") @JvmField
var kobaltCompilerRepo: String? = null var kobaltCompilerRepo: String? = null
@XmlElement(name = "kobaltCompilerFlags") @JvmField
var kobaltCompilerFlags: String? = null
@XmlElement(name = "kobaltCompilerSeparateProcess") @JvmField
var kobaltCompilerSeparateProcess: Boolean = false
@XmlElement(name = "autoUpdate") @JvmField
var autoUpdate: Boolean = false
} }
class ProxiesXml { class ProxiesXml {
@ -78,6 +88,17 @@ class KobaltSettings @Inject constructor(val xmlFile: KobaltSettingsXml) {
*/ */
val localMavenRepo = KFiles.makeDir(xmlFile.localMavenRepo) val localMavenRepo = KFiles.makeDir(xmlFile.localMavenRepo)
/**
* If true, Kobalt will automatically update itself if a new version is found.
*/
val autoUpdate = xmlFile.autoUpdate
/**
* If true, the Kotlin compiler will always be launched in a separate JVM, even if the requested
* version is the same as the internal version.
*/
val kobaltCompilerSeparateProcess = xmlFile.kobaltCompilerSeparateProcess
val defaultRepos = xmlFile.defaultRepos?.repo val defaultRepos = xmlFile.defaultRepos?.repo
val proxyConfigs = with(xmlFile.proxies?.proxy) { val proxyConfigs = with(xmlFile.proxies?.proxy) {
@ -96,8 +117,32 @@ class KobaltSettings @Inject constructor(val xmlFile: KobaltSettingsXml) {
} }
} }
var kobaltCompilerVersion = xmlFile.kobaltCompilerVersion val kobaltCompilerVersion : String?
var kobaltCompilerRepo = xmlFile.kobaltCompilerRepo get() {
return if (BUILD_SCRIPT_CONFIG != null && BUILD_SCRIPT_CONFIG?.kobaltCompilerVersion != null) {
BUILD_SCRIPT_CONFIG?.kobaltCompilerVersion
} else {
xmlFile.kobaltCompilerVersion
}
}
val kobaltCompilerRepo : String?
get() {
return if (BUILD_SCRIPT_CONFIG != null && BUILD_SCRIPT_CONFIG?.kobaltCompilerRepo != null) {
BUILD_SCRIPT_CONFIG?.kobaltCompilerRepo
} else {
xmlFile.kobaltCompilerRepo
}
}
val kobaltCompilerFlags : String?
get() {
return if (BUILD_SCRIPT_CONFIG != null && BUILD_SCRIPT_CONFIG?.kobaltCompilerFlags != null) {
BUILD_SCRIPT_CONFIG?.kobaltCompilerFlags
} else {
xmlFile.kobaltCompilerFlags
}
}
companion object { companion object {
val SETTINGS_FILE_PATH = KFiles.joinDir(KFiles.HOME_KOBALT_DIR.absolutePath, "settings.xml") val SETTINGS_FILE_PATH = KFiles.joinDir(KFiles.HOME_KOBALT_DIR.absolutePath, "settings.xml")

View file

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

View file

@ -0,0 +1,21 @@
package com.beust.kobalt.internal
import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project
/**
* KotlinTestRunner triggers if it finds a dependency on io.kotlintest but other than that, it just
* uses the regular JUnitRunner.
*/
class KotlinTestRunner : JUnitRunner() {
override val dependencyName = "io.kotlintest"
override val runnerName = "Kotlin Test"
/**
* KotlinTestRunner runs tests in the init{} initializer, so ignore all the extra
* classes generated by the Kotlin compiler.
*/
override fun filterTestClasses(projet: Project, context: KobaltContext, classes: List<String>)
= classes.filter { !it.contains("$") }
}

View file

@ -2,9 +2,7 @@ package com.beust.kobalt.internal
import com.beust.kobalt.Args import com.beust.kobalt.Args
import com.beust.kobalt.KobaltException import com.beust.kobalt.KobaltException
import com.beust.kobalt.misc.kobaltError import com.beust.kobalt.misc.*
import com.beust.kobalt.misc.kobaltLog
import com.beust.kobalt.misc.kobaltWarn
import com.google.inject.Inject import com.google.inject.Inject
import com.google.inject.Singleton import com.google.inject.Singleton
import java.util.* import java.util.*
@ -67,9 +65,9 @@ class ParallelLogger @Inject constructor(val args: Args) : ILogger {
} }
private fun debug(s: CharSequence) { private fun debug(s: CharSequence) {
if (args.log >= 2) { if (args.log >= 3) {
val time = System.currentTimeMillis() - startTime!! val time = System.currentTimeMillis() - startTime!!
println(" ### [$time] $s") kobaltLog(1, " ### [$time] $s")
} }
} }
@ -116,10 +114,10 @@ class ParallelLogger @Inject constructor(val args: Args) : ILogger {
} }
override fun log(tag: CharSequence, level: Int, message: CharSequence, newLine: Boolean) { override fun log(tag: CharSequence, level: Int, message: CharSequence, newLine: Boolean) {
if (args.parallel) { if (args.sequential) {
addLogLine(tag, LogLine(tag, level, message, Type.LOG, newLine))
} else {
kobaltLog(level, message, newLine) kobaltLog(level, message, newLine)
} else {
addLogLine(tag, LogLine(tag, level, message, Type.LOG, newLine))
} }
} }
@ -127,6 +125,6 @@ class ParallelLogger @Inject constructor(val args: Args) : ILogger {
runningProjects.forEach { runningProjects.forEach {
emptyProjectLog(it) emptyProjectLog(it)
} }
println("") kobaltLog(1, "")
} }
} }

View file

@ -54,12 +54,12 @@ class ParallelProjectRunner(val tasksByNames: (Project) -> ListMultimap<String,
runBuildListenersForTask(project, context, task.name, start = true) runBuildListenersForTask(project, context, task.name, start = true)
logger.log(project.name, 1, logger.log(project.name, 1,
AsciiArt.taskColor(AsciiArt.horizontalSingleLine + " ${project.name}:${task.name}")) AsciiArt.taskColor(AsciiArt.horizontalSingleLine + " ${project.name}:${task.name}"))
val thisResult = if (dryRun) TaskResult2(true, null, task) else task.call() val thisResult = if (dryRun) TaskResult2(true, value = task) else task.call()
if (lastResult.success) { if (lastResult.success) {
lastResult = thisResult lastResult = thisResult
} }
runBuildListenersForTask(project, context, task.name, start = false, runBuildListenersForTask(project, context, task.name, start = false,
success = thisResult.success) success = thisResult.success, testResult = thisResult.testResult)
} }
} }
graph.freeNodes.forEach { graph.removeNode(it) } graph.freeNodes.forEach { graph.removeNode(it) }
@ -69,7 +69,7 @@ class ParallelProjectRunner(val tasksByNames: (Project) -> ListMultimap<String,
runBuildListenersForProject(project, context, false, runBuildListenersForProject(project, context, false,
if (lastResult.success) ProjectBuildStatus.SUCCESS else ProjectBuildStatus.FAILED) if (lastResult.success) ProjectBuildStatus.SUCCESS else ProjectBuildStatus.FAILED)
return TaskResult2(lastResult.success, lastResult.errorMessage, this) return TaskResult2(lastResult.success, errorMessage = lastResult.errorMessage, value = this)
} }
} }
@ -93,7 +93,8 @@ class ParallelProjectRunner(val tasksByNames: (Project) -> ListMultimap<String,
val projectGraph = DynamicGraph<ProjectTask>().apply { val projectGraph = DynamicGraph<ProjectTask>().apply {
projects.forEach { project -> projects.forEach { project ->
project.dependsOn.forEach { addNode(ProjectTask(project, args.dryRun))
project.allProjectDependedOn().forEach {
addEdge(ProjectTask(project, args.dryRun), ProjectTask(it, args.dryRun)) addEdge(ProjectTask(project, args.dryRun), ProjectTask(it, args.dryRun))
} }
} }
@ -105,7 +106,7 @@ class ParallelProjectRunner(val tasksByNames: (Project) -> ListMultimap<String,
logger.shutdown() logger.shutdown()
if (args.parallel) { if (! args.sequential) {
executor.dumpHistory() executor.dumpHistory()
} }
return TaskManager.RunTargetResult(taskResult, emptyList()) return TaskManager.RunTargetResult(taskResult, emptyList())

View file

@ -39,7 +39,7 @@ class SequentialProjectRunner(val tasksByNames: (Project) -> ListMultimap<String
klog(1, AsciiArt.logBox("Building $projectName", indent = 5)) klog(1, AsciiArt.logBox("Building $projectName", indent = 5))
// Does the current project depend on any failed projects? // Does the current project depend on any failed projects?
val fp = project.dependsOn.filter { failedProjects.contains(it.name) }.map(Project::name) val fp = project.allProjectDependedOn().filter { failedProjects.contains(it.name) }.map(Project::name)
if (fp.size > 0) { if (fp.size > 0) {
klog(2, "Marking project $projectName as skipped") klog(2, "Marking project $projectName as skipped")

View file

@ -6,5 +6,6 @@ package com.beust.kobalt.internal
*/ */
class SpekRunner : JUnitRunner() { class SpekRunner : JUnitRunner() {
override val dependencyName = "org.jetbrains.spek" override val dependencyName = "org.jetbrains.spek"
override val runnerName = "Spek"
} }

View file

@ -17,7 +17,7 @@ import javax.inject.Singleton
@Singleton @Singleton
class TaskManager @Inject constructor(val args: Args, class TaskManager @Inject constructor(val args: Args,
val incrementalManagerFactory: IncrementalManager.IFactory, val incrementalManagerFactory: IncrementalManager.IFactory,
val pluginInfo: PluginInfo, val kobaltLog: ParallelLogger) { val kobaltLog: ParallelLogger) {
private val dependsOn = TreeMultimap.create<String, String>() private val dependsOn = TreeMultimap.create<String, String>()
private val reverseDependsOn = TreeMultimap.create<String, String>() private val reverseDependsOn = TreeMultimap.create<String, String>()
private val runBefore = TreeMultimap.create<String, String>() private val runBefore = TreeMultimap.create<String, String>()
@ -80,6 +80,9 @@ class TaskManager @Inject constructor(val args: Args,
} }
} }
// @Inject
// lateinit var pluginInfo: PluginInfo
fun runTargets(passedTaskNames: List<String>, allProjects: List<Project>): RunTargetResult { fun runTargets(passedTaskNames: List<String>, allProjects: List<Project>): RunTargetResult {
// Check whether tasks passed at command line exist // Check whether tasks passed at command line exist
passedTaskNames.forEach { passedTaskNames.forEach {
@ -87,6 +90,7 @@ class TaskManager @Inject constructor(val args: Args,
throw KobaltException("Unknown task: $it") throw KobaltException("Unknown task: $it")
} }
val pluginInfo = Kobalt.INJECTOR.getInstance(PluginInfo::class.java)
var taskInfos = calculateDependentTaskNames(passedTaskNames, allProjects) var taskInfos = calculateDependentTaskNames(passedTaskNames, allProjects)
// Remove non existing tasks (e.g. dynamic task defined for a single project) // Remove non existing tasks (e.g. dynamic task defined for a single project)
@ -94,10 +98,13 @@ class TaskManager @Inject constructor(val args: Args,
val projectsToRun = findProjectsToRun(taskInfos, allProjects) val projectsToRun = findProjectsToRun(taskInfos, allProjects)
val projectRunner = val projectRunner =
if (args.parallel) ParallelProjectRunner({ p -> tasksByNames(p) }, dependsOn, if (args.sequential) {
reverseDependsOn, runBefore, runAfter, alwaysRunAfter, args, pluginInfo, kobaltLog) SequentialProjectRunner({ p -> tasksByNames(p) }, dependsOn,
else SequentialProjectRunner({ p -> tasksByNames(p) }, dependsOn, reverseDependsOn, runBefore, runAfter, alwaysRunAfter, args, pluginInfo)
reverseDependsOn, runBefore, runAfter, alwaysRunAfter, args, pluginInfo) } else {
ParallelProjectRunner({ p -> tasksByNames(p) }, dependsOn,
reverseDependsOn, runBefore, runAfter, alwaysRunAfter, args, pluginInfo, kobaltLog)
}
return projectRunner.runProjects(taskInfos, projectsToRun) return projectRunner.runProjects(taskInfos, projectsToRun)
} }
@ -142,7 +149,7 @@ class TaskManager @Inject constructor(val args: Args,
val topological = Topological<Project>().apply { val topological = Topological<Project>().apply {
projects.forEach { project -> projects.forEach { project ->
addNode(project) addNode(project)
project.dependsOn.forEach { project.allProjectDependedOn().forEach {
addEdge(project, it) addEdge(project, it)
} }
} }
@ -157,7 +164,7 @@ class TaskManager @Inject constructor(val args: Args,
return result return result
} else { } else {
val rootProject = projects.find { it.name == ti.project }!! val rootProject = projects.find { it.name == ti.project }!!
val allProjects = DynamicGraph.transitiveClosure(rootProject, { p -> p.dependsOn }) val allProjects = DynamicGraph.transitiveClosure(rootProject, Project::allProjectDependedOn)
val sortedProjects = sortProjectsTopologically(allProjects) val sortedProjects = sortProjectsTopologically(allProjects)
val sortedMaps = sortedProjects.map { TaskInfo(it.name, "compile")} val sortedMaps = sortedProjects.map { TaskInfo(it.name, "compile")}
val result = sortedMaps.subList(0, sortedMaps.size - 1) + listOf(ti) val result = sortedMaps.subList(0, sortedMaps.size - 1) + listOf(ti)
@ -189,6 +196,7 @@ class TaskManager @Inject constructor(val args: Args,
= TaskAnnotation(method, plugin, ta.name, ta.description, ta.group, ta.dependsOn, ta.reverseDependsOn, = TaskAnnotation(method, plugin, ta.name, ta.description, ta.group, ta.dependsOn, ta.reverseDependsOn,
ta.runBefore, ta.runAfter, ta.alwaysRunAfter, ta.runBefore, ta.runAfter, ta.alwaysRunAfter,
{ project -> { project ->
Kobalt.context?.variant = Variant()
method.invoke(plugin, project) as TaskResult method.invoke(plugin, project) as TaskResult
}) })
@ -264,7 +272,8 @@ class TaskManager @Inject constructor(val args: Args,
object : BasePluginTask(plugin, name, description, group, project) { object : BasePluginTask(plugin, name, description, group, project) {
override fun call(): TaskResult2<ITask> { override fun call(): TaskResult2<ITask> {
val taskResult = task(project) val taskResult = task(project)
return TaskResult2(taskResult.success, taskResult.errorMessage, this) return TaskResult2(taskResult.success, errorMessage = taskResult.errorMessage, value = this,
testResult = taskResult.testResult)
} }
}) })
dependsOn.forEach { dependsOn(it, name) } dependsOn.forEach { dependsOn(it, name) }
@ -311,9 +320,11 @@ 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
if (tr.errorMessage != null) errorMessages.add(tr.errorMessage) tr.errorMessage?.let {
errorMessages.add(it)
}
} }
return TaskResult2(success, errorMessages.joinToString("\n"), tasks[0]) return TaskResult2(success, errorMessage = errorMessages.joinToString("\n"), value = tasks[0])
} }
// override val timeOut : Long = 10000 // override val timeOut : Long = 10000

View file

@ -1,28 +1,53 @@
package com.beust.kobalt.internal package com.beust.kobalt.internal
import com.beust.kobalt.AsciiArt
import com.beust.kobalt.TestConfig import com.beust.kobalt.TestConfig
import com.beust.kobalt.TestResult
import com.beust.kobalt.api.IClasspathDependency import com.beust.kobalt.api.IClasspathDependency
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.misc.KFiles import com.beust.kobalt.maven.aether.AetherDependency
import com.beust.kobalt.misc.warn import com.beust.kobalt.misc.*
import org.testng.remote.RemoteArgs
import org.testng.remote.strprotocol.JsonMessageSender
import org.testng.remote.strprotocol.MessageHelper
import org.testng.remote.strprotocol.MessageHub
import org.testng.remote.strprotocol.TestResultMessage
import org.w3c.dom.Attr
import org.w3c.dom.NodeList
import org.xml.sax.InputSource
import java.io.File import java.io.File
import java.io.FileReader
import java.io.IOException
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.xpath.XPathConstants
import javax.xml.xpath.XPathFactory
class TestNgRunner : GenericTestRunner() { class TestNgRunner : GenericTestRunner() {
override val mainClass = "org.testng.TestNG" override val mainClass = "org.testng.TestNG"
override val dependencyName = "testng" override val dependencyName = "testng"
override val annotationPackage = "org.testng" override val annotationPackage = "org.testng"
override val runnerName = "TestNG"
fun defaultOutput(project: Project) = KFiles.joinDir(project.buildDirectory, "test-output") private fun defaultOutputWithoutProjectDir(project: Project)
= KFiles.joinDir(project.buildDirectory, "test-output")
private fun defaultOutput(project: Project)
= KFiles.joinDir(project.directory, project.buildDirectory, "test-output")
override fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>, override fun args(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>,
testConfig: TestConfig) = arrayListOf<String>().apply { testConfig: TestConfig) = arrayListOf<String>().apply {
var addOutput = true
testConfig.testArgs.forEach { arg -> if (KobaltLogger.isQuiet) {
if (arg == "-d") addOutput = false add("-log")
add("0")
}
if (testConfig.testArgs.none { it == "-d" }) {
add("-d")
// Don't include the project directory here since the generic runner will cd to that directory before
// running the tests
add(defaultOutputWithoutProjectDir(project))
} }
if (testConfig.testArgs.size == 0) { if (testConfig.testArgs.size == 0) {
@ -32,27 +57,212 @@ class TestNgRunner : GenericTestRunner() {
add(testngXml.absolutePath) add(testngXml.absolutePath)
} else { } else {
val testClasses = findTestClasses(project, context, testConfig) val testClasses = findTestClasses(project, context, testConfig)
if (testClasses.size > 0) { if (testClasses.isNotEmpty()) {
if (addOutput) {
add("-d")
add(defaultOutput(project))
}
addAll(testConfig.testArgs) addAll(testConfig.testArgs)
add("-testclass") add("-testclass")
add(testClasses.joinToString(",")) add(testClasses.joinToString(","))
} else { } else {
if (! testConfig.isDefault) warn("Couldn't find any test classes for ${project.name}") if (!testConfig.isDefault) warn("Couldn't find any test classes for ${project.name}")
// else do nothing: since the user didn't specify an explicit test{} directive, not finding // else do nothing: since the user didn't specify an explicit test{} directive, not finding
// any test sources is not a problem // any test sources is not a problem
} }
} }
} else { } else {
if (addOutput) {
add("-d")
add(defaultOutput(project))
}
addAll(testConfig.testArgs) addAll(testConfig.testArgs)
} }
} }
/**
* Extract test results from testng-results.xml and initialize shortMessage.
*/
override fun onFinish(project: Project) {
File(defaultOutput(project), "testng-results.xml").let { file ->
val ins = InputSource(FileReader(file))
val doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(ins)
val root = doc.documentElement
var failed = 0
var skipped = 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) {
val attribute = root.attributes.item(it)
if (attribute is Attr) when (attribute.name) {
"failed" -> failed = Integer.parseInt(attribute.value)
"skipped" -> skipped = Integer.parseInt(attribute.value)
"passed" -> passed = Integer.parseInt(attribute.value)
}
}
if (failed == 0) {
shortMessage = "$passed tests"
} else if (failed > 0) {
shortMessage = "$failed failed" + (if (skipped > 0) ", $skipped skipped" else "") + " tests"
longMessage = "Failed tests:\n " + failedMethods.joinToString("\n ")
}
}
}
val VERSION_6_10 = StringVersion("6.10")
fun _runTests(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>,
// override fun runTests(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>,
configName: String): TestResult {
val testConfig = project.testConfigs.firstOrNull { it.name == configName }
if (testConfig != null) {
context.logger.log(project.name, 1, "Running enhanced TestNG runner")
val testngDependency = (project.testDependencies.filter { it.id.contains("testng") }
.firstOrNull() as AetherDependency).version
val versions = findRemoteRunnerVersion(testngDependency)
val useOldRunner = System.getProperty("testng.oldRunner") != null
val result =
if (versions != null && ! useOldRunner) {
context.logger.log(project.name, 1, "Modern TestNG, displaying colors")
displayPrettyColors(project, context, classpath, testConfig, versions)
} else {
context.logger.log(project.name, 1, "Older TestNG ($testngDependency), using the old runner")
super.runTests(project, context, classpath, configName)
}
return result
} else {
return TestResult(true)
}
}
private fun findRemoteRunnerVersion(testngVersion: String) : Pair<String, String>? {
val tng = StringVersion(testngVersion)
val result =
if (tng >= VERSION_6_10) Pair(testngVersion, "testng-remote6_10")
else if (tng >= StringVersion("6.9.10")) Pair("6.9.10", "testng-remote6_9_10")
else if (tng >= StringVersion("6.9.7")) Pair("6.9.7", "testng-remote6_9_7")
else if (tng >= StringVersion("6.5.1")) Pair("6.5.1", "testng-remote6_5_0")
else if (tng >= StringVersion("6.0")) Pair("6.0", "testng-remote6_0")
else null
return result
}
private fun displayPrettyColors(project: Project, context: KobaltContext,
classpath: List<IClasspathDependency>, testConfig: TestConfig, versions: Pair<String, String>)
: TestResult {
val port = 2345
// launchRemoteServer(project, context, classpath, testConfig, versions, port)
val mh = MessageHub(JsonMessageSender("localhost", port, true))
mh.setDebug(true)
mh.initReceiver()
val passed = arrayListOf<String>()
data class FailedTest(val method: String, val cls: String, val stackTrace: String)
val failed = arrayListOf<FailedTest>()
val skipped = arrayListOf<String>()
fun d(n: Int, color: String)
= AsciiArt.wrap(String.format("%4d", n), color)
fun red(s: String) = AsciiArt.wrap(s, AsciiArt.RED)
fun green(s: String) = AsciiArt.wrap(s, AsciiArt.GREEN)
fun yellow(s: String) = AsciiArt.wrap(s, AsciiArt.YELLOW)
try {
var message = mh.receiveMessage()
kobaltLog(1, "")
kobaltLog(1, green("PASSED") + " | " + red("FAILED") + " | " + yellow("SKIPPED"))
while (message != null) {
message = mh.receiveMessage()
if (message is TestResultMessage) {
when (message.result) {
MessageHelper.PASSED_TEST -> passed.add(message.name)
MessageHelper.FAILED_TEST -> failed.add(FailedTest(message.testClass,
message.method, message.stackTrace))
MessageHelper.SKIPPED_TEST -> skipped.add(message.name)
}
}
if (!KobaltLogger.isQuiet) {
print("\r " + d(passed.size, AsciiArt.GREEN)
+ " | " + d(failed.size, AsciiArt.RED)
+ " | " + d(skipped.size, AsciiArt.YELLOW))
}
}
} catch(ex: IOException) {
kobaltLog(1, "Exception: ${ex.message}")
}
kobaltLog(1, "\nPassed: " + passed.size + ", Failed: " + failed.size + ", Skipped: " + skipped.size)
failed.forEach {
val top = it.stackTrace.substring(0, it.stackTrace.indexOf("\n"))
kobaltLog(1, " " + it.cls + "." + it.method + "\n " + top)
}
return TestResult(failed.isEmpty() && skipped.isEmpty())
}
fun launchRemoteServer(project: Project, context: KobaltContext, classpath: List<IClasspathDependency>,
testConfig: TestConfig, versions: Pair<String, String>, port: Int) {
val testngVersion = versions.first
val remoteRunnerVersion = versions.second
val dep = with(context.dependencyManager) {
val jf = create("org.testng.testng-remote:testng-remote:1.3.0")
val tr = create("org.testng.testng-remote:$remoteRunnerVersion:1.3.0")
val testng = create("org.testng:testng:6.11")
transitiveClosure(kotlin.collections.listOf(jf, tr /*, testng */))
}
val cp = (classpath + dep).distinct().map { it.jarFile.get() }
.joinToString(File.pathSeparator)
val calculatedArgs = args(project, context, classpath, testConfig)
val jvmArgs = arrayListOf("-classpath", cp)
if (testConfig.jvmArgs.any()) {
jvmArgs.addAll(testConfig.jvmArgs)
}
val remoteArgs = listOf(
"org.testng.remote.RemoteTestNG",
"-serport", port.toString(),
"-version", testngVersion,
"-dontexit",
RemoteArgs.PROTOCOL,
"json")
val passedArgs = jvmArgs + remoteArgs + calculatedArgs
Thread {
runCommand {
command = "java"
directory = File(project.directory)
args = passedArgs
}
}.start()
// Thread {
// val args2 = arrayOf("-serport", port.toString(), "-dontexit", RemoteArgs.PROTOCOL, "json",
// "-version", "6.10",
// "src/test/resources/testng.xml")
// RemoteTestNG.main(args2)
// }.start()
}
}
fun main(args: Array<String>) {
fun d(n: Int, color: String)
= AsciiArt.wrap(String.format("%4d", n), color)
if (!KobaltLogger.isQuiet) {
println("PASSED | FAILED | SKIPPED")
repeat(20) { i ->
print("\r " + d(i, AsciiArt.GREEN) + " | " + d(i * 2, AsciiArt.RED) + " | " + d(i, AsciiArt.YELLOW))
Thread.sleep(500)
}
println("")
}
} }

View file

@ -1,10 +1,8 @@
package com.beust.kobalt.internal.build package com.beust.kobalt.internal.build
import com.beust.kobalt.misc.KFiles
import java.io.File import java.io.File
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.attribute.BasicFileAttributes
/** /**
* Sometimes, build files are moved to temporary files, so we give them a specific name for clarity. * Sometimes, build files are moved to temporary files, so we give them a specific name for clarity.
* @param path is the path where that file was moved, @param realPath is where the actual file is. * @param path is the path where that file was moved, @param realPath is where the actual file is.
@ -12,23 +10,5 @@ import java.nio.file.attribute.BasicFileAttributes
class BuildFile(val path: Path, val name: String, val realPath: Path = path) { class BuildFile(val path: Path, val name: String, val realPath: Path = path) {
fun exists() : Boolean = Files.exists(path) fun exists() : Boolean = Files.exists(path)
val lastModified : Long
get() = Files.readAttributes(realPath, BasicFileAttributes::class.java).lastModifiedTime().toMillis()
val directory : File get() = path.toFile().parentFile val directory : File get() = path.toFile().parentFile
/**
* @return the .kobalt directory where this build file will be compiled.
*/
val dotKobaltDir: File get() = File(directory.parentFile.parentFile, KFiles.KOBALT_DOT_DIR).apply {
mkdirs()
}
/**
* @return the absolute directory of this project's location, assuming the build file is in
* $project/kobalt/src/Build.kt.
*/
val absoluteDir : File? get() {
return path.parent?.parent?.parent?.toFile()
}
} }

View file

@ -0,0 +1,61 @@
package com.beust.kobalt.internal.build
import com.beust.kobalt.homeDir
import java.io.File
import java.nio.file.*
import java.nio.file.attribute.BasicFileAttributes
/**
* The abstraction to represent a directory that contains source files. @param{root} is typically
* the root of the project and build files are searched under root/kobalt/src/ *kt.
*/
interface IBuildSources {
fun findSourceFiles() : List<File>
val root: File
fun exists(): Boolean
}
class SingleFileBuildSources(val file: File) : IBuildSources {
override fun exists() = file.exists()
override fun findSourceFiles() = listOf(file)
override val root: File = file.parentFile.parentFile.parentFile
override fun toString() : String = file.path
}
class BuildSources(val file: File = File("")) : IBuildSources {
override val root = file
override fun findSourceFiles() : List<File> {
return findBuildFiles(listOf(file))
}
override fun exists() = findSourceFiles().isNotEmpty()
override fun toString() = "{BuildSources " + findSourceFiles().joinToString(", ") + "}"
fun findBuildFiles(roots: List<File>) : List<File> {
val result = arrayListOf<File>()
roots.forEach { file ->
Files.walkFileTree(Paths.get(file.path), object : SimpleFileVisitor<Path>() {
override fun preVisitDirectory(dir: Path?, attrs: BasicFileAttributes?): FileVisitResult {
if (dir != null) {
val path = dir.toFile()
if (path.name == "src" && path.parentFile.name == "kobalt") {
val sources = path.listFiles().filter { it.name.endsWith(".kt") }
result.addAll(sources)
}
}
return FileVisitResult.CONTINUE
}
})
}
return result
}
}
fun main(args: Array<String>) {
val sources = BuildSources(File(homeDir("kotlin/kobalt"))).findSourceFiles()
println("sources: " + sources)
}

View file

@ -1,14 +0,0 @@
package com.beust.kobalt.internal.remote
import com.beust.kobalt.Constants
import java.io.PrintWriter
import java.net.Socket
fun main(argv: Array<String>) {
Socket("localhost", 1234).use { socket ->
(PrintWriter(socket.outputStream, true)).use { out ->
out.println("""{ "name" : "getDependencies", "buildFile":
"/Users/beust/kotlin/kobalt/kobalt/src/${Constants.BUILD_FILE_NAME}"}""")
}
}
}

View file

@ -9,7 +9,7 @@ import java.net.URLClassLoader
* Will probably be made obsolete by making the wrapper a standalone module instead of * Will probably be made obsolete by making the wrapper a standalone module instead of
* being inside Kobalt itself. * being inside Kobalt itself.
*/ */
public class ParentLastClassLoader(val classpath: List<URL>) class ParentLastClassLoader(val classpath: List<URL>)
: ClassLoader(Thread.currentThread().contextClassLoader) { : ClassLoader(Thread.currentThread().contextClassLoader) {
private val childClassLoader: ChildURLClassLoader private val childClassLoader: ChildURLClassLoader
@ -22,7 +22,7 @@ public class ParentLastClassLoader(val classpath: List<URL>)
* This class makes it possible to call findClass on a classloader * This class makes it possible to call findClass on a classloader
*/ */
private class FindClassClassLoader(parent: ClassLoader) : ClassLoader(parent) { private class FindClassClassLoader(parent: ClassLoader) : ClassLoader(parent) {
override public fun findClass(name: String) = super.findClass(name) override fun findClass(name: String) = super.findClass(name)
} }
/** /**
@ -43,7 +43,7 @@ public class ParentLastClassLoader(val classpath: List<URL>)
} }
} }
override public @Synchronized fun loadClass(name: String, resolve: Boolean) : Class<*> { override @Synchronized fun loadClass(name: String, resolve: Boolean) : Class<*> {
try { try {
// first we try to find a class inside the child classloader // first we try to find a class inside the child classloader
return childClassLoader.findClass(name) return childClassLoader.findClass(name)

View file

@ -3,7 +3,7 @@ package com.beust.kobalt.maven
import java.util.concurrent.Future import java.util.concurrent.Future
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
public class CompletedFuture<T>(val value: T) : Future<T> { class CompletedFuture<T>(val value: T) : Future<T> {
override fun cancel(mayInterruptIfRunning: Boolean) = true override fun cancel(mayInterruptIfRunning: Boolean) = true
override fun get(): T = value override fun get(): T = value
override fun get(timeout: Long, unit: TimeUnit): T = value override fun get(timeout: Long, unit: TimeUnit): T = value

View file

@ -2,30 +2,33 @@ package com.beust.kobalt.maven
import com.beust.kobalt.KobaltException import com.beust.kobalt.KobaltException
import com.beust.kobalt.api.* import com.beust.kobalt.api.*
import com.beust.kobalt.maven.aether.KobaltAether import com.beust.kobalt.maven.aether.Filters
import com.beust.kobalt.maven.aether.KobaltMavenResolver
import com.beust.kobalt.maven.aether.Scope import com.beust.kobalt.maven.aether.Scope
import com.beust.kobalt.maven.dependency.FileDependency import com.beust.kobalt.maven.dependency.FileDependency
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.misc.KobaltExecutors
import com.google.common.collect.ArrayListMultimap import com.google.common.collect.ArrayListMultimap
import org.eclipse.aether.graph.DependencyFilter
import org.eclipse.aether.util.filter.OrDependencyFilter
import java.io.File import java.io.File
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@Singleton @Singleton
class DependencyManager @Inject constructor(val executors: KobaltExecutors, val aether: KobaltAether) class DependencyManager @Inject constructor(val executors: KobaltExecutors,
: IDependencyManager { val resolver: KobaltMavenResolver) : IDependencyManager {
companion object { companion object {
fun create(id: String, projectDirectory: String? = null) = fun create(id: String, optional: Boolean = false, projectDirectory: String? = null) =
Kobalt.INJECTOR.getInstance(DependencyManager::class.java).create(id, projectDirectory) Kobalt.INJECTOR.getInstance(DependencyManager::class.java).create(id, optional, projectDirectory)
} }
/** /**
* Parse the id and return the correct IClasspathDependency * Parse the id and return the correct IClasspathDependency
*/ */
override fun create(id: String, projectDirectory: String?) : IClasspathDependency { override fun create(id: String, optional: Boolean, projectDirectory: String?) : IClasspathDependency {
if (id.startsWith(FileDependency.PREFIX_FILE)) { if (id.startsWith(FileDependency.PREFIX_FILE)) {
val path = if (projectDirectory != null) { val path = if (projectDirectory != null) {
val idPath = id.substring(FileDependency.PREFIX_FILE.length) val idPath = id.substring(FileDependency.PREFIX_FILE.length)
@ -50,19 +53,14 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val
} else { } else {
// Convert to a Kobalt id first (so that if it doesn't have a version, it gets translated to // Convert to a Kobalt id first (so that if it doesn't have a version, it gets translated to
// an Aether ranged id "[0,)") // an Aether ranged id "[0,)")
return createMaven(MavenId.create(id).toId) return createMaven(MavenId.create(id).toId, optional)
} }
} }
/** /**
* Create an IClasspathDependency from a Maven id. * Create an IClasspathDependency from a Maven id.
*/ */
override fun createMaven(id: String) : IClasspathDependency= override fun createMaven(id: String, optional: Boolean) : IClasspathDependency = resolver.create(id, optional)
if (KobaltAether.isRangeVersion(id)) {
Kobalt.INJECTOR.getInstance(KobaltAether::class.java).resolve(id).dependency
} else {
aether.create(id)
}
/** /**
* Create an IClasspathDependency from a path. * Create an IClasspathDependency from a path.
@ -72,12 +70,14 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val
/** /**
* @return the source dependencies for this project, including the contributors. * @return the source dependencies for this project, including the contributors.
*/ */
override fun dependencies(project: Project, context: KobaltContext) = dependencies(project, context, false) override fun dependencies(project: Project, context: KobaltContext, scopes: List<Scope>)
= privateDependencies(project, context, listOf(Scope.COMPILE))
/** /**
* @return the test dependencies for this project, including the contributors. * @return the test dependencies for this project, including the contributors.
*/ */
override fun testDependencies(project: Project, context: KobaltContext) = dependencies(project, context, true) override fun testDependencies(project: Project, context: KobaltContext)
= privateDependencies(project, context, listOf(Scope.COMPILE, Scope.TEST))
/** /**
* Transitive dependencies for the compilation of this project. * Transitive dependencies for the compilation of this project.
@ -87,12 +87,15 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val
// project.compileDependencies + project.compileRuntimeDependencies) // project.compileDependencies + project.compileRuntimeDependencies)
/** /**
* @return the classpath for this project, including the IClasspathContributors. * @return the classpath for this project, including the IClasspathContributors. Excluded dependencies
* allDependencies is typically either compileDependencies or testDependencies. If no dependencies * are removed from the result.
*
* @param{allDependencies} is typically either compileDependencies or testDependencies. If no dependencies
* are passed, they are calculated from the scope filters. * are passed, they are calculated from the scope filters.
*/ */
override fun calculateDependencies(project: Project?, context: KobaltContext, override fun calculateDependencies(project: Project?, context: KobaltContext,
scopeFilters: Collection<Scope>, dependencyFilter: DependencyFilter,
scopes: List<Scope>,
vararg passedDependencies: List<IClasspathDependency>): List<IClasspathDependency> { vararg passedDependencies: List<IClasspathDependency>): List<IClasspathDependency> {
val result = arrayListOf<IClasspathDependency>() val result = arrayListOf<IClasspathDependency>()
@ -100,9 +103,13 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val
* Extract the correct dependencies from the project based on the scope filters. * Extract the correct dependencies from the project based on the scope filters.
*/ */
fun filtersToDependencies(project: Project, scopes: Collection<Scope>): List<IClasspathDependency> { fun filtersToDependencies(project: Project, scopes: Collection<Scope>): List<IClasspathDependency> {
return arrayListOf<IClasspathDependency>().apply { val result = arrayListOf<IClasspathDependency>().apply {
if (scopes.contains(Scope.COMPILE)) { if (scopes.contains(Scope.COMPILE)) {
addAll(project.compileDependencies) addAll(project.compileDependencies)
addAll(project.compileProvidedDependencies)
}
if (scopes.contains(Scope.COMPILEONLY)) {
addAll(project.compileOnlyDependencies)
} }
if (scopes.contains(Scope.RUNTIME)) { if (scopes.contains(Scope.RUNTIME)) {
addAll(project.compileRuntimeDependencies) addAll(project.compileRuntimeDependencies)
@ -111,22 +118,50 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val
addAll(project.testDependencies) addAll(project.testDependencies)
} }
} }
return result.filter { ! it.optional }
} }
val allDependencies : Array<out List<IClasspathDependency>> = val allDependencies : Array<out List<IClasspathDependency>> =
if (project == null || passedDependencies.any()) passedDependencies if (project == null || passedDependencies.any()) passedDependencies
else arrayOf(filtersToDependencies(project, scopeFilters)) else arrayOf(filtersToDependencies(project, scopes))
// Make sure that classes/ and test-classes/ are always at the top of this classpath,
// so that older versions of that project on the classpath don't shadow them
if (project != null && scopes.contains(Scope.TEST)) {
result.add(FileDependency(KFiles.makeOutputDir(project).path))
result.add(FileDependency(KFiles.makeOutputTestDir(project).path))
}
allDependencies.forEach { dependencies -> allDependencies.forEach { dependencies ->
result.addAll(transitiveClosure(dependencies, scopeFilters, project?.name)) result.addAll(transitiveClosure(dependencies, dependencyFilter, project?.name))
} }
result.addAll(runClasspathContributors(project, context)) result.addAll(runClasspathContributors(project, context))
result.addAll(dependentProjectDependencies(project, context, scopeFilters)) result.addAll(dependentProjectDependencies(project, context, dependencyFilter, scopes))
/**
* Naïve implementation: just exclude all dependencies that start with one of the excluded dependencies.
* Should probably make exclusion more generic (full on string) or allow exclusion to be specified
* formally by groupId or artifactId.
*/
fun isDependencyExcluded(dep: IClasspathDependency, excluded: List<IClasspathDependency>): Boolean {
excluded.any { excluded -> dep.id == excluded.id }.let { result ->
if (result) {
context.logger.log(project?.name ?: "", 2, " Excluding dependency $dep")
}
return result
}
}
// Dependencies get reordered by transitiveClosure() but since we just added a bunch of new ones, // Dependencies get reordered by transitiveClosure() but since we just added a bunch of new ones,
// we need to reorder them again in case we're adding dependencies that are already present // we need to reorder them again in case we're adding dependencies that are already present
// but with a different version // but with a different version
val reordered = reorderDependencies(result) val shortResult =
if (project != null) {
result.filter { ! isDependencyExcluded(it, project.excludedDependencies) }
} else {
result
}.toHashSet()
val reordered = reorderDependencies(shortResult)
return reordered return reordered
} }
@ -144,14 +179,14 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val
* TODO: This should be private, everyone should be calling calculateDependencies(). * TODO: This should be private, everyone should be calling calculateDependencies().
*/ */
fun transitiveClosure(dependencies : List<IClasspathDependency>, fun transitiveClosure(dependencies : List<IClasspathDependency>,
scopeFilter: Collection<Scope> = emptyList(), filter: DependencyFilter = Filters.EXCLUDE_OPTIONAL_FILTER,
requiredBy: String? = null): List<IClasspathDependency> { requiredBy: String? = null): List<IClasspathDependency> {
val result = arrayListOf<IClasspathDependency>() val result = arrayListOf<IClasspathDependency>()
dependencies.forEach { dependencies.forEach { dependency ->
result.add(it) result.add(dependency)
if (it.isMaven) { if (dependency.isMaven) {
val resolved = aether.resolveAll(it.id, null, scopeFilter).map { it.toString() } val resolved = resolver.resolveToIds(dependency.id, null, filter).map { create(it) }
result.addAll(resolved.map { create(it) }) result.addAll(resolved)
} }
} }
val reordered = reorderDependencies(result) val reordered = reorderDependencies(result)
@ -183,7 +218,7 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val
* their own dependencies * their own dependencies
*/ */
private fun dependentProjectDependencies(project: Project?, context: KobaltContext, private fun dependentProjectDependencies(project: Project?, context: KobaltContext,
scopeFilters: Collection<Scope>): List<IClasspathDependency> { dependencyFilter: DependencyFilter, scopes: List<Scope>): List<IClasspathDependency> {
if (project == null) { if (project == null) {
return emptyList() return emptyList()
} else { } else {
@ -197,36 +232,57 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val
} }
} }
val isTest = scopes.contains(Scope.TEST)
project.dependsOn.forEach { p -> project.dependsOn.forEach { p ->
maybeAddClassDir(KFiles.joinDir(p.directory, p.classesDir(context))) maybeAddClassDir(KFiles.joinDir(p.directory, p.classesDir(context)))
if (scopeFilters.contains(Scope.TEST)) maybeAddClassDir(KFiles.makeOutputTestDir(project).path) if (isTest) maybeAddClassDir(KFiles.makeOutputTestDir(project).path)
val otherDependencies = calculateDependencies(p, context, scopeFilters) val otherDependencies = calculateDependencies(p, context, dependencyFilter, scopes)
result.addAll(otherDependencies) result.addAll(otherDependencies)
}
if (isTest) {
project.testsDependOn.forEach { p ->
val otherDependencies = calculateDependencies(p, context, dependencyFilter, scopes)
result.addAll(otherDependencies)
}
} }
return result return result
} }
} }
private fun dependencies(project: Project, context: KobaltContext, isTest: Boolean) private fun privateDependencies(project: Project, context: KobaltContext, passedScopes: List<Scope>)
: List<IClasspathDependency> { : List<IClasspathDependency> {
val isTest = passedScopes.contains(Scope.TEST)
val transitive = hashSetOf<IClasspathDependency>() val transitive = hashSetOf<IClasspathDependency>()
with(project) { with(project) {
val scopeFilters = arrayListOf(Scope.COMPILE) val scopeFilters : ArrayList<Scope> = arrayListOf(Scope.COMPILE)
context.variant.let { variant -> context.variant.let { variant ->
val deps = arrayListOf(compileDependencies, compileProvidedDependencies, val deps: ArrayList<ArrayList<IClasspathDependency>> =
variant.buildType.compileDependencies, if (passedScopes.contains(Scope.COMPILE)) {
variant.buildType.compileProvidedDependencies, arrayListOf(compileDependencies, compileProvidedDependencies,
variant.productFlavor.compileDependencies, variant.buildType.compileDependencies,
variant.productFlavor.compileProvidedDependencies variant.buildType.compileProvidedDependencies,
) variant.productFlavor.compileDependencies,
variant.productFlavor.compileProvidedDependencies)
} else if (passedScopes.contains(Scope.RUNTIME)) {
arrayListOf(compileRuntimeDependencies)
} else {
arrayListOf(arrayListOf<IClasspathDependency>())
}
val runtimeDeps = arrayListOf(compileRuntimeDependencies)
if (isTest) { if (isTest) {
deps.add(testDependencies) deps.add(testDependencies)
deps.add(testProvidedDependencies) deps.add(testProvidedDependencies)
scopeFilters.add(Scope.TEST) scopeFilters.add(Scope.TEST)
} }
deps.filter { it.any() }.forEach { val filter =
transitive.addAll(calculateDependencies(project, context, scopeFilters, it)) if (isTest) OrDependencyFilter(Filters.COMPILE_FILTER, Filters.TEST_FILTER)
else Filters.COMPILE_FILTER
runtimeDeps.filter { it.any() }.forEach {
transitive.addAll(calculateDependencies(project, context, filter,
passedScopes, // scopes = Scope.toScopes(isTest),
passedDependencies = it))
} }
} }
} }

View file

@ -1,181 +0,0 @@
package com.beust.kobalt.maven
import com.beust.kobalt.KobaltException
import com.beust.kobalt.api.*
import com.beust.kobalt.internal.DynamicGraph
import com.beust.kobalt.maven.aether.KobaltAether
import com.beust.kobalt.maven.aether.Scope
import com.beust.kobalt.maven.dependency.FileDependency
import com.beust.kobalt.misc.KFiles
import com.google.common.collect.ArrayListMultimap
import com.google.inject.Inject
import java.io.File
import java.util.*
class DependencyManager2 @Inject constructor(val aether: KobaltAether) {
/**
* Create an IClasspathDependency from a Maven id.
*/
fun createMaven(id: String) : IClasspathDependency = aether.create(id)
/**
* Create an IClasspathDependency from a path.
*/
fun createFile(path: String) : IClasspathDependency = FileDependency(path)
/**
* Parse the id and return the correct IClasspathDependency
*/
fun create(id: String, projectDirectory: String?) : IClasspathDependency {
if (id.startsWith(FileDependency.PREFIX_FILE)) {
val path = if (projectDirectory != null) {
val idPath = id.substring(FileDependency.PREFIX_FILE.length)
if (! File(idPath).isAbsolute) {
// If the project directory is relative, we might not be in the correct directory to locate
// that file, so we'll use the absolute directory deduced from the build file path. Pick
// the first one that produces an actual file
val result = listOf(File(projectDirectory), Kobalt.context?.internalContext?.absoluteDir).map {
File(it, idPath)
}.firstOrNull {
it.exists()
}
result ?: throw KobaltException("Couldn't find $id")
} else {
File(idPath)
}
} else {
File(id.substring(FileDependency.PREFIX_FILE.length))
}
return createFile(path.path)
} else {
// Convert to a Kobalt id first (so that if it doesn't have a version, it gets translated to
// an Aether ranged id "[0,)")
return createMaven(MavenId.create(id).toId)
}
}
/**
* Resolve the dependencies for the give project based on the scope filters.
*/
fun resolve(project: Project, context: KobaltContext, isTest: Boolean,
passedScopeFilters : List<Scope> = emptyList(),
passedIds: List<IClasspathDependency> = emptyList()): List<IClasspathDependency> {
val result = hashSetOf<IClasspathDependency>()
val nonMavenDependencies = hashSetOf<IClasspathDependency>()
val scopeFilters =
if (passedScopeFilters.isEmpty())
if (isTest) listOf(Scope.TEST)
else listOf(Scope.COMPILE)
else passedScopeFilters
val toDependencies = Scope.toDependencyLambda(scopeFilters)
// Make sure that classes/ and test-classes/ are always at the top of this classpath,
// so that older versions of that project on the classpath don't shadow them
if (isTest) {
result.add(FileDependency(KFiles.makeOutputDir(project).path))
result.add(FileDependency(KFiles.makeOutputTestDir(project).path))
}
// Passed and direct ids
val ids = hashSetOf<IClasspathDependency>().apply {
addAll(passedIds)
addAll(toDependencies(project))
}
// Contributed id's
val contributedIds = runClasspathContributors(project, context)
contributedIds.forEach {
if (it.isMaven) ids.add(it)
else nonMavenDependencies.add(it)
}
// Dependent project id's
val dependentIds = dependentProjectDependencies(project, context, toDependencies)
dependentIds.forEach {
if (it.isMaven) ids.add(it)
else nonMavenDependencies.add(it)
}
//
// Now we have all the id's, resolve them
//
var i = 0
ids.forEach {
val resolved = aether.resolveAll(it.id, filterScopes = scopeFilters)
.map { create(it.toString(), project.directory) }
i++
result.addAll(resolved)
}
result.addAll(nonMavenDependencies)
return reorderDependencies(result)
}
/**
* Reorder dependencies so that if an artifact appears several times, only the one with the higest version
* is included.
*/
private fun reorderDependencies(dependencies: Collection<IClasspathDependency>): List<IClasspathDependency> {
val result = arrayListOf<IClasspathDependency>()
val map : ArrayListMultimap<String, IClasspathDependency> = ArrayListMultimap.create()
// The multilist maps each artifact to a list of all the versions found
// (e.g. {org.testng:testng -> (6.9.5, 6.9.4, 6.1.1)}), then we return just the first one
dependencies.forEach {
map.put(it.shortId, it)
}
for (k in map.keySet()) {
val l = map.get(k)
Collections.sort(l, Collections.reverseOrder())
result.add(l[0])
}
return result
}
private fun runClasspathContributors(project: Project?, context: KobaltContext) :
Set<IClasspathDependency> {
val result = hashSetOf<IClasspathDependency>()
context.pluginInfo.classpathContributors.forEach { it: IClasspathContributor ->
result.addAll(it.classpathEntriesFor(project, context))
}
return result
}
/**
* If this project depends on other projects, we need to include their jar file and also
* their own dependencies
*/
private fun dependentProjectDependencies(project: Project?, context: KobaltContext,
toDependencies: (Project) -> List<IClasspathDependency>)
: List<IClasspathDependency> {
// Get the transitive closure of all the projects this project depends on
val transitiveProjects =
if (project == null) emptyList()
else DynamicGraph.transitiveClosure(project, Project::dependsOn)
val result = arrayListOf<IClasspathDependency>()
/**
* Add the class directories of projects depended upon
*/
fun maybeAddClassDir(classDir: String) {
// A project is allowed not to have any kobaltBuild/classes or test-classes directory if it doesn't have
// any sources
if (File(classDir).exists()) {
result.add(FileDependency(classDir))
}
}
transitiveProjects.filter { it.name != project?.name }.forEach { p ->
maybeAddClassDir(KFiles.joinDir(p.directory, p.classesDir(context)))
maybeAddClassDir(KFiles.makeOutputTestDir(p).path)
}
// And add all the transitive projects
result.addAll(transitiveProjects.flatMap { toDependencies(it) })
return result
}
}

View file

@ -1,16 +1,18 @@
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
public class Gpg { class Gpg @Inject constructor(val localProperties: LocalProperties) {
val COMMANDS = listOf("gpg", "gpg2") val COMMANDS = listOf("gpg", "gpg2")
fun findGpgCommand() : String? { fun findGpgCommand() : String? {
@ -42,6 +44,21 @@ public class Gpg {
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

@ -1,9 +1,8 @@
package com.beust.kobalt.maven package com.beust.kobalt.maven
import com.beust.kobalt.HostConfig import com.beust.kobalt.HostConfig
import com.beust.kobalt.KobaltException import com.beust.kobalt.maven.aether.KobaltMavenResolver
import com.beust.kobalt.maven.dependency.FileDependency import com.beust.kobalt.maven.dependency.FileDependency
import com.beust.kobalt.misc.LocalProperties
import java.io.* import java.io.*
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.URL import java.net.URL
@ -21,27 +20,7 @@ class Kurl(val hostInfo: HostConfig) {
} }
init { init {
// See if the URL needs to be authenticated. Look in local.properties for keys KobaltMavenResolver.initAuthentication(hostInfo)
// of the format authUrl.<host>.user=xxx and authUrl.<host>.password=xxx
val properties = LocalProperties().localProperties
val host = java.net.URL(hostInfo.url).host
properties.entries.forEach {
val key = it.key.toString()
if (key == "$KEY.$host.$VALUE_USER") {
hostInfo.username = properties.getProperty(key)
} else if (key == "$KEY.$host.$VALUE_PASSWORD") {
hostInfo.password = properties.getProperty(key)
}
}
fun error(s1: String, s2: String) {
throw KobaltException("Found \"$s1\" but not \"$s2\" in local.properties for $KEY.$host",
docUrl = "http://beust.com/kobalt/documentation/index.html#maven-repos-authenticated")
}
if (! hostInfo.username.isNullOrBlank() && hostInfo.password.isNullOrBlank()) {
error("username", "password")
} else if(hostInfo.username.isNullOrBlank() && ! hostInfo.password.isNullOrBlank()) {
error("password", "username")
}
} }
override fun toString() = hostInfo.toString() override fun toString() = hostInfo.toString()

Some files were not shown because too many files have changed in this diff Show more