diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8313de4..c0732e7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ ksp = "2.3.4" gratatouille-runtime = "0.2.1" gratatouille-plugin = "0.2.1" gradle-api = "8.8" -nmcp = "1.4.3-SNAPSHOT-90daa7892c17ddc91e613423be6948a7b4b5be65" +nmcp = "1.4.4-SNAPSHOT-dfc48516d359dd9920a19344f1a56d8243d4ae0a" [libraries] json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0" diff --git a/nmcp-tasks/api/nmcp-tasks.api b/nmcp-tasks/api/nmcp-tasks.api index 3dad3a4..78c5c17 100644 --- a/nmcp-tasks/api/nmcp-tasks.api +++ b/nmcp-tasks/api/nmcp-tasks.api @@ -8,14 +8,14 @@ public final class nmcp/internal/task/CleanupDirectoryEntryPoint$Companion { public final fun run (Ljava/lang/String;)V } -public final class nmcp/internal/task/NmcpFindDeploymentNameEntryPoint { - public static final field Companion Lnmcp/internal/task/NmcpFindDeploymentNameEntryPoint$Companion; +public final class nmcp/internal/task/NmcpCheckFilesEntryPoint { + public static final field Companion Lnmcp/internal/task/NmcpCheckFilesEntryPoint$Companion; public fun ()V - public static final fun run (Ljava/util/List;Ljava/io/File;)V + public static final fun run (Ljava/util/List;Ljava/io/File;Z)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/NmcpCheckFilesEntryPoint$Companion { + public final fun run (Ljava/util/List;Ljava/io/File;Z)V } public final class nmcp/internal/task/NmcpPublishFileByFileToFileSystemEntryPoint { diff --git a/nmcp-tasks/src/main/kotlin/nmcp/internal/task/nmcpFindDeploymentName.kt b/nmcp-tasks/src/main/kotlin/nmcp/internal/task/nmcpCheckFiles.kt similarity index 82% rename from nmcp-tasks/src/main/kotlin/nmcp/internal/task/nmcpFindDeploymentName.kt rename to nmcp-tasks/src/main/kotlin/nmcp/internal/task/nmcpCheckFiles.kt index 06d6b33..630d817 100644 --- a/nmcp-tasks/src/main/kotlin/nmcp/internal/task/nmcpFindDeploymentName.kt +++ b/nmcp-tasks/src/main/kotlin/nmcp/internal/task/nmcpCheckFiles.kt @@ -12,9 +12,15 @@ import kotlin.text.endsWith import kotlin.text.substringBeforeLast +/** + * Check the validity of the input files and outputs the name of the deployment + */ @GTask -internal fun nmcpFindDeploymentName(inputFiles: GInputFiles, outputFile: GOutputFile) { - val gavs = inputFiles.mapNotNull { +internal fun nmcpCheckFiles(inputFiles: GInputFiles, outputFile: GOutputFile, allowEmptyFiles: Boolean) { + check(allowEmptyFiles || inputFiles.isNotEmpty()) { + "Nmcp: there are no files to publish. Double check your configuration." + } + val gavs = inputFiles.mapNotNull { if (!it.normalizedPath.endsWith(".pom")) { return@mapNotNull null } diff --git a/nmcp-tasks/src/test/kotlin/FindDeploymentNameTest.kt b/nmcp-tasks/src/test/kotlin/FindDeploymentNameTest.kt index e2ee32b..801268e 100644 --- a/nmcp-tasks/src/test/kotlin/FindDeploymentNameTest.kt +++ b/nmcp-tasks/src/test/kotlin/FindDeploymentNameTest.kt @@ -1,7 +1,7 @@ import gratatouille.tasks.FileWithPath import java.io.File import kotlin.test.assertEquals -import nmcp.internal.task.nmcpFindDeploymentName +import nmcp.internal.task.nmcpCheckFiles import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder @@ -13,9 +13,10 @@ class FindDeploymentNameTest { private fun assertDeploymentName(inputFiles: List, expected: String) { val output = tmp.newFile("output.txt") - nmcpFindDeploymentName( + nmcpCheckFiles( inputFiles = inputFiles.map { FileWithPath(File(it), normalizedPath = it) }, outputFile = output, + allowEmptyFiles = false ) assertEquals(expected, output.readText()) } diff --git a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt index b0e927f..b2130c1 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt @@ -2,7 +2,6 @@ package nmcp.internal import gratatouille.GExtension import gratatouille.capitalizeFirstLetter -import java.io.File import nmcp.CentralPortalOptions import nmcp.NmcpAggregationExtension import nmcp.LocalRepositoryOptions @@ -48,6 +47,7 @@ internal abstract class DefaultNmcpAggregationExtension(private val project: Pro kind = Kind.aggregation, inputFiles = allFiles, spec = spec, + allowEmptyFiles = allowEmptyAggregation ) project.afterEvaluate { @@ -65,12 +65,6 @@ internal abstract class DefaultNmcpAggregationExtension(private val project: Pro allNames.add(it.name.lowercase()) } } - - if (!allowEmptyAggregation.orElse(false).get()) { - check(consumerConfiguration.dependencies.isNotEmpty()) { - "Nmcp: the aggregation is empty. This is usually a misconfiguration. If this is intentional, set `allowEmptyAggregation` to true." - } - } } } diff --git a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt index 8985f7c..c49eb4c 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpExtension.kt @@ -76,7 +76,8 @@ internal abstract class DefaultNmcpExtension(private val project: Project): Nmcp project.registerPublishToCentralPortalTasks( kind = Kind.allPublications, inputFiles = m2Files, - spec = spec + spec = spec, + allowEmptyFiles = project.provider { false } ) } } diff --git a/nmcp/src/main/kotlin/nmcp/internal/utils.kt b/nmcp/src/main/kotlin/nmcp/internal/utils.kt index bd09a5e..e8e9f7c 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/utils.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/utils.kt @@ -3,18 +3,16 @@ package nmcp.internal import gratatouille.capitalizeFirstLetter import java.io.File import nmcp.CentralPortalOptions -import nmcp.internal.task.registerNmcpFindDeploymentNameTask +import nmcp.internal.task.registerNmcpCheckFilesTask import nmcp.internal.task.registerNmcpPublishFileByFileToFileSystemTask import nmcp.internal.task.registerNmcpPublishFileByFileToSnapshotsTask import nmcp.internal.task.registerNmcpPublishWithPublisherApiTask -import org.gradle.api.Action -import org.gradle.api.Named import org.gradle.api.Project -import org.gradle.api.attributes.Attribute 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.provider.Provider import org.gradle.api.publish.plugins.PublishingPlugin.PUBLISH_TASK_GROUP import org.gradle.api.tasks.bundling.Zip @@ -54,6 +52,7 @@ internal fun Project.registerPublishToCentralPortalTasks( kind: Kind, inputFiles: FileCollection, spec: CentralPortalOptions, + allowEmptyFiles: Provider ) { val name = kind.name @@ -61,7 +60,7 @@ internal fun Project.registerPublishToCentralPortalTasks( val snapshotTaskName = "nmcpPublish${name.capitalizeFirstLetter()}ToCentralPortalSnapshots" val localTaskName = "nmcpPublish${name.capitalizeFirstLetter()}ToMavenLocal" val zipTaskName = "nmcpZip${name.capitalizeFirstLetter()}" - val findDeploymentNameTaskName = "nmcpFind${name.capitalizeFirstLetter()}DeploymentName" + val checkFilesTaskName = "nmcpCheck${name.capitalizeFirstLetter()}Files" val description = when(name) { "aggregation" -> "Publishes the aggregation" @@ -72,6 +71,12 @@ internal fun Project.registerPublishToCentralPortalTasks( val deprecatedLifecycleTaskName = "publish${name.capitalizeFirstLetter()}ToCentralPortalSnapshots" val snapshotsLifecycleTaskName = "publish${name.capitalizeFirstLetter()}ToCentralSnapshots" + val checkFilesTaskProvider = registerNmcpCheckFilesTask( + allowEmptyFiles = allowEmptyFiles.orElse(false), + taskName = checkFilesTaskName, + inputFiles = inputFiles, + ) + val zipName = "${name}.zip" val zipTaskProvider = tasks.register(zipTaskName, Zip::class.java) { it.from(inputFiles) @@ -84,18 +89,16 @@ internal fun Project.registerPublishToCentralPortalTasks( it.exclude() } } + it.dependsOn(checkFilesTaskProvider) } - val findDeploymentNameTaskProvider = registerNmcpFindDeploymentNameTask( - taskName = findDeploymentNameTaskName, - inputFiles = inputFiles, - ) + val task = registerNmcpPublishWithPublisherApiTask( taskName = releaseTaskName, inputFile = zipTaskProvider.flatMap { it.archiveFile }, username = spec.username, password = spec.password, - publicationName = spec.publicationName.orElse(findDeploymentNameTaskProvider.flatMap { it.outputFile }.map { it.asFile.readText() }), + publicationName = spec.publicationName.orElse(checkFilesTaskProvider.flatMap { it.outputFile }.map { it.asFile.readText() }), publishingType = spec.publishingType, baseUrl = spec.baseUrl, validationTimeoutSeconds = spec.validationTimeout.map { it.seconds }, diff --git a/nmcp/src/test/kotlin/MainTest.kt b/nmcp/src/test/kotlin/MainTest.kt index 2996ac4..1953a71 100644 --- a/nmcp/src/test/kotlin/MainTest.kt +++ b/nmcp/src/test/kotlin/MainTest.kt @@ -33,9 +33,9 @@ class MainTest { val result = GradleRunner.create() .withProjectDir(dst) - .withArguments("help") + .withArguments("nmcpZipAggregation") .buildAndFail() - assert(result.output.contains("Nmcp: the aggregation is empty")) + assert(result.output.contains("Nmcp: there are no files to publish")) } }