Skip to content

Commit 03c8c9f

Browse files
committed
Add a task that checks for dependency version upgrades
1 parent a0a15d5 commit 03c8c9f

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

gradle/plugins/src/main/kotlin/org.example.gradle.check.dependency-versions.gradle.kts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import org.example.gradle.tasks.DependencyVersionUpgradesCheck
12
import org.example.gradle.tasks.JavaVersionConsistencyCheck
23

34
plugins { id("java-platform") }
@@ -14,3 +15,32 @@ tasks.register<JavaVersionConsistencyCheck>("checkVersionConsistency") {
1415
tasks.named("qualityCheck") { dependsOn(tasks.named("checkVersionConsistency")) }
1516

1617
tasks.named("qualityGate") { dependsOn(tasks.named("checkVersionConsistency")) }
18+
19+
val latestReleases =
20+
configurations.dependencyScope("dependencyVersionUpgrades") {
21+
withDependencies {
22+
add(project.dependencies.platform(project(project.path)))
23+
configurations.api.get().dependencies.forEach {
24+
add(project.dependencies.platform("${it.group}:${it.name}:latest.release") { isTransitive = false })
25+
}
26+
configurations.api.get().dependencyConstraints.forEach {
27+
add(project.dependencies.create("${it.group}:${it.name}:latest.release") { isTransitive = false })
28+
}
29+
}
30+
}
31+
val latestReleasesPath =
32+
configurations.resolvable("latestReleasesPath") {
33+
attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
34+
attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY))
35+
extendsFrom(latestReleases.get())
36+
}
37+
38+
tasks.register<DependencyVersionUpgradesCheck>("checkForDependencyVersionUpgrades") {
39+
group = HelpTasksPlugin.HELP_GROUP
40+
projectName.set(project.name)
41+
dependencies.set(configurations.api.get().dependencies.map { "${it.group}:${it.name}:${it.version}" })
42+
dependencyConstraints.set(
43+
configurations.api.get().dependencyConstraints.map { "${it.group}:${it.name}:${it.version}" }
44+
)
45+
latestReleasesResolutionResult.set(latestReleasesPath.map { it.incoming.resolutionResult.allComponents })
46+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package org.example.gradle.tasks
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.artifacts.result.ResolvedComponentResult
5+
import org.gradle.api.provider.Property
6+
import org.gradle.api.provider.SetProperty
7+
import org.gradle.api.tasks.Internal
8+
import org.gradle.api.tasks.TaskAction
9+
10+
/** Checks if new versions are available for what is declared in the platform. */
11+
abstract class DependencyVersionUpgradesCheck : DefaultTask() {
12+
13+
@get:Internal abstract val projectName: Property<String>
14+
15+
@get:Internal abstract val dependencies: SetProperty<String>
16+
17+
@get:Internal abstract val dependencyConstraints: SetProperty<String>
18+
19+
@get:Internal abstract val latestReleasesResolutionResult: SetProperty<ResolvedComponentResult>
20+
21+
@TaskAction
22+
fun check() {
23+
val platformDependencyUpgrades =
24+
dependencies.get().filter { declared -> declared.resolvedVersion() != declared.version() }
25+
val constraintUpgrades =
26+
dependencyConstraints.get().filter { declared -> declared.resolvedVersion() != declared.version() }
27+
if (platformDependencyUpgrades.isNotEmpty() || constraintUpgrades.isNotEmpty()) {
28+
println(
29+
"""
30+
Upgrade the following dependency versions in 'gradle/versions/build.gradle.kts' (dependencies {} block):
31+
32+
${platformDependencyUpgrades.joinToString("\n ") { "api(platform(\"${it.ga()}:${it.resolvedVersion()}\"))" }}
33+
34+
Upgrade the following dependency versions in 'gradle/versions/build.gradle.kts' (dependencies.constraints {} block):
35+
36+
${constraintUpgrades.joinToString("\n ") { "api(\"${it.ga()}:${it.resolvedVersion()}\")" }}
37+
38+
If we cannot perform an upgrade, please add a '{ version { reject("...") } }' statement and a comment
39+
for the versions we cannot support at the moment.
40+
"""
41+
.trimIndent()
42+
)
43+
}
44+
}
45+
46+
private fun String.ga() = substring(0, lastIndexOf(":"))
47+
48+
private fun String.version() = substring(lastIndexOf(":") + 1)
49+
50+
private fun String.resolvedVersion() =
51+
latestReleasesResolutionResult
52+
.get()
53+
.find { it.moduleVersion!!.module.toString() == ga() }
54+
?.moduleVersion
55+
?.version ?: version() // if no fitting version could be determined, return the declared one
56+
}

0 commit comments

Comments
 (0)