Skip to content

Commit 2d9db57

Browse files
committed
feat: make gradle-extensions compatible with configuration cache
1 parent 5180deb commit 2d9db57

File tree

5 files changed

+94
-34
lines changed

5 files changed

+94
-34
lines changed

plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/PrintGitHubActionsMarkersForFailingTasks.kt

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,41 @@
1717
package com.github.vlsi.gradle
1818

1919
import com.github.vlsi.gradle.github.GitHubActionsLogger
20-
import org.gradle.api.Task
21-
import org.gradle.api.execution.TaskExecutionListener
22-
import org.gradle.api.tasks.TaskState
20+
import com.github.vlsi.gradle.styledtext.StyledTextBuilder
21+
import org.gradle.api.provider.Property
22+
import org.gradle.api.services.BuildService
23+
import org.gradle.api.services.BuildServiceParameters
24+
import org.gradle.tooling.events.FinishEvent
25+
import org.gradle.tooling.events.OperationCompletionListener
26+
import org.gradle.tooling.events.task.TaskFailureResult
27+
import org.gradle.tooling.events.task.TaskFinishEvent
2328

24-
object PrintGitHubActionsMarkersForFailingTasks : TaskExecutionListener {
25-
override fun beforeExecute(task: Task) = Unit
29+
abstract class PrintGitHubActionsMarkersForFailingTasksParameters: BuildServiceParameters {
30+
abstract val fullTrace: Property<Boolean>
31+
}
2632

27-
override fun afterExecute(task: Task, state: TaskState) {
28-
state.failure?.let { throwable ->
29-
val sb = task.project.createStyledBuilder().apply {
30-
// GitHub "annotations" do not support coloring
31-
enableStyle = false
32-
}
33-
val printer = task.project.createThrowablePrinter().apply {
33+
abstract class PrintGitHubActionsMarkersForFailingTasks : BuildService<PrintGitHubActionsMarkersForFailingTasksParameters>,
34+
OperationCompletionListener {
35+
override fun onFinish(event: FinishEvent) {
36+
if (event !is TaskFinishEvent) {
37+
return
38+
}
39+
val result = event.result
40+
if (result !is TaskFailureResult) {
41+
return
42+
}
43+
result.failures.forEach { failure ->
44+
// GitHub "annotations" do not support coloring
45+
val sb = StyledTextBuilder(enableStyle = false)
46+
val printer = createThrowablePrinter(fullTrace = parameters.fullTrace.get()).apply {
3447
indent = ""
3548
}
36-
printer.print(throwable, sb)
49+
printer.print(failure, sb)
3750
println(
3851
"""
39-
${GitHubActionsLogger.startGroup("${task.path} failure marker")}
52+
${GitHubActionsLogger.startGroup("${event.descriptor.taskPath} failure marker")}
4053
${GitHubActionsLogger.error(
41-
task.toString(),
54+
event.descriptor.name.toString(),
4255
line = null,
4356
col = null,
4457
message = sb.toString()

plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/ProjectExtensionsPlugin.kt

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,57 @@ package com.github.vlsi.gradle
1818

1919
import com.github.vlsi.gradle.github.GitHubActionsLogger
2020
import com.github.vlsi.gradle.properties.dsl.props
21-
import com.github.vlsi.gradle.styledtext.StyledTextBuilder
2221
import com.github.vlsi.gradle.test.dsl.printTestResults
2322
import org.gradle.api.Plugin
2423
import org.gradle.api.Project
24+
import org.gradle.api.configuration.BuildFeatures
25+
import org.gradle.api.invocation.Gradle
2526
import org.gradle.api.tasks.testing.AbstractTestTask
2627
import org.gradle.api.tasks.testing.logging.TestLogEvent
28+
import org.gradle.build.event.BuildEventsListenerRegistry
29+
import org.gradle.kotlin.dsl.registerIfAbsent
30+
import org.gradle.kotlin.dsl.support.serviceOf
2731
import org.gradle.kotlin.dsl.withType
32+
import org.gradle.util.GradleVersion
2833

2934
class ProjectExtensionsPlugin : Plugin<Project> {
35+
private val Gradle.configurationCacheEnabled: Boolean
36+
get() {
37+
if (GradleVersion.current() >= GradleVersion.version("8.5")) {
38+
return serviceOf<BuildFeatures>().configurationCache.active.get()
39+
}
40+
return try {
41+
startParameter.javaClass.getMethod("isConfigurationCache").invoke(startParameter) as Boolean
42+
} catch (e: Exception) {
43+
false
44+
}
45+
}
46+
3047
override fun apply(target: Project) {
31-
target.gradle.addBuildListener(ReportBuildFailures)
48+
val enableStyle = !target.props.bool(
49+
"nocolor",
50+
default = System.getProperty("os.name").contains("windows", ignoreCase = true)
51+
)
52+
val fullTrace = target.props.bool("fulltrace")
53+
if (!target.gradle.configurationCacheEnabled) {
54+
target.gradle.addBuildListener(
55+
ReportBuildFailures(
56+
enableStyle = enableStyle,
57+
fullTrace = fullTrace
58+
)
59+
)
60+
}
3261
if (GitHubActionsLogger.isEnabled) {
33-
target.gradle.addListener(PrintGitHubActionsMarkersForFailingTasks)
62+
val gitHubMarkers = target.gradle.sharedServices.registerIfAbsent(
63+
"PrintGitHubActionsMarkersForFailingTasks",
64+
PrintGitHubActionsMarkersForFailingTasks::class
65+
) {
66+
parameters {
67+
this.fullTrace.set(fullTrace)
68+
}
69+
}
70+
target.gradle.serviceOf<BuildEventsListenerRegistry>()
71+
.onTaskCompletion(gitHubMarkers)
3472
}
3573
target.tasks.withType<AbstractTestTask>().configureEach {
3674
testLogging {
@@ -45,13 +83,8 @@ class ProjectExtensionsPlugin : Plugin<Project> {
4583
}
4684
}
4785

48-
internal fun Project.createStyledBuilder() = StyledTextBuilder().apply {
49-
enableStyle = !project.props.bool("nocolor",
50-
default = System.getProperty("os.name").contains("windows", ignoreCase = true))
51-
}
52-
53-
internal fun Project.createThrowablePrinter() = ThrowablePrinter().apply {
54-
if (project.props.bool("fulltrace")) {
86+
internal fun createThrowablePrinter(fullTrace: Boolean) = ThrowablePrinter().apply {
87+
if (fullTrace) {
5588
classExcludes.clear()
5689
hideThrowables.clear()
5790
hideStacktraces.clear()

plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/ReportBuildFailures.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,15 @@ import com.github.vlsi.gradle.styledtext.StyledTextBuilder
2222
import org.gradle.BuildAdapter
2323
import org.gradle.BuildResult
2424

25-
object ReportBuildFailures : BuildAdapter() {
25+
class ReportBuildFailures(
26+
val enableStyle: Boolean,
27+
val fullTrace: Boolean,
28+
) : BuildAdapter() {
2629
override fun buildFinished(result: BuildResult) {
2730
val failure = result.failure ?: return
2831
val gradle = result.gradle
29-
val (sb, throwablePrinter) = if (gradle == null) {
30-
StyledTextBuilder() to ThrowablePrinter()
31-
} else {
32-
gradle.rootProject.createStyledBuilder() to
33-
gradle.rootProject.createThrowablePrinter()
34-
}
32+
val sb = StyledTextBuilder(enableStyle = enableStyle)
33+
val throwablePrinter = createThrowablePrinter(fullTrace = fullTrace)
3534
throwablePrinter.indent = " "
3635
sb.appendPlatformLine()
3736
sb.append(result.action).append(" ")

plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/ThrowablePrinter.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.gradle.internal.UncheckedException
2929
import org.gradle.internal.exceptions.LocationAwareException
3030
import org.gradle.internal.exceptions.MultiCauseException
3131
import org.gradle.internal.serialize.PlaceholderException
32+
import org.gradle.tooling.Failure
3233
import java.sql.SQLException
3334
import java.util.*
3435

@@ -170,6 +171,19 @@ class ThrowablePrinter {
170171
val causedBy: List<StackTraceElement>?
171172
)
172173

174+
fun print(failure: Failure, out: Appendable, baseIndent: String = indent): Appendable {
175+
out.append(baseIndent).append(failure.message)
176+
if (failure.causes.isEmpty()) {
177+
return out
178+
}
179+
for (cause in failure.causes) {
180+
out.appendPlatformLine().append(baseIndent).append("Caused by:")
181+
out.appendPlatformLine()
182+
print(cause, out, "$baseIndent ")
183+
}
184+
return out
185+
}
186+
173187
fun print(root: Throwable, out: Appendable, baseIndent: String = indent): Appendable {
174188
val dejaVu = Collections.newSetFromMap<Throwable>(IdentityHashMap())
175189

plugins/gradle-extensions-plugin/src/main/kotlin/com/github/vlsi/gradle/test/dsl/PrintTestResults.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ fun AbstractTestTask.printTestResults(
6464
default = System.getProperty("os.name").contains("windows", ignoreCase = true)),
6565
showStacktrace: Boolean = true
6666
) {
67+
val fullTrace = project.props.bool("fulltrace")
6768
// https://github.com/junit-team/junit5/issues/2041
6869
// Gradle does not print parameterized test names yet :(
6970
// Hopefully it will be fixed in Gradle 6.1
@@ -102,7 +103,7 @@ fun AbstractTestTask.printTestResults(
102103
.withStyle(if (durationMillis >= slowTestLogThreshold) Style.BOLD else UNCHANGED)
103104
sb.append(resultType).append(" ").append(duration)
104105
sb.append(", ").appendTestName(displayName)
105-
val throwablePrinter = project.createThrowablePrinter().apply {
106+
val throwablePrinter = createThrowablePrinter(fullTrace = fullTrace).apply {
106107
indent = " "
107108
test.className?.let { className ->
108109
frameStyles += {
@@ -169,7 +170,7 @@ fun AbstractTestTask.printTestResults(
169170
sb.appendTestName(displayName)
170171
}
171172
if (showStacktrace && result.exceptions.isNotEmpty()) {
172-
val throwablePrinter = project.createThrowablePrinter().apply {
173+
val throwablePrinter = createThrowablePrinter(fullTrace = fullTrace).apply {
173174
indent = " "
174175
}
175176
result.exceptions.forEach {

0 commit comments

Comments
 (0)