Skip to content

Commit d566c68

Browse files
committed
Try to query version from low level repos to access publication repos instead
1 parent 823d3a8 commit d566c68

4 files changed

Lines changed: 91 additions & 32 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ gradlePlugin {
3232
id = "dev.poolside.gradle.semantic-version"
3333
group = "dev.poolside.gradle.semanticversion"
3434
implementationClass = "dev.poolside.gradle.semanticversion.SemanticVersionPlugin"
35-
version = "0.1.1"
35+
version = "0.1.2"
3636
displayName = "Poolside Semantic Version Plugin"
3737
}
3838
}

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

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package dev.poolside.gradle.semanticversion
22

33
import org.gradle.api.DefaultTask
4+
import org.gradle.api.internal.artifacts.repositories.ResolutionAwareRepository
45
import org.gradle.api.publish.PublishingExtension
56
import org.gradle.api.publish.maven.MavenPublication
67
import org.gradle.api.tasks.TaskAction
7-
import org.gradle.kotlin.dsl.create
88
import org.w3c.dom.Element
9-
import java.util.concurrent.TimeUnit
109

1110
abstract class SemanticVersionTask : DefaultTask() {
1211

@@ -16,14 +15,20 @@ abstract class SemanticVersionTask : DefaultTask() {
1615
@TaskAction
1716
fun setVersion() {
1817
project.allprojects.forEach { p ->
19-
p.extensions.getByType(PublishingExtension::class.java).publications.forEach { publication ->
20-
val pub = publication as MavenPublication
21-
checkVersion(pub.version)
22-
val (key, version) = findVersion(pub)
23-
pub.version = version
24-
versions[key] = version
18+
val extension = p.extensions.getByType(PublishingExtension::class.java)
19+
extension.repositories.forEach {
20+
if (it is ResolutionAwareRepository) {
21+
val resolver = it.createResolver()
22+
extension.publications.forEach { publication ->
23+
val pub = publication as MavenPublication
24+
checkVersion(pub.version)
25+
val (key, version) = VersionFinder.findVersion(logger, project, resolver, pub)
26+
pub.version = version
27+
versions[key] = version
28+
}
29+
}
2530
}
26-
p.extensions.getByType(PublishingExtension::class.java).publications.forEach { publication ->
31+
extension.publications.forEach { publication ->
2732
val pub = publication as MavenPublication
2833
rewrite(pub)
2934
}
@@ -36,28 +41,6 @@ abstract class SemanticVersionTask : DefaultTask() {
3641
}
3742
}
3843

39-
private fun findVersion(publication: MavenPublication): Pair<String, String> {
40-
val dep = project.dependencies.create(group = publication.groupId, name = publication.artifactId, version = "${publication.version}+")
41-
val conf = project.rootProject.configurations.detachedConfiguration(dep)
42-
conf.isTransitive = false
43-
conf.resolutionStrategy.cacheDynamicVersionsFor(0, TimeUnit.SECONDS)
44-
conf.resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS)
45-
val lenientConfiguration = conf.resolvedConfiguration.lenientConfiguration
46-
val version = if (lenientConfiguration.unresolvedModuleDependencies.isEmpty()) {
47-
val resolved = conf.resolvedConfiguration.firstLevelModuleDependencies.first()
48-
val version = resolved.moduleVersion.split(".")
49-
val patch = version[2].toInt()+1
50-
val newVersion = "${version[0]}.${version[1]}.$patch"
51-
logger.lifecycle("Resolved published version of '${resolved.moduleGroup}:${resolved.moduleName}:${resolved.moduleVersion}' to '$newVersion'")
52-
newVersion
53-
} else {
54-
val newVersion = "${publication.version}.0"
55-
logger.lifecycle("No published version of '${publication.groupId}:${publication.artifactId}:${publication.version}' resolved to '$newVersion'")
56-
newVersion
57-
}
58-
return "${publication.groupId}:${publication.artifactId}" to version
59-
}
60-
6144
private fun rewrite(pub: MavenPublication) {
6245
pub.pom.withXml {
6346
val root = this.asElement()
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package dev.poolside.gradle.semanticversion
2+
3+
import org.gradle.api.Project
4+
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ConfiguredModuleComponentRepository
5+
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator
6+
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.Version
7+
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionParser
8+
import org.gradle.api.logging.Logger
9+
import org.gradle.api.publish.maven.MavenPublication
10+
import org.gradle.internal.component.external.model.DefaultModuleComponentSelector
11+
import org.gradle.internal.component.external.model.GradleDependencyMetadata
12+
import org.gradle.internal.resolve.result.DefaultBuildableModuleVersionListingResolveResult
13+
import org.gradle.kotlin.dsl.create
14+
import java.util.Collections
15+
16+
object VersionFinder {
17+
18+
private val versionParser = VersionParser()
19+
private val versionComparator = DefaultVersionComparator().asVersionComparator()
20+
21+
fun findVersion(logger: Logger, project: Project, resolver: ConfiguredModuleComponentRepository, publication: MavenPublication): Pair<String, String> {
22+
val remote = resolver.remoteAccess
23+
val local = resolver.localAccess
24+
25+
val dep = project.dependencies.create(group = publication.groupId, name = publication.artifactId, version = "${publication.version}+")
26+
val selector = DefaultModuleComponentSelector.newSelector(dep.module, dep.versionConstraint)
27+
val metadata = GradleDependencyMetadata(selector, Collections.emptyList(), false, false, null, false, null)
28+
29+
val result = DefaultBuildableModuleVersionListingResolveResult()
30+
remote.listModuleVersions(metadata, result)
31+
local.listModuleVersions(metadata, result)
32+
33+
logger.debug("Resolved versions ${result.versions}")
34+
35+
var latestVersion: Version? = null
36+
result.versions.map { version -> versionParser.transform(version) }.forEach { version ->
37+
if (latestVersion == null || versionComparator.compare(version, latestVersion) > 0) {
38+
latestVersion = version
39+
}
40+
}
41+
42+
val version = if (latestVersion == null) {
43+
val newVersion = "${publication.version}.0"
44+
logger.lifecycle("No published version of '${publication.groupId}:${publication.artifactId}:${publication.version}' resolved to '$newVersion'")
45+
newVersion
46+
} else {
47+
val newVersion = incrementVersion(latestVersion!!)
48+
logger.lifecycle("Resolved published version of '${publication.groupId}:${publication.artifactId}:${publication.version}' to '$newVersion'")
49+
newVersion
50+
}
51+
return "${publication.groupId}:${publication.artifactId}" to version
52+
}
53+
54+
private fun incrementVersion(version: Version): String {
55+
val parts = version.numericParts.filterNotNull()
56+
val last = parts.last() + 1
57+
return parts.dropLast(1).joinToString(".") + ".$last"
58+
}
59+
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package dev.poolside.gradle.semanticversion
22

3+
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator
4+
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.Version
5+
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionParser
36
import org.gradle.testkit.runner.GradleRunner
47
import org.gradle.testkit.runner.TaskOutcome.FAILED
58
import org.gradle.testkit.runner.UnexpectedBuildFailure
@@ -326,4 +329,18 @@ class SemanticVersionPluginTest {
326329
assertTrue(result.output.contains("Invalid version, must be in format ^\\d+\\.\\d+\$"))
327330
assertEquals(FAILED, result.task(":semanticVersion")?.outcome)
328331
}
332+
333+
@Test
334+
fun `version parser`() {
335+
val versionParser = VersionParser()
336+
val versionComparator = DefaultVersionComparator().asVersionComparator()
337+
val versions = listOf("0.1.0", "0.1.1", "0.1.2")
338+
var latestVersion: Version? = null
339+
versions.map { version -> versionParser.transform(version) }.forEach { version ->
340+
if (latestVersion == null || versionComparator.compare(version, latestVersion) > 0) {
341+
latestVersion = version
342+
}
343+
}
344+
assertEquals("0.1.2", latestVersion.toString())
345+
}
329346
}

0 commit comments

Comments
 (0)