Skip to content

Commit 2ee29c3

Browse files
committed
add support for multiple repositories in publishing definition
1 parent 8b2f634 commit 2ee29c3

File tree

3 files changed

+92
-11
lines changed

3 files changed

+92
-11
lines changed

src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionTask.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dev.poolside.gradle.semanticversion
22

33
import org.gradle.api.DefaultTask
44
import org.gradle.api.internal.artifacts.DependencyManagementServices
5+
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.Version
56
import org.gradle.api.internal.artifacts.repositories.ResolutionAwareRepository
67
import org.gradle.api.publish.PublishingExtension
78
import org.gradle.api.publish.maven.MavenPublication
@@ -37,17 +38,21 @@ abstract class SemanticVersionTask : DefaultTask() {
3738
}
3839

3940
private fun automatic() {
40-
extension.repositories.forEach {
41-
if (it is ResolutionAwareRepository) {
42-
val resolver = it.createResolver()
43-
extension.publications.forEach { publication ->
44-
val pub = publication as MavenPublication
45-
checkVersion(pub.version)
46-
val (key, version) = VersionFinder.findVersion(logger, dependencyService, resolver, pub)
47-
pub.version = version
48-
versions[key] = version
41+
extension.publications.forEach { publication ->
42+
val pub = publication as MavenPublication
43+
checkVersion(pub.version)
44+
val fetchedVersions = mutableListOf<Version>()
45+
extension.repositories.forEach {
46+
if (it is ResolutionAwareRepository) {
47+
val resolver = it.createResolver()
48+
val version = VersionFinder.findVersion(logger, dependencyService, resolver, pub)
49+
fetchedVersions.add(version)
4950
}
5051
}
52+
val max = VersionFinder.findMaxVersion(fetchedVersions)
53+
val key = "${pub.groupId}:${pub.artifactId}"
54+
pub.version = max.toString()
55+
versions[key] = max.toString()
5156
}
5257
extension.publications.forEach { publication ->
5358
val pub = publication as MavenPublication

src/main/kotlin/dev/poolside/gradle/semanticversion/VersionFinder.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ object VersionFinder {
1818
private val versionParser = VersionParser()
1919
private val versionComparator = DefaultVersionComparator().asVersionComparator()
2020

21-
fun findVersion(logger: Logger, dependencyService: DependencyManagementServices, resolver: ConfiguredModuleComponentRepository, publication: MavenPublication): Pair<String, String> {
21+
fun findVersion(logger: Logger, dependencyService: DependencyManagementServices, resolver: ConfiguredModuleComponentRepository, publication: MavenPublication): Version {
2222
val versions = listVersions(logger, dependencyService, resolver, publication, "${publication.version}+")
2323
var latestVersion: Version? = null
2424
versions.map { version -> versionParser.transform(version) }.forEach { version ->
@@ -36,7 +36,7 @@ object VersionFinder {
3636
logger.lifecycle("Resolved published version of '${publication.groupId}:${publication.artifactId}:${publication.version}' to '$newVersion'")
3737
newVersion
3838
}
39-
return "${publication.groupId}:${publication.artifactId}" to version
39+
return VersionParser().transform(version)
4040
}
4141

4242
fun versionExists(logger: Logger, dependencyService: DependencyManagementServices, resolver: ConfiguredModuleComponentRepository, publication: MavenPublication): Boolean {
@@ -74,4 +74,14 @@ object VersionFinder {
7474
val last = parts.last() + 1
7575
return parts.dropLast(1).joinToString(".") + ".$last"
7676
}
77+
78+
fun findMaxVersion(versions: List<Version>): Version {
79+
var max = versions[0]
80+
for (version in versions) {
81+
if (versionComparator.compare(version, max) > 0) {
82+
max = version
83+
}
84+
}
85+
return max
86+
}
7787
}

src/test/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPluginTest.kt

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class SemanticVersionPluginTest {
3333
lateinit var testProjectDir: File
3434
@TempDir
3535
lateinit var mavenRepo: File
36+
@TempDir
37+
lateinit var secondMavenRepo: File
3638

3739
@ParameterizedTest(name = "{index} gradle version {0}")
3840
@MethodSource("gradleVersions")
@@ -97,6 +99,70 @@ class SemanticVersionPluginTest {
9799
assertEquals("0.1.1", pom.version)
98100
}
99101

102+
@ParameterizedTest(name = "{index} gradle version {0}")
103+
@MethodSource("gradleVersions")
104+
fun `project version set correctly with two repos`(gradleVersion: String) {
105+
val build = """
106+
plugins {
107+
java
108+
`maven-publish`
109+
id("dev.poolside.gradle.semantic-version")
110+
}
111+
repositories {
112+
maven { url = uri("${mavenRepo.absolutePath}") }
113+
}
114+
group = "dev.poolside.test"
115+
version = "0.1"
116+
publishing {
117+
repositories {
118+
maven { url = uri("${mavenRepo.absolutePath}") }
119+
maven { url = uri("${secondMavenRepo.absolutePath}") }
120+
}
121+
publications {
122+
create<MavenPublication>("mavenJava") {
123+
artifactId = "my-library"
124+
from(components["java"])
125+
}
126+
}
127+
}
128+
""".trimIndent()
129+
val settings = """rootProject.name = "testing""""
130+
File(testProjectDir, "build.gradle.kts").writeText(build)
131+
File(testProjectDir, "settings.gradle.kts").writeText(settings)
132+
GradleRunner.create()
133+
.withPluginClasspath()
134+
.withProjectDir(testProjectDir)
135+
.withGradleVersion(gradleVersion)
136+
.withArguments("publish")
137+
// .withDebug(true)
138+
.build()
139+
var pomFile = testProjectDir.walk().filter { it.name.startsWith("pom") }.first()
140+
var pom = PomParser.parse(pomFile.absolutePath)
141+
assertEquals("0.1.0", pom.version)
142+
var jarFile = mavenRepo.walk().filter { it.name.endsWith("my-library-0.1.0.jar") }.first()
143+
assertTrue(jarFile.absolutePath.endsWith("/dev/poolside/test/my-library/0.1.0/my-library-0.1.0.jar"), jarFile.absolutePath)
144+
var publishedPom = mavenRepo.walk().filter { it.name.equals("my-library-0.1.0.pom") }.first()
145+
pom = PomParser.parse(publishedPom.absolutePath)
146+
assertEquals("0.1.0", pom.version)
147+
148+
// should +1
149+
GradleRunner.create()
150+
.withPluginClasspath()
151+
.withProjectDir(testProjectDir)
152+
.withGradleVersion(gradleVersion)
153+
.withArguments("publish")
154+
// .withDebug(true)
155+
.build()
156+
pomFile = testProjectDir.walk().filter { it.name.startsWith("pom") }.last()
157+
pom = PomParser.parse(pomFile.absolutePath)
158+
assertEquals("0.1.1", pom.version)
159+
jarFile = mavenRepo.walk().filter { it.name.endsWith("my-library-0.1.1.jar") }.last()
160+
assertTrue(jarFile.absolutePath.endsWith("/dev/poolside/test/my-library/0.1.1/my-library-0.1.1.jar"), jarFile.absolutePath)
161+
publishedPom = mavenRepo.walk().filter { it.name.equals("my-library-0.1.1.pom") }.last()
162+
pom = PomParser.parse(publishedPom.absolutePath)
163+
assertEquals("0.1.1", pom.version)
164+
}
165+
100166
@ParameterizedTest(name = "{index} gradle version {0}")
101167
@MethodSource("gradleVersions")
102168
fun `minor version bump`(gradleVersion: String) {

0 commit comments

Comments
 (0)