From b2bcb5f4fc5315f25370c84120db12e4a97e9792 Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Wed, 31 Dec 2025 13:08:36 +0100 Subject: [PATCH 1/5] Fail if there are duplicate project names --- gradle/libs.versions.toml | 2 +- nmcp/build.gradle.kts | 8 +++++ .../DefaultNmcpAggregationExtension.kt | 11 ++++++ nmcp/src/test/kotlin/DuplicateNameTest.kt | 24 +++++++++++++ .../duplicate-name/build.gradle.kts | 11 ++++++ .../duplicate-name/build.gradle.kts | 14 ++++++++ .../duplicate-name/src/main/kotlin/hello.kt | 1 + .../duplicate-name/settings.gradle.kts | 10 ++++++ scripts/update-repo.main.kts | 34 ++++++++++++------- settings.gradle.kts | 6 ++++ 10 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 nmcp/src/test/kotlin/DuplicateNameTest.kt create mode 100644 nmcp/testProjects/duplicate-name/build.gradle.kts create mode 100644 nmcp/testProjects/duplicate-name/duplicate-name/build.gradle.kts create mode 100644 nmcp/testProjects/duplicate-name/duplicate-name/src/main/kotlin/hello.kt create mode 100644 nmcp/testProjects/duplicate-name/settings.gradle.kts diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b203449..7db61cd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,6 +23,6 @@ kgp = { id = "org.jetbrains.kotlin.jvm", version.ref = "kgp" } serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kgp" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } gratatouille = { id = "com.gradleup.gratatouille", version.ref = "gratatouille-plugin" } -librarian = { id = "com.gradleup.librarian", version = "0.2.2-SNAPSHOT-6898196f1f9759091ae6fa9bbe84154ec28a9331" } +librarian = { id = "com.gradleup.librarian", version = "0.2.2-SNAPSHOT-f89d61cb6d4bd03bb9f48d1c8220262c0d02094c" } nmcp = { id = "com.gradleup.nmcp", version = "1.3.0" } compat = { id = "com.gradleup.tapmoc", version = "0.3.3-SNAPSHOT-a7d9d3fed6e48f1a88966d81e753259dadfa9a9a" } diff --git a/nmcp/build.gradle.kts b/nmcp/build.gradle.kts index 57d29d5..29a8f08 100644 --- a/nmcp/build.gradle.kts +++ b/nmcp/build.gradle.kts @@ -11,11 +11,19 @@ Librarian.module(project) gratatouille { addDependencies = false pluginLocalPublication("com.gradleup.nmcp.settings") + // Remove when https://github.com/GradleUp/nmcp/issues/232 is done. + pluginMarker("com.gradleup.nmcp.aggregation") } dependencies { gratatouille(project(":nmcp-tasks")) compileOnly(libs.gradle.min) implementation(libs.gratatouille.runtime) + testImplementation(libs.kotlin.test) + testImplementation(gradleTestKit()) +} + +tasks.withType(Test::class.java).configureEach { + dependsOn("publishAllPublicationsToTestRepository", ":nmcp-tasks:publishAllPublicationsToTestRepository") } diff --git a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt index 6447d1f..fb81f9a 100644 --- a/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt +++ b/nmcp/src/main/kotlin/nmcp/internal/DefaultNmcpAggregationExtension.kt @@ -48,6 +48,17 @@ internal abstract class DefaultNmcpAggregationExtension(private val project: Pro inputFiles = allFiles, spec = spec, ) + + project.afterEvaluate { + val allNames = mutableSetOf() + project.allprojects { + check (!allNames.contains(it.name.lowercase())) { + "Nmcp: duplicate project name: '${it.name}'. This is usually resolved by setting your root project name in your settings.gradle[.kts] file: `rootProject.name = \"\${someUniqueName}\". " + + "See https://github.com/gradle/gradle/issues/36167 for more details" + } + allNames.add(it.name.lowercase()) + } + } } override fun centralPortal(action: Action) { diff --git a/nmcp/src/test/kotlin/DuplicateNameTest.kt b/nmcp/src/test/kotlin/DuplicateNameTest.kt new file mode 100644 index 0000000..d4111e1 --- /dev/null +++ b/nmcp/src/test/kotlin/DuplicateNameTest.kt @@ -0,0 +1,24 @@ +import java.io.File +import kotlin.test.Test +import org.gradle.testkit.runner.GradleRunner + +class DuplicateNameTest { + @Test + fun duplicateName() { + val dst = File("build/testProject") + val src = File("testProjects/duplicate-name") + + dst.deleteRecursively() + dst.mkdirs() + + src.copyRecursively(dst, overwrite = true) + + val result = GradleRunner.create() + .withProjectDir(dst) + .withArguments("nmcpZipAggregation") + .forwardOutput() + .buildAndFail() + + assert(result.output.contains("duplicate project name")) + } +} diff --git a/nmcp/testProjects/duplicate-name/build.gradle.kts b/nmcp/testProjects/duplicate-name/build.gradle.kts new file mode 100644 index 0000000..e85e012 --- /dev/null +++ b/nmcp/testProjects/duplicate-name/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("org.jetbrains.kotlin.jvm").version("2.3.0").apply(false) + id("com.gradleup.nmcp.aggregation").version("1.4.2-SNAPSHOT") +} + +group = "com.example" +version = "1.0.0" + +dependencies { + nmcpAggregation(project(":duplicate-name")) +} diff --git a/nmcp/testProjects/duplicate-name/duplicate-name/build.gradle.kts b/nmcp/testProjects/duplicate-name/duplicate-name/build.gradle.kts new file mode 100644 index 0000000..af190fe --- /dev/null +++ b/nmcp/testProjects/duplicate-name/duplicate-name/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + id("org.jetbrains.kotlin.jvm") + id("maven-publish") + id("com.gradleup.nmcp") + id("signing") +} + +group = rootProject.group + +publishing { + publications.create("default", MavenPublication::class.java) { + from(components.getByName("java")) + } +} diff --git a/nmcp/testProjects/duplicate-name/duplicate-name/src/main/kotlin/hello.kt b/nmcp/testProjects/duplicate-name/duplicate-name/src/main/kotlin/hello.kt new file mode 100644 index 0000000..5293dab --- /dev/null +++ b/nmcp/testProjects/duplicate-name/duplicate-name/src/main/kotlin/hello.kt @@ -0,0 +1 @@ +val hello = "world" \ No newline at end of file diff --git a/nmcp/testProjects/duplicate-name/settings.gradle.kts b/nmcp/testProjects/duplicate-name/settings.gradle.kts new file mode 100644 index 0000000..d5866f8 --- /dev/null +++ b/nmcp/testProjects/duplicate-name/settings.gradle.kts @@ -0,0 +1,10 @@ +// Change this to fix the build +rootProject.name = "duplicate-name" +pluginManagement { + listOf(repositories, dependencyResolutionManagement.repositories).forEach { + it.mavenCentral() + it.maven("../../../build/m2") + } +} + +include(":duplicate-name") diff --git a/scripts/update-repo.main.kts b/scripts/update-repo.main.kts index 3f272b9..ab5a8dd 100755 --- a/scripts/update-repo.main.kts +++ b/scripts/update-repo.main.kts @@ -5,19 +5,27 @@ @file:Repository("https://storage.googleapis.com/gradleup/m2") @file:Repository("https://jitpack.io") //@file:Repository("file://~/.m2/repository") -@file:DependsOn("com.gradleup.librarian:librarian-cli:0.2.2-SNAPSHOT-0cbca80f60a15a0f851a9cd468bfc352db316dd4") +@file:DependsOn("com.gradleup.librarian:librarian-cli:0.2.2-SNAPSHOT-f89d61cb6d4bd03bb9f48d1c8220262c0d02094c") import com.gradleup.librarian.cli.updateRepo -updateRepo(args) { - file("docs/src/content/docs/index.mdx") { - replacePluginVersion("com.gradleup.nmcp.settings") - replacePluginVersion("com.gradleup.nmcp.aggregation") - replacePluginVersion("com.gradleup.nmcp") - } - file("docs/src/content/docs/manual-configuration.mdx") { - replacePluginVersion("com.gradleup.nmcp.settings") - replacePluginVersion("com.gradleup.nmcp.aggregation") - replacePluginVersion("com.gradleup.nmcp") - } -} +updateRepo( + args, + setVersion = { + file("nmcp/testProjec/duplicate-name/build.gradle.kts") { + replacePluginVersion("com.gradleup.nmcp.aggregation") + } + }, + setDocsVersion = { + file("docs/src/content/docs/index.mdx") { + replacePluginVersion("com.gradleup.nmcp.settings") + replacePluginVersion("com.gradleup.nmcp.aggregation") + replacePluginVersion("com.gradleup.nmcp") + } + file("docs/src/content/docs/manual-configuration.mdx") { + replacePluginVersion("com.gradleup.nmcp.settings") + replacePluginVersion("com.gradleup.nmcp.aggregation") + replacePluginVersion("com.gradleup.nmcp") + } + }, +) diff --git a/settings.gradle.kts b/settings.gradle.kts index 274aaf2..5bacb78 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,6 +19,12 @@ pluginManagement { } } +gradle.lifecycle.afterProject { + extensions.getByType(PublishingExtension::class.java).repositories.maven { + name = "test" + url = uri("file://${rootProject.layout.buildDirectory.get().asFile.resolve("m2").absolutePath}") + } +} rootProject.name = "nmcp-root" include(":nmcp", ":nmcp-tasks") From fae7a62ba8fe03a92bf12dbf938d7b3197b8237d Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Wed, 31 Dec 2025 13:26:01 +0100 Subject: [PATCH 2/5] update tapmoc --- build.gradle.kts | 5 +++++ gradle/libs.versions.toml | 4 ++-- settings.gradle.kts | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 94da387..c809da4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,5 @@ import com.gradleup.librarian.gradle.Librarian +import nmcp.NmcpAggregationExtension plugins { alias(libs.plugins.kgp).apply(false) @@ -37,3 +38,7 @@ tasks.named("librarianStaticContent").configure { } } +extensions.getByType(NmcpAggregationExtension::class.java).localRepository { + this.name = "testi" + this.path = "build/m23" +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7db61cd..1522667 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,5 +24,5 @@ serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } gratatouille = { id = "com.gradleup.gratatouille", version.ref = "gratatouille-plugin" } librarian = { id = "com.gradleup.librarian", version = "0.2.2-SNAPSHOT-f89d61cb6d4bd03bb9f48d1c8220262c0d02094c" } -nmcp = { id = "com.gradleup.nmcp", version = "1.3.0" } -compat = { id = "com.gradleup.tapmoc", version = "0.3.3-SNAPSHOT-a7d9d3fed6e48f1a88966d81e753259dadfa9a9a" } +nmcp = { id = "com.gradleup.nmcp", version = "1.4.2-SNAPSHOT-2f23b4e35da3935092b7c1ea190fb1c57728a7f9" } +compat = { id = "com.gradleup.tapmoc", version = "0.4.1-SNAPSHOT-86d664ab69b813963b91060ecce036be943088ed" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 5bacb78..c5dec58 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,9 +7,10 @@ pluginManagement { mavenCentral() maven("https://storage.googleapis.com/gradleup/m2") { content { - // gratatouille-processor is only used at build time and is safe to fetch as a snapshot + // those dependencies are only used at build time and is safe to fetch as a snapshot includeModule("com.gradleup.gratatouille", "gratatouille-processor") includeModule("com.gradleup.tapmoc", "tapmoc-tasks") + includeModule("com.gradleup.nmcp", "nmcp-tasks") } } } From 0e658df4960b4e1f99166952eb4812ec83ad061c Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Wed, 31 Dec 2025 14:38:34 +0100 Subject: [PATCH 3/5] remove pluginMarker --- build.gradle.kts | 2 +- gradle/libs.versions.toml | 2 +- nmcp/build.gradle.kts | 4 +--- settings.gradle.kts | 6 ------ 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c809da4..4551a54 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,6 +39,6 @@ tasks.named("librarianStaticContent").configure { } extensions.getByType(NmcpAggregationExtension::class.java).localRepository { - this.name = "testi" + this.name = "test" this.path = "build/m23" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1522667..2e3fd6c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,5 +24,5 @@ serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } gratatouille = { id = "com.gradleup.gratatouille", version.ref = "gratatouille-plugin" } librarian = { id = "com.gradleup.librarian", version = "0.2.2-SNAPSHOT-f89d61cb6d4bd03bb9f48d1c8220262c0d02094c" } -nmcp = { id = "com.gradleup.nmcp", version = "1.4.2-SNAPSHOT-2f23b4e35da3935092b7c1ea190fb1c57728a7f9" } +nmcp = { id = "com.gradleup.nmcp", version = "1.4.2-SNAPSHOT-9cc65e0d486a8b82f8b2e3039455eeb24a4bfd6d" } compat = { id = "com.gradleup.tapmoc", version = "0.4.1-SNAPSHOT-86d664ab69b813963b91060ecce036be943088ed" } diff --git a/nmcp/build.gradle.kts b/nmcp/build.gradle.kts index 29a8f08..1e206c8 100644 --- a/nmcp/build.gradle.kts +++ b/nmcp/build.gradle.kts @@ -11,8 +11,6 @@ Librarian.module(project) gratatouille { addDependencies = false pluginLocalPublication("com.gradleup.nmcp.settings") - // Remove when https://github.com/GradleUp/nmcp/issues/232 is done. - pluginMarker("com.gradleup.nmcp.aggregation") } dependencies { @@ -25,5 +23,5 @@ dependencies { } tasks.withType(Test::class.java).configureEach { - dependsOn("publishAllPublicationsToTestRepository", ":nmcp-tasks:publishAllPublicationsToTestRepository") + dependsOn(":nmcpPublishAggregationToTestRepository") } diff --git a/settings.gradle.kts b/settings.gradle.kts index c5dec58..b516df9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,12 +20,6 @@ pluginManagement { } } -gradle.lifecycle.afterProject { - extensions.getByType(PublishingExtension::class.java).repositories.maven { - name = "test" - url = uri("file://${rootProject.layout.buildDirectory.get().asFile.resolve("m2").absolutePath}") - } -} rootProject.name = "nmcp-root" include(":nmcp", ":nmcp-tasks") From 61f9f994e09a8c7669f24d41904adeef73ee428d Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Wed, 31 Dec 2025 14:53:57 +0100 Subject: [PATCH 4/5] Be less strict in what is allowed in the tasks --- gradle/libs.versions.toml | 3 ++- librarian.root.properties | 3 ++- nmcp-tasks/build.gradle.kts | 1 + nmcp/build.gradle.kts | 7 +++++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2e3fd6c..a3c5689 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,6 +3,7 @@ kgp = "2.3.0" ksp = "2.3.4" gratatouille-runtime = "0.2.1" gratatouille-plugin = "0.2.1" +gradle-api = "8.8" [libraries] json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0" @@ -10,7 +11,7 @@ okio = "com.squareup.okio:okio:3.16.4" okhttp = "com.squareup.okhttp3:okhttp:5.3.2" mockwebserver = "com.squareup.okhttp3:mockwebserver:5.3.2" #noinspection NewerVersionAvailable -gradle-min = "dev.gradleplugins:gradle-api:8.8" +gradle-min = { module = "dev.gradleplugins:gradle-api", version.ref = "gradle-api" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test" } xmlutil = "io.github.pdvrieze.xmlutil:serialization:1.0.0-rc1" kgp = { module = "org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin", version.ref = "kgp" } diff --git a/librarian.root.properties b/librarian.root.properties index a66cd70..713a1a9 100644 --- a/librarian.root.properties +++ b/librarian.root.properties @@ -1,5 +1,6 @@ java.compatibility=17 -kotlin.compatibility=1.9.0 +# overridden for the Gradle plugin +kotlin.compatibility=2.2.0 kdoc.olderVersions= kdoc.artifactId=kdoc diff --git a/nmcp-tasks/build.gradle.kts b/nmcp-tasks/build.gradle.kts index b1a6060..50e40f8 100644 --- a/nmcp-tasks/build.gradle.kts +++ b/nmcp-tasks/build.gradle.kts @@ -1,4 +1,5 @@ import com.gradleup.librarian.gradle.Librarian +import tapmoc.TapmocExtension plugins { alias(libs.plugins.kgp) diff --git a/nmcp/build.gradle.kts b/nmcp/build.gradle.kts index 1e206c8..96134ae 100644 --- a/nmcp/build.gradle.kts +++ b/nmcp/build.gradle.kts @@ -1,4 +1,6 @@ import com.gradleup.librarian.gradle.Librarian +import kotlin.jvm.java +import tapmoc.TapmocExtension plugins { alias(libs.plugins.kgp) @@ -7,6 +9,11 @@ plugins { } Librarian.module(project) +extensions.getByType(TapmocExtension::class.java).apply { + // Override the default Kotlin version to work with older Gradle + kotlin("2.1.0") + //kotlin(kotlinVersionForGradle(libs.versions.gradle.api.get().toString())) +} gratatouille { addDependencies = false From 900df8f069fa741ff7f190ff6c8e57a58030194d Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Wed, 31 Dec 2025 15:03:01 +0100 Subject: [PATCH 5/5] fix repo name --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4551a54..15981fa 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,5 +40,5 @@ tasks.named("librarianStaticContent").configure { extensions.getByType(NmcpAggregationExtension::class.java).localRepository { this.name = "test" - this.path = "build/m23" + this.path = "build/m2" }