From 1af59af42116ed0a0c54b498efaec9095db0b7f9 Mon Sep 17 00:00:00 2001 From: Rachel Aurand Date: Wed, 7 Oct 2026 14:34:04 -0700 Subject: [PATCH 1/2] add failing test for pom version error --- .../gradle/semanticversion/PomParser.kt | 10 +++- .../gradle/semanticversion/PomParserTest.kt | 48 +++++++++++++++++++ .../SemanticVersionPluginTest.kt | 4 ++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/test/kotlin/dev/poolside/gradle/semanticversion/PomParserTest.kt diff --git a/src/test/kotlin/dev/poolside/gradle/semanticversion/PomParser.kt b/src/test/kotlin/dev/poolside/gradle/semanticversion/PomParser.kt index 38f0008..2dca205 100644 --- a/src/test/kotlin/dev/poolside/gradle/semanticversion/PomParser.kt +++ b/src/test/kotlin/dev/poolside/gradle/semanticversion/PomParser.kt @@ -2,6 +2,7 @@ package dev.poolside.gradle.semanticversion import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.dataformat.xml.XmlMapper +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.registerKotlinModule import java.io.File @@ -15,4 +16,11 @@ object PomParser { } } -data class Pom(val groupId: String, val artifactId: String, val version: String) +data class Pom(val groupId: String, val artifactId: String, val version: String, val dependencies: Dependencies? = null) + +data class Dependencies( + @field:JacksonXmlElementWrapper(useWrapping = false) + val dependency: List = emptyList() +) + +data class Dependency(val groupId: String, val artifactId: String, val version: String) diff --git a/src/test/kotlin/dev/poolside/gradle/semanticversion/PomParserTest.kt b/src/test/kotlin/dev/poolside/gradle/semanticversion/PomParserTest.kt new file mode 100644 index 0000000..48c0e56 --- /dev/null +++ b/src/test/kotlin/dev/poolside/gradle/semanticversion/PomParserTest.kt @@ -0,0 +1,48 @@ +package dev.poolside.gradle.semanticversion + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.io.TempDir +import java.io.File + +class PomParserTest { + + @TempDir + lateinit var testProjectDir: File + + @Test + fun `parses dependencies`() { + val pomFile = File(testProjectDir, "pom.xml") + pomFile.writeText( + """ + + dev.poolside.test + my-library + 1.0.0 + + + org.apache.commons + commons-math3 + 3.6.1 + + + com.google.guava + guava + 30.1.1-jre + + + + """.trimIndent() + ) + + val pom = PomParser.parse(pomFile.absolutePath) + + assertEquals( + listOf( + Dependency("org.apache.commons", "commons-math3", "3.6.1"), + Dependency("com.google.guava", "guava", "30.1.1-jre") + ), + pom.dependencies?.dependency + ) + } +} diff --git a/src/test/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPluginTest.kt b/src/test/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPluginTest.kt index e1cc60c..0324acb 100644 --- a/src/test/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPluginTest.kt +++ b/src/test/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPluginTest.kt @@ -705,6 +705,10 @@ class SemanticVersionPluginTest { pomFile.forEachLine { println(it) } val pom = PomParser.parse(pomFile.absolutePath) assertEquals("0.1.0", pom.version) + val lib = pom.dependencies?.dependency?.find { it.groupId == "dev.poolside.test" } + if (lib != null) { + assertEquals("0.1.0", lib.version) + } } val valid = mutableListOf( "${mavenRepo.absolutePath}/dev/poolside/test/my-library/0.1.0/my-library-0.1.0.jar", From d29e6641e6a97a183057f807decde5fe4a517a7a Mon Sep 17 00:00:00 2001 From: Rachel Aurand Date: Wed, 7 Oct 2026 15:02:27 -0700 Subject: [PATCH 2/2] add fix to compute the version at the end --- .../gradle/semanticversion/SemanticVersionPlugin.kt | 8 ++++++++ .../gradle/semanticversion/SemanticVersionTask.kt | 12 ++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPlugin.kt b/src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPlugin.kt index de65866..a34c099 100644 --- a/src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPlugin.kt +++ b/src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPlugin.kt @@ -26,5 +26,13 @@ class SemanticVersionPlugin : Plugin { project.tasks.withType { this.dependsOn("semanticVersion") } + project.gradle.projectsEvaluated { + val semanticVersionTasks = project.rootProject.allprojects.flatMap { + it.tasks.withType(SemanticVersionTask::class.java).toList() + } + project.tasks.withType().configureEach { + dependsOn(semanticVersionTasks) + } + } } } diff --git a/src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionTask.kt b/src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionTask.kt index d7969ac..81892a6 100644 --- a/src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionTask.kt +++ b/src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionTask.kt @@ -102,8 +102,8 @@ abstract class SemanticVersionTask : DefaultTask() { val group = dep.getElementsByTagName("groupId").item(0).textContent val artifact = dep.getElementsByTagName("artifactId").item(0).textContent val key = "${group}:${artifact}" - if (versions.containsKey(key)) { - val version = versions[key] + val version = versions[key] ?: publicationVersion(group, artifact) + if (version != null) { dep.getElementsByTagName("version").item(0).textContent = version } } @@ -113,4 +113,12 @@ abstract class SemanticVersionTask : DefaultTask() { } } } + + private fun publicationVersion(groupId: String, artifactId: String): String? = + project.rootProject.allprojects + .asSequence() + .mapNotNull { it.extensions.findByType(PublishingExtension::class.java) } + .flatMap { it.publications.withType(MavenPublication::class.java).asSequence() } + .find { it.groupId == groupId && it.artifactId == artifactId } + ?.version }