From 53fec105e95a7a9fc964c868594e4bdb228dbcc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Sch=C3=A4fer?= Date: Sat, 29 Jan 2022 01:24:57 +0100 Subject: [PATCH] Improve `dist` task --- .../gradle/plugin/task/RenameArchiveFile.kt | 48 +++++++++++++++++++ .../josm/gradle/plugin/task/TaskSetup.kt | 35 +++++--------- 2 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 plugin/src/main/kotlin/org/openstreetmap/josm/gradle/plugin/task/RenameArchiveFile.kt diff --git a/plugin/src/main/kotlin/org/openstreetmap/josm/gradle/plugin/task/RenameArchiveFile.kt b/plugin/src/main/kotlin/org/openstreetmap/josm/gradle/plugin/task/RenameArchiveFile.kt new file mode 100644 index 00000000..cc6384bb --- /dev/null +++ b/plugin/src/main/kotlin/org/openstreetmap/josm/gradle/plugin/task/RenameArchiveFile.kt @@ -0,0 +1,48 @@ +package org.openstreetmap.josm.gradle.plugin.task + +import org.gradle.api.Transformer +import org.gradle.api.file.Directory +import org.gradle.api.file.DuplicatesStrategy +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.AbstractCopyTask +import org.gradle.api.tasks.Sync +import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.TaskProvider +import org.gradle.api.tasks.bundling.AbstractArchiveTask +import javax.inject.Inject + +/** + * Task that simply copies the archive file produced by the given [archiverTask] + */ +public open class RenameArchiveFile @Inject constructor( + private val archiverTask: TaskProvider, + private val targetDir: Provider, + fileBaseName: Provider +): Sync() { + + private val fileName by lazy(LazyThreadSafetyMode.PUBLICATION) { + "${fileBaseName.get()}.${archiverTask.get().archiveExtension.get()}" + } + + init { + from(archiverTask.map { it.archiveFile }) + into(targetDir) + rename { fileName } + duplicatesStrategy = DuplicatesStrategy.FAIL + } + + final override fun from(vararg sourcePaths: Any?): AbstractCopyTask = super.from(*sourcePaths) + final override fun into(destDir: Any): AbstractCopyTask = super.into(destDir) + final override fun rename(renamer: Transformer): AbstractCopyTask = super.rename(renamer) + + @TaskAction + override fun copy() { + super.copy() + logger.lifecycle( + "Distribution {} (version {}) has been written into {}", + fileName, + project.version, + targetDir.get().asFile.canonicalPath + ) + } +} diff --git a/plugin/src/main/kotlin/org/openstreetmap/josm/gradle/plugin/task/TaskSetup.kt b/plugin/src/main/kotlin/org/openstreetmap/josm/gradle/plugin/task/TaskSetup.kt index 48f620f0..ba1564d5 100644 --- a/plugin/src/main/kotlin/org/openstreetmap/josm/gradle/plugin/task/TaskSetup.kt +++ b/plugin/src/main/kotlin/org/openstreetmap/josm/gradle/plugin/task/TaskSetup.kt @@ -5,7 +5,7 @@ import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.file.DuplicatesStrategy import org.gradle.api.tasks.SourceSet -import org.gradle.api.tasks.Sync +import org.gradle.api.tasks.TaskProvider import org.gradle.jvm.tasks.Jar import org.openstreetmap.josm.gradle.plugin.MainConfigurationSetup import org.openstreetmap.josm.gradle.plugin.task.github.CreateGithubReleaseTask @@ -24,7 +24,7 @@ import java.util.Base64 * This method sets up all the [Task]s (and [Configuration]s) for a given project that should be there by default. */ @OptIn(ExperimentalUnsignedTypes::class) -fun Project.setupJosmTasks(mainConfigSetup: MainConfigurationSetup) { +public fun Project.setupJosmTasks(mainConfigSetup: MainConfigurationSetup) { tasks.create("listJosmVersions", ListJosmVersions::class.java) @@ -70,14 +70,15 @@ fun Project.setupJosmTasks(mainConfigSetup: MainConfigurationSetup) { private fun setupPluginDistTasks(project: Project, sourceSetJosmPlugin: SourceSet) { val archiverTask = project.tasks.withType(Jar::class.java).getByName(sourceSetJosmPlugin.jarTaskName) - val distDir = File(project.buildDir, "dist") + val archiverTaskProvider: TaskProvider = project.tasks.named(sourceSetJosmPlugin.jarTaskName, Jar::class.java) + val distDir = project.layout.buildDirectory.map { it.dir("dist") } val localDistDir = File(project.buildDir, "localDist") val localDistTask = project.tasks.create("localDist", GeneratePluginList::class.java) { genListTask -> genListTask.group = "JOSM" genListTask.outputFile = File(localDistDir, "list") genListTask.description = "Generate a local plugin site." - genListTask.dependsOn(archiverTask) + genListTask.dependsOn(archiverTaskProvider) project.afterEvaluate { val localDistReleaseFile = File(localDistDir, project.extensions.josm.pluginName + "-dev.${archiverTask.archiveExtension.get()}") @@ -129,25 +130,13 @@ private fun setupPluginDistTasks(project: Project, sourceSetJosmPlugin: SourceSe } } - val distTask = project.tasks.create("dist", Sync::class.java) { distTask -> - distTask.from(project.tasks.getByName(sourceSetJosmPlugin.jarTaskName)) - distTask.into(distDir) - distTask.duplicatesStrategy = DuplicatesStrategy.FAIL - project.afterEvaluate { - val fileName = "${project.extensions.josm.pluginName}.${archiverTask.archiveExtension.get()}" - distTask.doFirst { - distTask.rename { fileName } - } - distTask.doLast { - distTask.logger.lifecycle( - "Distribution {} (version {}) has been written into {}", - fileName, - project.version, - distDir.absolutePath - ) - } - } - } + val distTask = project.tasks.register( + "dist", + RenameArchiveFile::class.java, + archiverTaskProvider, + distDir, + project.provider { project.extensions.josm.pluginName } + ) project.tasks.getByName(sourceSetJosmPlugin.jarTaskName).finalizedBy(distTask, localDistTask) }