Skip to content

Commit e62a794

Browse files
committed
Make own build logic work with configuration cache
1 parent 9a1d70e commit e62a794

File tree

10 files changed

+128
-77
lines changed

10 files changed

+128
-77
lines changed

build.gradle.kts

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
tasks.register("check") {
2-
group = LifecycleBasePlugin.VERIFICATION_GROUP
3-
dependsOn(gradle.includedBuild("documentation").task(":checkAndUpdate"))
4-
dependsOn(gradle.includedBuild("plugin").task(":check"))
1+
plugins {
2+
id("gradlexbuild.java-ecosystem-capabilities-documentation")
3+
}
4+
5+
tasks.check {
6+
dependsOn(gradle.includedBuild("plugin").task(":checkAllVersions"))
57
}

documentation/build.gradle.kts

+4-71
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,8 @@
11
plugins {
2-
id("de.jjohannes.java-ecosystem-capabilities")
2+
`kotlin-dsl`
33
}
44

5-
buildscript {
6-
dependencies {
7-
classpath("org.reflections:reflections:0.10.2")
8-
}
9-
}
10-
11-
fun String.asRepoLink() = "[$this](https://mvnrepository.com/artifact/${replace(":", "/")})"
12-
13-
val updateReadme = tasks.register("updateReadme") {
14-
doLast {
15-
val readme = layout.projectDirectory.file("../README.MD").asFile
16-
17-
val reflections = org.reflections.Reflections("de.jjohannes.gradle.javaecosystem.capabilities.rules")
18-
val allClasses = reflections.getSubTypesOf(ComponentMetadataRule::class.java)
19-
val allCapabilities = allClasses.map { ruleClass ->
20-
val capabilityGroup = ruleClass.getDeclaredField("CAPABILITY_GROUP").get(null) as String
21-
var capability = "";
22-
ruleClass.declaredFields.filter { it.name.startsWith("CAPABILITY_NAME") }.forEach { field ->
23-
if (capability.isNotEmpty()) {
24-
capability += " / "
25-
}
26-
val capabilityName = field.get(null) as String
27-
capability += "$capabilityGroup:${capabilityName}".asRepoLink()
28-
}
29-
capability += " ([${ruleClass.simpleName}](plugin/src/main/java/de/jjohannes/gradle/javaecosystem/capabilities/rules/${ruleClass.simpleName}.java))"
30-
31-
val modules = ruleClass.getDeclaredField("MODULES").get(null) as Array<*>
32-
Pair(capability, modules)
33-
}.sortedBy { it.first }
34-
35-
val capabilityList = allCapabilities.joinToString("") { c ->
36-
"* ${c.first}\n${c.second.joinToString("") { " * ${(it as String).asRepoLink()}\n" }}"
37-
}
38-
39-
readme.writeText(
40-
readme.readText().replace(
41-
Regex("<!-- START_GENERATED -->(.*\\n)+<!-- END_GENERATED -->"),
42-
"<!-- START_GENERATED -->\n$capabilityList\n<!-- END_GENERATED -->"
43-
)
44-
)
45-
}
46-
}
47-
48-
val checkAllSample = tasks.register("checkAllSample") {
49-
doLast {
50-
val buildFile = layout.projectDirectory.file("../samples/sample-all/build.gradle.kts").asFile.readText()
51-
52-
val reflections = org.reflections.Reflections("de.jjohannes.gradle.javaecosystem.capabilities.rules")
53-
val allClasses = reflections.getSubTypesOf(ComponentMetadataRule::class.java)
54-
55-
val missing = allClasses.map { ruleClass ->
56-
val capabilityGroup = ruleClass.getDeclaredField("CAPABILITY_GROUP").get(null)
57-
val capabilityName = ruleClass.getDeclaredField("CAPABILITY_NAME").get(null)
58-
val capability = ruleClass.getDeclaredField("CAPABILITY").get(null)
59-
if (capability != "$capabilityGroup:$capabilityName") {
60-
throw RuntimeException("Inconsistent fields in ${ruleClass.simpleName}: $capabilityGroup:$capabilityName | $capability")
61-
}
62-
((ruleClass.getDeclaredField("MODULES").get(null) as Array<*>).toList() + capability).filter {
63-
module -> !buildFile.contains(module as String) }
64-
}.flatten()
65-
66-
if (missing.isNotEmpty()) {
67-
throw RuntimeException(missing.joinToString("\n") { "implementation(\"$it:+\")" })
68-
}
69-
}
70-
}
71-
72-
tasks.register("checkAndUpdate") {
73-
dependsOn(updateReadme)
74-
dependsOn(checkAllSample)
5+
dependencies {
6+
implementation("de.jjohannes.gradle:java-ecosystem-capabilities")
7+
implementation("org.reflections:reflections:0.10.2")
758
}

documentation/settings.gradle.kts

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
pluginManagement {
22
includeBuild("../plugin")
33
}
4+
dependencyResolutionManagement {
5+
repositories.gradlePluginPortal()
6+
}
47

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import gradlexbuild.javaecosystem.capabilities.documentation.ReadmeUpdate
2+
import gradlexbuild.javaecosystem.capabilities.documentation.SamplesCompletenessCheck
3+
4+
plugins {
5+
id("base")
6+
}
7+
8+
val updateReadme = tasks.register<ReadmeUpdate>("updateReadme") {
9+
readme.set(layout.projectDirectory.file("README.MD"))
10+
}
11+
12+
val checkAllSample = tasks.register<SamplesCompletenessCheck>("checkSamplesForCompleteness") {
13+
samplesBuildFiles.from(layout.projectDirectory.file("samples/sample-all/build.gradle.kts"))
14+
samplesBuildFiles.from(layout.projectDirectory.file("samples/sample-all-deactivated/build.gradle.kts"))
15+
}
16+
17+
tasks.check {
18+
dependsOn(updateReadme)
19+
dependsOn(checkAllSample)
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package gradlexbuild.javaecosystem.capabilities.documentation
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.artifacts.ComponentMetadataRule
5+
import org.gradle.api.file.RegularFileProperty
6+
import org.gradle.api.tasks.InputFile
7+
import org.gradle.api.tasks.TaskAction
8+
9+
abstract class ReadmeUpdate : DefaultTask() {
10+
11+
@get:InputFile
12+
abstract val readme: RegularFileProperty
13+
14+
@TaskAction
15+
fun update() {
16+
val reflections = org.reflections.Reflections("de.jjohannes.gradle.javaecosystem.capabilities.rules")
17+
val allClasses = reflections.getSubTypesOf(ComponentMetadataRule::class.java)
18+
val allCapabilities = allClasses.map { ruleClass ->
19+
val capabilityGroup = ruleClass.getDeclaredField("CAPABILITY_GROUP").get(null) as String
20+
var capability = "";
21+
ruleClass.declaredFields.filter { it.name.startsWith("CAPABILITY_NAME") }.forEach { field ->
22+
if (capability.isNotEmpty()) {
23+
capability += " / "
24+
}
25+
val capabilityName = field.get(null) as String
26+
capability += "$capabilityGroup:${capabilityName}".asRepoLink()
27+
}
28+
capability += " ([${ruleClass.simpleName}](plugin/src/main/java/de/jjohannes/gradle/javaecosystem/capabilities/rules/${ruleClass.simpleName}.java))"
29+
30+
val modules = ruleClass.getDeclaredField("MODULES").get(null) as Array<*>
31+
Pair(capability, modules)
32+
}.sortedBy { it.first }
33+
34+
val capabilityList = allCapabilities.joinToString("") { c ->
35+
"* ${c.first}\n${c.second.joinToString("") { " * ${(it as String).asRepoLink()}\n" }}"
36+
}
37+
38+
val readmeFile = readme.get().asFile
39+
readmeFile.writeText(
40+
readmeFile.readText().replace(
41+
Regex("<!-- START_GENERATED -->(.*\\n)+<!-- END_GENERATED -->"),
42+
"<!-- START_GENERATED -->\n$capabilityList\n<!-- END_GENERATED -->"
43+
)
44+
)
45+
}
46+
47+
private fun String.asRepoLink() = "[$this](https://mvnrepository.com/artifact/${replace(":", "/")})"
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package gradlexbuild.javaecosystem.capabilities.documentation
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.artifacts.ComponentMetadataRule
5+
import org.gradle.api.file.ConfigurableFileCollection
6+
import org.gradle.api.tasks.InputFiles
7+
import org.gradle.api.tasks.TaskAction
8+
9+
abstract class SamplesCompletenessCheck : DefaultTask() {
10+
11+
@get:InputFiles
12+
abstract val samplesBuildFiles: ConfigurableFileCollection
13+
14+
@TaskAction
15+
fun check() {
16+
samplesBuildFiles.files.forEach { buildFile ->
17+
val reflections = org.reflections.Reflections("de.jjohannes.gradle.javaecosystem.capabilities.rules")
18+
val allClasses = reflections.getSubTypesOf(ComponentMetadataRule::class.java)
19+
20+
val missing = allClasses.map { ruleClass ->
21+
val capabilityGroup = ruleClass.getDeclaredField("CAPABILITY_GROUP").get(null)
22+
val capabilityName = ruleClass.getDeclaredField("CAPABILITY_NAME").get(null)
23+
val capability = ruleClass.getDeclaredField("CAPABILITY").get(null)
24+
if (capability != "$capabilityGroup:$capabilityName") {
25+
throw RuntimeException("Inconsistent fields in ${ruleClass.simpleName}: $capabilityGroup:$capabilityName | $capability")
26+
}
27+
((ruleClass.getDeclaredField("MODULES").get(null) as Array<*>).toList() + capability).filter {
28+
module -> !buildFile.readText().contains(module as String) }
29+
}.flatten()
30+
31+
if (missing.isNotEmpty()) {
32+
throw RuntimeException("Missing in " + buildFile.path + ":\n" + missing.joinToString("\n") { "implementation(\"$it:+\")" })
33+
}
34+
}
35+
}
36+
}

gradle.properties

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
org.gradle.parallel=true
2-
org.gradle.caching=true
2+
org.gradle.caching=true
3+
org.gradle.unsafe.configuration-cache=true

plugin/build.gradle.kts

+5-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ tasks.test {
4343
inputs.dir(layout.projectDirectory.dir("../samples"))
4444
}
4545

46+
val checkAllVersions = tasks.register("checkAllVersions") {
47+
dependsOn(tasks.check)
48+
}
49+
4650
listOf("6.0.1", "6.4.1", "6.9.3", "7.0.2", "7.1.1", "7.2", "7.3.3", "7.4.2", "7.5.1").forEach { gradleVersionUnderTest ->
4751
val testGradle = tasks.register<Test>("testGradle$gradleVersionUnderTest") {
4852
group = "verification"
@@ -57,7 +61,7 @@ listOf("6.0.1", "6.4.1", "6.9.3", "7.0.2", "7.1.1", "7.2", "7.3.3", "7.4.2", "7.
5761

5862
exclude("**/*SamplesTest.class") // Not yet cross-version ready
5963
}
60-
tasks.check {
64+
checkAllVersions {
6165
dependsOn(testGradle)
6266
}
6367
}

samples/sample-all-deactivated/build.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ dependencies {
1212
implementation("c3p0:c3p0:0.9.1.2")
1313
implementation("cglib:cglib-nodep:3.2.12")
1414
implementation("cglib:cglib:3.3.0")
15+
implementation("com.google.collections:google-collections:1.0")
1516
implementation("com.google.guava:guava-jdk5:17.0")
1617
implementation("com.google.guava:guava:31.1-jre")
18+
implementation("com.google.guava:listenablefuture:1.0")
1719
implementation("com.mchange:c3p0:0.9.5.5")
1820
implementation("com.sun.activation:javax.activation:1.2.0")
1921
implementation("com.sun.mail:jakarta.mail:2.0.1")

samples/sample-all-deactivated/build.out

+2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ compileClasspath - Compile classpath for source set 'main'.
77
+--- c3p0:c3p0:0.9.1.2 FAILED
88
+--- cglib:cglib-nodep:3.2.12 FAILED
99
+--- cglib:cglib:3.3.0 FAILED
10+
+--- com.google.collections:google-collections:1.0 FAILED
1011
+--- com.google.guava:guava-jdk5:17.0 FAILED
1112
+--- com.google.guava:guava:31.1-jre FAILED
13+
+--- com.google.guava:listenablefuture:1.0 FAILED
1214
+--- com.mchange:c3p0:0.9.5.5 FAILED
1315
+--- com.sun.activation:javax.activation:1.2.0 FAILED
1416
+--- com.sun.mail:jakarta.mail:2.0.1 FAILED

0 commit comments

Comments
 (0)