diff --git a/README.md b/README.md index c7d9c3b7..81d87855 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Kobalt - +[](https://teamcity.jetbrains.com/project.html?projectId=OpenSourceProjects_Kobalt&tab=projectOverview) + Kobalt is a universal build system. diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index ad08b98d..865a6d26 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -27,7 +27,7 @@ object Versions { val maven = "3.3.9" val mavenResolver = "1.0.3" val slf4j = "1.7.3" - val kotlin = "1.1.0" + val kotlin = "1.1.1" val aether = "1.0.2.v20150114" } diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties index 26487e73..20728f85 100644 --- a/kobalt/wrapper/kobalt-wrapper.properties +++ b/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.12 \ No newline at end of file +kobalt.version=1.0.13 \ No newline at end of file diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Constants.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Constants.kt index f6a8ea98..6305f1b1 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Constants.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Constants.kt @@ -8,7 +8,7 @@ object Constants { val BUILD_FILE_NAME = "Build.kt" val BUILD_FILE_DIRECTORY = "kobalt/src" val BUILD_FILE_PATH = KFiles.joinDir(BUILD_FILE_DIRECTORY, BUILD_FILE_NAME) - val KOTLIN_COMPILER_VERSION = "1.1.0" + val KOTLIN_COMPILER_VERSION = "1.1.1" internal val DEFAULT_REPOS = listOf( // "https://maven-central.storage.googleapis.com/", diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt index 7882cfd0..fa48427e 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt @@ -58,10 +58,12 @@ class CompilerDescription(override val name: String, override val sourceDirecto if (info.sourceFiles.isNotEmpty()) { compiler.compile(project, context, info) } else { - warn("Couldn't find any source files to compile") + warn("$name cdouldn't find any source files to compile") TaskResult() } return result } + + override fun toString() = name + " compiler" } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt index 6913c8ed..9ff45407 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt @@ -139,8 +139,14 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, * 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) - = excluded.any { excluded -> dep.id.startsWith(excluded.id) } + fun isDependencyExcluded(dep: IClasspathDependency, excluded: List): Boolean { + excluded.any { excluded -> dep.id.startsWith(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, // we need to reorder them again in case we're adding dependencies that are already present diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt index 518250a5..67eb8bef 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt @@ -6,10 +6,10 @@ import com.google.inject.Inject import java.io.File class Git @Inject constructor() { - fun maybeTagRelease(project: Project, uploadResult: TaskResult, autoGitTag: Boolean) : TaskResult { + fun maybeTagRelease(project: Project, uploadResult: TaskResult, auto: Boolean, tag: String, message: String) : TaskResult { val result = - if (uploadResult.success && autoGitTag) { - val tagSuccess = tagRelease(project) + if (uploadResult.success && auto) { + val tagSuccess = tagRelease(project, auto, tag, message) if (! tagSuccess) { TaskResult(false, "Couldn't tag the project") } else { @@ -21,20 +21,21 @@ class Git @Inject constructor() { return result } - private fun tagRelease(project: Project) : Boolean { + private fun tagRelease(project: Project, auto: Boolean, tag: String, message: String) : Boolean { + val version = if (tag.isNullOrBlank()) project.version else tag val success = try { - log(2, "Tagging this release as \"${project.version}\"") + log(2, "Tagging this release as \"$version\"") val repo = org.eclipse.jgit.storage.file.FileRepositoryBuilder() .setGitDir(File(KFiles.joinDir(project.directory, ".git"))) .readEnvironment() .findGitDir() .build() val git = org.eclipse.jgit.api.Git(repo) - val ref = git.tag().setName(project.version).call() + val ref = git.tag().setName(version).setMessage(message).call() git.push().setPushTags().call() true } catch(ex: Exception) { - warn("Couldn't create tag ${project.version}: ${ex.message}", ex) + warn("Couldn't create tag ${version}: ${ex.message}", ex) false } diff --git a/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt index ea541efa..0ac6fe18 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt @@ -1,6 +1,5 @@ package com.beust.kobalt.plugin.packaging -import aQute.bnd.osgi.Analyzer import com.beust.kobalt.* import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Directive @@ -62,29 +61,39 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana runTask = { taskInstall(project) }) } - val zipToFiles = hashMapOf>() - override fun assemble(project: Project, context: KobaltContext) : IncrementalTaskInfo { val allConfigs = packages.filter { it.project.name == project.name } + val zipToFiles = hashMapOf>() val benchmark = benchmarkMillis { if (true) { + // + // This loop prepares the data so we can calculate input and output checksums for the + // assemble task: + // - Input: Calculate the list of all the included files for every archive (jar/war/zip) and + // store them in the `zipToFiles` map. + // - Output: Calculate all the output archive files into `outputFiles` + // + // `zipToFiles` is used again after this loop so we can pass the list of included files we just + // calculated for all the archives in the actual execution of the task, so we don't have to + // look for them a second time. + // val allIncludedFiles = arrayListOf() - val outputArchives = arrayListOf() + val outputFiles = arrayListOf() allConfigs.forEach { packageConfig -> listOf(packageConfig.jars, packageConfig.wars, packageConfig.zips).forEach { archives -> archives.forEach { val files = jarGenerator.findIncludedFiles(packageConfig.project, context, it) - val suffixIndex = it.name.lastIndexOf(".") - val suffix = it.name.substring(suffixIndex) val outputFile = jarGenerator.fullArchiveName(project, context, it.name) - outputArchives.add(outputFile) + outputFiles.add(outputFile) allIncludedFiles.addAll(files) zipToFiles[it.name] = files } } } - val allFiles = allIncludedFiles.fold(arrayListOf()) { files, includedFile: IncludedFile -> + + // Turn the IncludedFiles into actual Files + val inputFiles = allIncludedFiles.fold(arrayListOf()) { files, includedFile: IncludedFile -> val foundFiles = includedFile.allFromFiles(project.directory) val absFiles = foundFiles.map { File(KFiles.joinDir(project.directory, includedFile.from, it.path)) @@ -93,8 +102,8 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana files } - val inMd5 = Md5.toMd5Directories(allFiles) - val outMd5 = Md5.toMd5Directories(outputArchives) + val inMd5 = Md5.toMd5Directories(inputFiles) + val outMd5 = Md5.toMd5Directories(outputFiles) Pair(inMd5, outMd5) } else { Pair(null, null) @@ -150,7 +159,7 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana context.pluginInfo.incrementalAssemblyContributors.forEach { val taskInfo = it.assemble(project, context) val closure = incrementalManagerFactory.create().toIncrementalTaskClosure(TASK_ASSEMBLE, { - p: Project -> taskInfo }, context.variant) + _: Project -> taskInfo }, context.variant) val thisResult = closure.invoke(project) if (! thisResult.success) { // Abort at the first failure @@ -174,24 +183,24 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana } // @Task(name = "generateOsgiManifest", alwaysRunAfter = arrayOf(TASK_ASSEMBLE)) - fun generateManifest(project: Project): TaskResult { - val analyzer = Analyzer().apply { - jar = aQute.bnd.osgi.Jar(project.projectProperties.get(Archives.JAR_NAME) as String) - val dependencies = project.compileDependencies + project.compileRuntimeDependencies - dependencyManager.calculateDependencies(project, context, passedDependencies = dependencies).forEach { - addClasspath(it.jarFile.get()) - } - setProperty(Analyzer.BUNDLE_VERSION, project.version) - setProperty(Analyzer.BUNDLE_NAME, project.group) - setProperty(Analyzer.BUNDLE_DESCRIPTION, project.description) - setProperty(Analyzer.IMPORT_PACKAGE, "*") - setProperty(Analyzer.EXPORT_PACKAGE, "*;-noimport:=false;version=" + project.version) - } - - val manifest = analyzer.calcManifest() - manifest.write(System.out) - return TaskResult() - } +// fun generateManifest(project: Project): TaskResult { +// val analyzer = Analyzer().apply { +// jar = aQute.bnd.osgi.Jar(project.projectProperties.get(Archives.JAR_NAME) as String) +// val dependencies = project.compileDependencies + project.compileRuntimeDependencies +// dependencyManager.calculateDependencies(project, context, passedDependencies = dependencies).forEach { +// addClasspath(it.jarFile.get()) +// } +// setProperty(Analyzer.BUNDLE_VERSION, project.version) +// setProperty(Analyzer.BUNDLE_NAME, project.group) +// setProperty(Analyzer.BUNDLE_DESCRIPTION, project.description) +// setProperty(Analyzer.IMPORT_PACKAGE, "*") +// setProperty(Analyzer.EXPORT_PACKAGE, "*;-noimport:=false;version=" + project.version) +// } +// +// val manifest = analyzer.calcManifest() +// manifest.write(System.out) +// return TaskResult() +// } @Task(name = PackagingPlugin.TASK_INSTALL, description = "Install the artifacts", diff --git a/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt index 56883401..5a442893 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt @@ -44,6 +44,16 @@ class PublishPlugin @Inject constructor(val files: KFiles, val factory: PomGener return TaskResult() } + private fun autoGitTag(project: Project, uploadResult: TaskResult, config: AutoGitTagConfig?) : TaskResult { + if (config != null) { + with(config) { + return git.maybeTagRelease(project, uploadResult, auto, tag, message) + } + } else { + return TaskResult() + } + } + private fun validateProject(project: Project) { requireNotNull(project.name, { "Project $project should have a name" }) requireNotNull(project.version, { "Project $project should have a version" }) @@ -133,7 +143,11 @@ class PublishPlugin @Inject constructor(val files: KFiles, val factory: PomGener messages.add(taskResult.errorMessage!!) } } - git.maybeTagRelease(project, TaskResult(), configuration.autoGitTag) + + // + // Tag release, if applicable + // + autoGitTag(project, TaskResult(), autoGitTagConfigurations[project.name]) } else { context.logger.log(project.name, 2, "Couldn't find any jcenter{} configuration, not uploading anything") TaskResult() @@ -163,7 +177,11 @@ class PublishPlugin @Inject constructor(val files: KFiles, val factory: PomGener logk(project.name, 2, "Uploading $it tag: ${project.version}") github.uploadRelease(project.name, project.version!!, it) } - git.maybeTagRelease(project, TaskResult(), configuration.autoGitTag) + + // + // Tag release, if applicable + // + autoGitTag(project, TaskResult(), autoGitTagConfigurations[project.name]) } else { warn("Couldn't find any github{} configuration, not uploading anything") TaskResult() @@ -187,18 +205,30 @@ class PublishPlugin @Inject constructor(val files: KFiles, val factory: PomGener fun addGithubConfiguration(projectName: String, config: GithubConfig) { githubConfigurations.put(projectName, config) } + + /** + * Map of project name -> AutoGitTagConfiguration + */ + private val autoGitTagConfigurations = hashMapOf() + fun addAutoGitTagConfiguration(projectName: String, config: AutoGitTagConfig) { + autoGitTagConfigurations.put(projectName, config) + } +} + +data class AutoGitTagConfig(val project: Project) { + @Directive + var auto: Boolean = true + + @Directive + var tag : String = project.version!! + + @Directive + var message : String = "" } data class GithubConfig(val project: Project) { val files = arrayListOf() - /** - * If true, automatically tag this release with the current version number and push that tag to origin when - * the uploadGithub task is called. - */ - @Directive - var autoGitTag: Boolean = false - @Directive fun file(filePath: String, url: String) { files.add(File(filePath)) @@ -213,6 +243,8 @@ fun Project.github(init: GithubConfig.() -> Unit): GithubConfig = } data class BintrayConfig(val project: Project) { + val files = arrayListOf>() + /** * If true, the uploaded file will be published in your personal space (e.g. https://dl.bintray.com/cbeust/maven). * Once the file is uploaded there, it can be automatically synchronized to JCenter by linking your project to @@ -228,15 +260,6 @@ data class BintrayConfig(val project: Project) { @Directive var sign: Boolean = false - /** - * If true, automatically tag this release with the current version number and push that tag to origin when - * the uploadBintray task is called. - */ - @Directive - var autoGitTag: Boolean = true - - val files = arrayListOf>() - @Directive fun file(filePath: String, url: String) { files.add(Pair(filePath, url)) @@ -255,3 +278,10 @@ fun Project.bintray(init: BintrayConfig.() -> Unit) = config.init() (Kobalt.findPlugin(PublishPlugin.PLUGIN_NAME) as PublishPlugin).addBintrayConfiguration(name, config) } + +@Directive +fun Project.autoGitTag(init: AutoGitTagConfig.() -> Unit) = + AutoGitTagConfig(this).also { config -> + config.init() + (Kobalt.findPlugin(PublishPlugin.PLUGIN_NAME) as PublishPlugin).addAutoGitTagConfiguration(name, config) + } diff --git a/src/main/resources/kobalt.properties b/src/main/resources/kobalt.properties index 067473ac..701a3432 100644 --- a/src/main/resources/kobalt.properties +++ b/src/main/resources/kobalt.properties @@ -1 +1 @@ -kobalt.version=1.0.12 +kobalt.version=1.0.13