Skip to content

Commit 4280e8c

Browse files
committed
Add a consistency check task for defined versions
1 parent 02cf019 commit 4280e8c

File tree

3 files changed

+68
-2
lines changed

3 files changed

+68
-2
lines changed

gradle/plugins/src/main/kotlin/org.example.gradle.feature.use-all-catalog-versions.gradle.kts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
plugins { id("org.gradle.java-platform") }
1+
import org.example.gradle.tasks.JavaVersionConsistencyCheck
2+
3+
plugins {
4+
id("org.gradle.java-platform")
5+
id("org.example.gradle.base.lifecycle")
6+
}
27

38
// Allow upgrading (transitive) versions via catalog by adding constraints
49
dependencies.constraints {
@@ -11,3 +16,15 @@ dependencies.constraints {
1116
}
1217
}
1318
}
19+
20+
tasks.register<JavaVersionConsistencyCheck>("checkVersionConsistency") {
21+
definedVersions = provider {
22+
configurations["api"].dependencyConstraints.associate { "${it.group}:${it.name}" to it.version!! }
23+
}
24+
aggregatedClasspath = provider { configurations["mainRuntimeClasspath"].incoming.resolutionResult.allComponents }
25+
reportFile = layout.buildDirectory.file("reports/version-consistency.txt")
26+
}
27+
28+
tasks.named("qualityCheck") { dependsOn(tasks.named("checkVersionConsistency")) }
29+
30+
tasks.named("qualityGate") { dependsOn(tasks.named("checkVersionConsistency")) }
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.example.gradle.tasks
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.artifacts.component.ModuleComponentIdentifier
5+
import org.gradle.api.artifacts.result.ResolvedComponentResult
6+
import org.gradle.api.file.RegularFileProperty
7+
import org.gradle.api.provider.MapProperty
8+
import org.gradle.api.provider.SetProperty
9+
import org.gradle.api.tasks.Input
10+
import org.gradle.api.tasks.OutputFile
11+
import org.gradle.api.tasks.TaskAction
12+
13+
abstract class JavaVersionConsistencyCheck : DefaultTask() {
14+
15+
@get:Input abstract val definedVersions: MapProperty<String, String>
16+
17+
@get:Input abstract val aggregatedClasspath: SetProperty<ResolvedComponentResult>
18+
19+
@get:OutputFile abstract val reportFile: RegularFileProperty
20+
21+
@TaskAction
22+
fun compare() {
23+
var potentiallyUnusedVersion = ""
24+
var wrongVersions = ""
25+
definedVersions.get().forEach { (id, version) ->
26+
val resolved =
27+
aggregatedClasspath.get().find {
28+
val resolvedId = it.id
29+
resolvedId is ModuleComponentIdentifier && resolvedId.moduleIdentifier.toString() == id
30+
}
31+
if (resolved == null) {
32+
potentiallyUnusedVersion += "Not used in production code: $id:$version\n"
33+
} else {
34+
val resolvedVersion = resolved.moduleVersion?.version
35+
if (resolvedVersion != version) {
36+
wrongVersions += "Wrong version: $id (declared=$version; used=$resolvedVersion)\n"
37+
}
38+
}
39+
}
40+
41+
reportFile.get().asFile.writeText(potentiallyUnusedVersion + wrongVersions)
42+
43+
if (!potentiallyUnusedVersion.isEmpty()) {
44+
println(potentiallyUnusedVersion)
45+
}
46+
if (!wrongVersions.isEmpty()) {
47+
throw RuntimeException(wrongVersions)
48+
}
49+
}
50+
}

gradle/versions/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
plugins {
22
id("org.example.gradle.base.dependency-rules")
3-
id("org.example.gradle.base.lifecycle")
43
id("org.example.gradle.feature.use-all-catalog-versions")
54
id("org.example.gradle.check.format-gradle")
65
}

0 commit comments

Comments
 (0)