diff --git a/nmcp/api/nmcp.api b/nmcp/api/nmcp.api index e608830..51b6f43 100644 --- a/nmcp/api/nmcp.api +++ b/nmcp/api/nmcp.api @@ -19,6 +19,7 @@ public abstract class nmcp/LocalRepositoryOptions { public abstract interface class nmcp/NmcpAggregationExtension { public abstract fun centralPortal (Lorg/gradle/api/Action;)V public abstract fun getAllFiles ()Lorg/gradle/api/file/FileCollection; + public abstract fun getAllowEmptyAggregation ()Lorg/gradle/api/provider/Property; public abstract fun localRepository (Lorg/gradle/api/Action;)V public abstract fun publishAllProjectsProbablyBreakingProjectIsolation ()V } diff --git a/nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt b/nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt index a7cef55..dd62364 100644 --- a/nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt +++ b/nmcp/src/main/kotlin/nmcp/NmcpAggregationExtension.kt @@ -2,6 +2,7 @@ package nmcp import org.gradle.api.Action import org.gradle.api.file.FileCollection +import org.gradle.api.provider.Property interface NmcpAggregationExtension { /** @@ -37,4 +38,10 @@ interface NmcpAggregationExtension { * Storage and or AWS S3. */ val allFiles: FileCollection + + /** + * By default, Nmcp errors if the aggregation is empty. + * Set this to true to allow empty aggregations. + */ + val allowEmptyAggregation: Property } diff --git a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt index fb81f9a..eabbb67 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt @@ -14,6 +14,7 @@ import org.gradle.api.artifacts.result.ArtifactResult import org.gradle.api.artifacts.result.ResolvedArtifactResult import org.gradle.api.attributes.Usage import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.provider.Property @GExtension( pluginId = "com.gradleup.nmcp.aggregation", @@ -58,6 +59,12 @@ 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." + } + } } } @@ -90,6 +97,8 @@ internal abstract class DefaultNmcpAggregationExtension(private val project: Pro } } } + + abstract override val allowEmptyAggregation: Property } private fun isCompatible(artifactResult: ArtifactResult): Boolean { diff --git a/nmcp/src/test/kotlin/DuplicateNameTest.kt b/nmcp/src/test/kotlin/MainTest.kt similarity index 51% rename from nmcp/src/test/kotlin/DuplicateNameTest.kt rename to nmcp/src/test/kotlin/MainTest.kt index d4111e1..e71d04e 100644 --- a/nmcp/src/test/kotlin/DuplicateNameTest.kt +++ b/nmcp/src/test/kotlin/MainTest.kt @@ -2,7 +2,7 @@ import java.io.File import kotlin.test.Test import org.gradle.testkit.runner.GradleRunner -class DuplicateNameTest { +class MainTest { @Test fun duplicateName() { val dst = File("build/testProject") @@ -16,9 +16,26 @@ class DuplicateNameTest { val result = GradleRunner.create() .withProjectDir(dst) .withArguments("nmcpZipAggregation") - .forwardOutput() .buildAndFail() assert(result.output.contains("duplicate project name")) } + + @Test + fun emptyAggregation() { + val dst = File("build/testProject") + val src = File("testProjects/empty-aggregation") + + dst.deleteRecursively() + dst.mkdirs() + + src.copyRecursively(dst, overwrite = true) + + val result = GradleRunner.create() + .withProjectDir(dst) + .withArguments("help") + .buildAndFail() + + assert(result.output.contains("Nmcp: the aggregation is empty")) + } } diff --git a/nmcp/testProjects/empty-aggregation/build.gradle.kts b/nmcp/testProjects/empty-aggregation/build.gradle.kts new file mode 100644 index 0000000..6594557 --- /dev/null +++ b/nmcp/testProjects/empty-aggregation/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("com.gradleup.nmcp.aggregation").version("1.4.2-SNAPSHOT") +} diff --git a/nmcp/testProjects/empty-aggregation/settings.gradle.kts b/nmcp/testProjects/empty-aggregation/settings.gradle.kts new file mode 100644 index 0000000..087fd30 --- /dev/null +++ b/nmcp/testProjects/empty-aggregation/settings.gradle.kts @@ -0,0 +1,6 @@ +pluginManagement { + listOf(repositories, dependencyResolutionManagement.repositories).forEach { + it.mavenCentral() + it.maven("../../../build/m2") + } +}