From 850e335843c1c86687d168e0930d01e0b590ffa9 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Fri, 23 Sep 2016 12:20:44 -0700 Subject: [PATCH] Added autoGitTag to github and bintray configurations. --- .../main/kotlin/com/beust/kobalt/misc/Git.kt | 43 +++++++++ .../kobalt/plugin/publish/PublishPlugin.kt | 87 +++++++++++-------- 2 files changed, 95 insertions(+), 35 deletions(-) create mode 100644 modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt 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 new file mode 100644 index 00000000..518250a5 --- /dev/null +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/Git.kt @@ -0,0 +1,43 @@ +package com.beust.kobalt.misc + +import com.beust.kobalt.TaskResult +import com.beust.kobalt.api.Project +import com.google.inject.Inject +import java.io.File + +class Git @Inject constructor() { + fun maybeTagRelease(project: Project, uploadResult: TaskResult, autoGitTag: Boolean) : TaskResult { + val result = + if (uploadResult.success && autoGitTag) { + val tagSuccess = tagRelease(project) + if (! tagSuccess) { + TaskResult(false, "Couldn't tag the project") + } else { + TaskResult() + } + } else { + TaskResult() + } + return result + } + + private fun tagRelease(project: Project) : Boolean { + val success = try { + log(2, "Tagging this release as \"${project.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() + git.push().setPushTags().call() + true + } catch(ex: Exception) { + warn("Couldn't create tag ${project.version}: ${ex.message}", ex) + false + } + + return success + } +} 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 a6cb8c60..5dbe4def 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/publish/PublishPlugin.kt @@ -7,14 +7,10 @@ import com.beust.kobalt.api.Project import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Task import com.beust.kobalt.internal.DocUrl -import com.beust.kobalt.internal.KobaltSettings import com.beust.kobalt.localMaven import com.beust.kobalt.maven.Md5 import com.beust.kobalt.maven.PomGenerator -import com.beust.kobalt.misc.GithubApi2 -import com.beust.kobalt.misc.KFiles -import com.beust.kobalt.misc.LocalProperties -import com.beust.kobalt.misc.warn +import com.beust.kobalt.misc.* import java.io.File import java.net.URL import java.nio.file.Paths @@ -26,7 +22,7 @@ import javax.inject.Singleton @Singleton public class PublishPlugin @Inject constructor(val files: KFiles, val factory: PomGenerator.IFactory, val bintrayFactory: BintrayApi.IFactory, val github: GithubApi2, val localProperties: LocalProperties, - val settings: KobaltSettings) : BasePlugin() { + val git: Git) : BasePlugin() { override val name = PLUGIN_NAME @@ -118,30 +114,34 @@ public class PublishPlugin @Inject constructor(val files: KFiles, val factory: P val configuration = bintrayConfigurations[project.name] val messages = arrayListOf() - if (configuration != null) { - // - // Upload to Maven - // - val trMaven = jcenter.uploadMaven(project, findArtifactFiles(project), configuration) - success = trMaven.success - if (! success) messages.add(trMaven.errorMessage!!) + val tmpResult = + if (configuration != null) { + // + // Upload to Maven + // + val trMaven = jcenter.uploadMaven(project, findArtifactFiles(project), configuration) + success = trMaven.success + if (! success) messages.add(trMaven.errorMessage!!) - // - // Upload individual files, if applicable - // - configuration.files.forEach { - val taskResult = jcenter.uploadFile(project, File(project.directory, it.first), configuration) - success = success and taskResult.success - if (!taskResult.success) { - messages.add(taskResult.errorMessage!!) + // + // Upload individual files, if applicable + // + configuration.files.forEach { + val taskResult = jcenter.uploadFile(project, File(project.directory, it.first), configuration) + success = success and taskResult.success + if (!taskResult.success) { + messages.add(taskResult.errorMessage!!) + } } + git.maybeTagRelease(project, TaskResult(), configuration.autoGitTag) + } else { + context.logger.log(project.name, 2, "Couldn't find any jcenter{} configuration, not uploading anything") + TaskResult() } - } else { - context.logger.log(project.name, 2, "Couldn't find any jcenter{} configuration, not uploading anything") - success = true - } - return TaskResult(success, messages.joinToString("\n ")) + val result = TaskResult(tmpResult.success, messages.joinToString("\n ")) + + return result } @Task(name = TASK_UPLOAD_GITHUB, description = "Upload files to Github", @@ -157,16 +157,19 @@ public class PublishPlugin @Inject constructor(val files: KFiles, val factory: P // // Upload individual files, if applicable // - if (configuration != null) { - configuration.files.forEach { - logk(project.name, 2, "Uploading $it tag: ${project.version}") - github.uploadRelease(project.name, project.version!!, it) + val result = + if (configuration != null) { + configuration.files.forEach { + logk(project.name, 2, "Uploading $it tag: ${project.version}") + github.uploadRelease(project.name, project.version!!, it) + } + git.maybeTagRelease(project, TaskResult(), configuration.autoGitTag) + } else { + warn("Couldn't find any github{} configuration, not uploading anything") + TaskResult() } - } else { - warn("Couldn't find any github{} configuration, not uploading anything") - } - return TaskResult() + return result } /** @@ -189,8 +192,15 @@ public class PublishPlugin @Inject constructor(val files: KFiles, val factory: P 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 - public fun file(filePath: String, url: String) { + var autoGitTag: Boolean = false + + @Directive + fun file(filePath: String, url: String) { files.add(File(filePath)) } } @@ -219,6 +229,13 @@ 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