-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVersionFinder.kt
More file actions
87 lines (74 loc) · 4.38 KB
/
VersionFinder.kt
File metadata and controls
87 lines (74 loc) · 4.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package dev.poolside.gradle.semanticversion
import org.gradle.api.internal.artifacts.DependencyManagementServices
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ConfiguredModuleComponentRepository
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.Version
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionParser
import org.gradle.api.internal.initialization.StandaloneDomainObjectContext
import org.gradle.api.logging.Logger
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.internal.component.external.model.DefaultModuleComponentSelector
import org.gradle.internal.component.model.DefaultComponentOverrideMetadata
import org.gradle.internal.resolve.result.DefaultBuildableModuleVersionListingResolveResult
import org.gradle.kotlin.dsl.create
object VersionFinder {
private val versionParser = VersionParser()
private val versionComparator = DefaultVersionComparator().asVersionComparator()
fun findVersion(logger: Logger, dependencyService: DependencyManagementServices, resolver: ConfiguredModuleComponentRepository, publication: MavenPublication): Version {
val versions = listVersions(logger, dependencyService, resolver, publication, "${publication.version}+")
var latestVersion: Version? = null
versions.map { version -> versionParser.transform(version) }.forEach { version ->
if (latestVersion == null || versionComparator.compare(version, latestVersion) > 0) {
latestVersion = version
}
}
val version = if (latestVersion == null) {
val newVersion = "${publication.version}.0"
logger.lifecycle("No published version of '${publication.groupId}:${publication.artifactId}:${publication.version}' resolved to '$newVersion'")
newVersion
} else {
val newVersion = compareAndIncrementVersion(versionParser.transform(publication.version), latestVersion!!)
logger.lifecycle("Resolved published version of '${publication.groupId}:${publication.artifactId}:${publication.version}' to '$newVersion'")
newVersion
}
return VersionParser().transform(version)
}
fun versionExists(logger: Logger, dependencyService: DependencyManagementServices, resolver: ConfiguredModuleComponentRepository, publication: MavenPublication): Boolean {
val versions = listVersions(logger, dependencyService, resolver, publication, publication.version)
return versions.contains(publication.version)
}
private fun listVersions(logger: Logger, dependencyService: DependencyManagementServices, resolver: ConfiguredModuleComponentRepository, publication: MavenPublication, versionSearch: String): Set<String> {
val remote = resolver.remoteAccess
val local = resolver.localAccess
val handler = dependencyService.newDetachedResolver(StandaloneDomainObjectContext.ANONYMOUS).dependencyHandler
val dep = handler.create(group = publication.groupId, name = publication.artifactId, version = versionSearch)
val selector = DefaultModuleComponentSelector.newSelector(dep.module, dep.versionConstraint)
val result = DefaultBuildableModuleVersionListingResolveResult()
remote.listModuleVersions(selector, DefaultComponentOverrideMetadata.EMPTY, result)
local.listModuleVersions(selector, DefaultComponentOverrideMetadata.EMPTY, result)
logger.debug("Resolved versions ${result.versions}")
return result.versions
}
private fun compareAndIncrementVersion(original: Version, found: Version): String {
// major version bump
if (original.numericParts[0] > found.numericParts[0]) {
return original.source + ".0"
}
// minor version bump
if (original.numericParts[1] > found.numericParts[1]) {
return original.source + ".0"
}
val parts = found.numericParts.filterNotNull()
val last = parts.last() + 1
return parts.dropLast(1).joinToString(".") + ".$last"
}
fun findMaxVersion(versions: List<Version>): Version {
var max = versions[0]
for (version in versions) {
if (versionComparator.compare(version, max) > 0) {
max = version
}
}
return max
}
}