From 9b09537fc938beafca8c4faebb14a3039a4004fe Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Mon, 30 Jun 2025 14:18:34 +0200 Subject: [PATCH 1/3] Add zip back --- ...ymentName.kt => nmcpFindDeploymentName.kt} | 11 +++++--- .../task/nmcpPublishWithPublisherApi.kt | 10 ++++--- nmcp/src/main/kotlin/nmcp/internal/utils.kt | 26 +++++++++++++++++-- 3 files changed, 38 insertions(+), 9 deletions(-) rename nmcp/src/main/kotlin/nmcp/internal/task/{deploymentName.kt => nmcpFindDeploymentName.kt} (76%) diff --git a/nmcp/src/main/kotlin/nmcp/internal/task/deploymentName.kt b/nmcp/src/main/kotlin/nmcp/internal/task/nmcpFindDeploymentName.kt similarity index 76% rename from nmcp/src/main/kotlin/nmcp/internal/task/deploymentName.kt rename to nmcp/src/main/kotlin/nmcp/internal/task/nmcpFindDeploymentName.kt index cbcea30..967bb9a 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/task/deploymentName.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/task/nmcpFindDeploymentName.kt @@ -1,16 +1,20 @@ package nmcp.internal.task import gratatouille.tasks.GInputFiles +import gratatouille.tasks.GOutputFile +import gratatouille.tasks.GTask import kotlin.collections.distinct import kotlin.collections.map import kotlin.collections.mapNotNull import kotlin.collections.single +import kotlin.text.buildString import kotlin.text.endsWith import kotlin.text.substringBeforeLast -internal fun GInputFiles.findDeploymentName(): String { - val gavs = mapNotNull { +@GTask +internal fun nmcpFindDeploymentName(inputFiles: GInputFiles, outputFile: GOutputFile) { + val gavs = inputFiles.mapNotNull { if (!it.normalizedPath.endsWith(".pom")) { return@mapNotNull null } @@ -22,7 +26,7 @@ internal fun GInputFiles.findDeploymentName(): String { val artifacts = gavs.map { it.artifactId }.distinct() val versions = gavs.map { it.version }.distinct() - return buildString { + val deploymentName = buildString { if (groups.size == 1) { append(groups.single()) } else { @@ -41,4 +45,5 @@ internal fun GInputFiles.findDeploymentName(): String { append("multiple-versions") } } + outputFile.writeText(deploymentName) } diff --git a/nmcp/src/main/kotlin/nmcp/internal/task/nmcpPublishWithPublisherApi.kt b/nmcp/src/main/kotlin/nmcp/internal/task/nmcpPublishWithPublisherApi.kt index dcb615d..cf90ee4 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/task/nmcpPublishWithPublisherApi.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/task/nmcpPublishWithPublisherApi.kt @@ -1,5 +1,6 @@ package nmcp.internal.task +import gratatouille.tasks.GInputFile import gratatouille.tasks.GInputFiles import gratatouille.tasks.GLogger import gratatouille.tasks.GTask @@ -18,6 +19,7 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MultipartBody import okhttp3.Request import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import okio.Buffer import okio.BufferedSink @@ -29,12 +31,12 @@ internal fun nmcpPublishWithPublisherApi( logger: GLogger, username: String?, password: String?, - publicationName: String?, + publicationName: String, publishingType: String?, baseUrl: String?, validationTimeoutSeconds: Long?, publishingTimeoutSeconds: Long?, - inputFiles: GInputFiles, + inputFile: GInputFile, ) { check(!username.isNullOrBlank()) { "Nmcp: username is missing" @@ -50,8 +52,8 @@ internal fun nmcpPublishWithPublisherApi( val body = MultipartBody.Builder() .addFormDataPart( "bundle", - publicationName ?: inputFiles.findDeploymentName(), - ZipBody(inputFiles, logger), + publicationName, + inputFile.asRequestBody("application/octet-stream".toMediaType()), ) .build() diff --git a/nmcp/src/main/kotlin/nmcp/internal/utils.kt b/nmcp/src/main/kotlin/nmcp/internal/utils.kt index ead957b..95a9a9e 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/utils.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/utils.kt @@ -3,6 +3,7 @@ package nmcp.internal import gratatouille.wiring.capitalizeFirstLetter import nmcp.CentralPortalOptions import nmcp.internal.task.NmcpPublishWithPublisherApiTask +import nmcp.internal.task.registerNmcpFindDeploymentNameTask import nmcp.internal.task.registerNmcpPublishFileByFileToSnapshotsTask import nmcp.internal.task.registerNmcpPublishWithPublisherApiTask import org.gradle.api.Action @@ -13,6 +14,7 @@ import org.gradle.api.attributes.HasConfigurableAttributes import org.gradle.api.attributes.Usage import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE import org.gradle.api.file.FileCollection +import org.gradle.api.tasks.bundling.Zip internal fun Project.withRequiredPlugin(id: String, block: () -> Unit) { var hasPlugin = false @@ -55,6 +57,8 @@ internal fun Project.registerPublishToCentralPortalTasks( val releaseTaskName = "nmcpPublish${name.capitalizeFirstLetter()}ToCentralPortal" val snapshotTaskName = "nmcpPublish${name.capitalizeFirstLetter()}ToCentralPortalSnapshots" + val zipTaskName = "nmcpZip${name.capitalizeFirstLetter()}" + val findDeploymentNameTaskName = "nmcpFind${name.capitalizeFirstLetter()}DeploymentName" val shortcut = when(name) { "aggregation", @@ -64,12 +68,30 @@ internal fun Project.registerPublishToCentralPortalTasks( val lifecycleTaskName = shortcut?.let { "publish${it.capitalizeFirstLetter()}ToCentralPortal" } val snapshotsLifecycleTaskName = shortcut?.let { "publish${it.capitalizeFirstLetter()}ToCentralPortalSnapshots" } + val zipName = "${name}.zip" + val zipTaskProvider = tasks.register(zipTaskName, Zip::class.java) { + it.from(inputFiles) + it.destinationDirectory.set(project.layout.buildDirectory.dir("nmcp/zip")) + it.archiveFileName.set(zipName) + it.eachFile { + // Exclude maven-metadata files, or the bundle is not recognized + // See https://slack-chats.kotlinlang.org/t/16407246/anyone-tried-the-https-central-sonatype-org-publish-publish-#c8738fe5-8051-4f64-809f-ca67a645216e + if (it.name.startsWith("maven-metadata")) { + it.exclude() + } + } + } + + val findDeploymentNameTaskProvider = registerNmcpFindDeploymentNameTask( + taskName = findDeploymentNameTaskName, + inputFiles = inputFiles, + ) val task = registerNmcpPublishWithPublisherApiTask( taskName = releaseTaskName, - inputFiles = inputFiles, + inputFile = zipTaskProvider.flatMap { it.archiveFile }, username = spec.username, password = spec.password, - publicationName = spec.publicationName, + publicationName = spec.publicationName.orElse(findDeploymentNameTaskProvider.flatMap { it.outputFile }.map { it.asFile.readText() }), publishingType = spec.publishingType, baseUrl = spec.baseUrl, validationTimeoutSeconds = spec.validationTimeout.map { it.seconds }, From 92d19b5060899767cd5c8115e80f5a3a66fb8370 Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Mon, 30 Jun 2025 14:20:07 +0200 Subject: [PATCH 2/3] update apiDump --- nmcp/api/nmcp.api | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/nmcp/api/nmcp.api b/nmcp/api/nmcp.api index c2e7e31..6bd0ddf 100644 --- a/nmcp/api/nmcp.api +++ b/nmcp/api/nmcp.api @@ -72,6 +72,16 @@ public final class nmcp/internal/task/MetadataKt { public static final fun getXml ()Lkotlinx/serialization/StringFormat; } +public final class nmcp/internal/task/NmcpFindDeploymentNameEntryPoint { + public static final field Companion Lnmcp/internal/task/NmcpFindDeploymentNameEntryPoint$Companion; + public fun ()V + public static final fun run (Ljava/util/List;Ljava/io/File;)V +} + +public final class nmcp/internal/task/NmcpFindDeploymentNameEntryPoint$Companion { + public final fun run (Ljava/util/List;Ljava/io/File;)V +} + public final class nmcp/internal/task/NmcpPublishFileByFileToSnapshotsEntryPoint { public static final field Companion Lnmcp/internal/task/NmcpPublishFileByFileToSnapshotsEntryPoint$Companion; public fun ()V @@ -85,11 +95,11 @@ public final class nmcp/internal/task/NmcpPublishFileByFileToSnapshotsEntryPoint public final class nmcp/internal/task/NmcpPublishWithPublisherApiEntryPoint { public static final field Companion Lnmcp/internal/task/NmcpPublishWithPublisherApiEntryPoint$Companion; public fun ()V - public static final fun run (Ljava/util/function/BiConsumer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/util/List;)V + public static final fun run (Ljava/util/function/BiConsumer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/io/File;)V } public final class nmcp/internal/task/NmcpPublishWithPublisherApiEntryPoint$Companion { - public final fun run (Ljava/util/function/BiConsumer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/util/List;)V + public final fun run (Ljava/util/function/BiConsumer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/io/File;)V } public final class nmcp/internal/task/OkhttpKt { From b0dd36eb0f8fb6ae299dca887e91ec77bec1f720 Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Mon, 30 Jun 2025 14:33:56 +0200 Subject: [PATCH 3/3] fix test --- tests/kmp/build.gradle.kts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/kmp/build.gradle.kts b/tests/kmp/build.gradle.kts index d475b8a..5ea2508 100644 --- a/tests/kmp/build.gradle.kts +++ b/tests/kmp/build.gradle.kts @@ -60,10 +60,14 @@ tasks.register("checkZip") { } } -// println(paths.sorted().joinToString(",\n")) + //println(paths.sorted().joinToString(",\n")) check( paths.sorted().equals( listOf( + "sample/", + "sample/kmp/", + "sample/kmp/module1-js/", + "sample/kmp/module1-js/0.0.1/", "sample/kmp/module1-js/0.0.1/module1-js-0.0.1-sources.jar", "sample/kmp/module1-js/0.0.1/module1-js-0.0.1-sources.jar.md5", "sample/kmp/module1-js/0.0.1/module1-js-0.0.1-sources.jar.sha1", @@ -84,6 +88,8 @@ tasks.register("checkZip") { "sample/kmp/module1-js/0.0.1/module1-js-0.0.1.pom.sha1", "sample/kmp/module1-js/0.0.1/module1-js-0.0.1.pom.sha256", "sample/kmp/module1-js/0.0.1/module1-js-0.0.1.pom.sha512", + "sample/kmp/module1-jvm/", + "sample/kmp/module1-jvm/0.0.1/", "sample/kmp/module1-jvm/0.0.1/module1-jvm-0.0.1-sources.jar", "sample/kmp/module1-jvm/0.0.1/module1-jvm-0.0.1-sources.jar.md5", "sample/kmp/module1-jvm/0.0.1/module1-jvm-0.0.1-sources.jar.sha1", @@ -104,6 +110,8 @@ tasks.register("checkZip") { "sample/kmp/module1-jvm/0.0.1/module1-jvm-0.0.1.pom.sha1", "sample/kmp/module1-jvm/0.0.1/module1-jvm-0.0.1.pom.sha256", "sample/kmp/module1-jvm/0.0.1/module1-jvm-0.0.1.pom.sha512", + "sample/kmp/module1-linuxarm64/", + "sample/kmp/module1-linuxarm64/0.0.1/", "sample/kmp/module1-linuxarm64/0.0.1/module1-linuxarm64-0.0.1-sources.jar", "sample/kmp/module1-linuxarm64/0.0.1/module1-linuxarm64-0.0.1-sources.jar.md5", "sample/kmp/module1-linuxarm64/0.0.1/module1-linuxarm64-0.0.1-sources.jar.sha1", @@ -124,6 +132,8 @@ tasks.register("checkZip") { "sample/kmp/module1-linuxarm64/0.0.1/module1-linuxarm64-0.0.1.pom.sha1", "sample/kmp/module1-linuxarm64/0.0.1/module1-linuxarm64-0.0.1.pom.sha256", "sample/kmp/module1-linuxarm64/0.0.1/module1-linuxarm64-0.0.1.pom.sha512", + "sample/kmp/module1/", + "sample/kmp/module1/0.0.1/", "sample/kmp/module1/0.0.1/module1-0.0.1-kotlin-tooling-metadata.json", "sample/kmp/module1/0.0.1/module1-0.0.1-kotlin-tooling-metadata.json.md5", "sample/kmp/module1/0.0.1/module1-0.0.1-kotlin-tooling-metadata.json.sha1", @@ -149,6 +159,8 @@ tasks.register("checkZip") { "sample/kmp/module1/0.0.1/module1-0.0.1.pom.sha1", "sample/kmp/module1/0.0.1/module1-0.0.1.pom.sha256", "sample/kmp/module1/0.0.1/module1-0.0.1.pom.sha512", + "sample/kmp/module2-js/", + "sample/kmp/module2-js/0.0.1/", "sample/kmp/module2-js/0.0.1/module2-js-0.0.1-sources.jar", "sample/kmp/module2-js/0.0.1/module2-js-0.0.1-sources.jar.md5", "sample/kmp/module2-js/0.0.1/module2-js-0.0.1-sources.jar.sha1", @@ -169,6 +181,8 @@ tasks.register("checkZip") { "sample/kmp/module2-js/0.0.1/module2-js-0.0.1.pom.sha1", "sample/kmp/module2-js/0.0.1/module2-js-0.0.1.pom.sha256", "sample/kmp/module2-js/0.0.1/module2-js-0.0.1.pom.sha512", + "sample/kmp/module2-jvm/", + "sample/kmp/module2-jvm/0.0.1/", "sample/kmp/module2-jvm/0.0.1/module2-jvm-0.0.1-sources.jar", "sample/kmp/module2-jvm/0.0.1/module2-jvm-0.0.1-sources.jar.md5", "sample/kmp/module2-jvm/0.0.1/module2-jvm-0.0.1-sources.jar.sha1", @@ -189,6 +203,8 @@ tasks.register("checkZip") { "sample/kmp/module2-jvm/0.0.1/module2-jvm-0.0.1.pom.sha1", "sample/kmp/module2-jvm/0.0.1/module2-jvm-0.0.1.pom.sha256", "sample/kmp/module2-jvm/0.0.1/module2-jvm-0.0.1.pom.sha512", + "sample/kmp/module2-linuxarm64/", + "sample/kmp/module2-linuxarm64/0.0.1/", "sample/kmp/module2-linuxarm64/0.0.1/module2-linuxarm64-0.0.1-sources.jar", "sample/kmp/module2-linuxarm64/0.0.1/module2-linuxarm64-0.0.1-sources.jar.md5", "sample/kmp/module2-linuxarm64/0.0.1/module2-linuxarm64-0.0.1-sources.jar.sha1", @@ -209,6 +225,8 @@ tasks.register("checkZip") { "sample/kmp/module2-linuxarm64/0.0.1/module2-linuxarm64-0.0.1.pom.sha1", "sample/kmp/module2-linuxarm64/0.0.1/module2-linuxarm64-0.0.1.pom.sha256", "sample/kmp/module2-linuxarm64/0.0.1/module2-linuxarm64-0.0.1.pom.sha512", + "sample/kmp/module2/", + "sample/kmp/module2/0.0.1/", "sample/kmp/module2/0.0.1/module2-0.0.1-kotlin-tooling-metadata.json", "sample/kmp/module2/0.0.1/module2-0.0.1-kotlin-tooling-metadata.json.md5", "sample/kmp/module2/0.0.1/module2-0.0.1-kotlin-tooling-metadata.json.sha1",