@@ -24,6 +24,7 @@ import org.gradle.tooling.GradleConnector
2424import org.gradle.tooling.ProjectConnection
2525import org.gradle.tooling.ResultHandler
2626import org.gradle.tooling.events.OperationType
27+ import org.gradle.tooling.events.task.TaskStartEvent
2728import org.gradle.tooling.internal.consumer.DefaultGradleConnector
2829import java.io.ByteArrayOutputStream
2930import java.io.Closeable
@@ -83,11 +84,11 @@ class KobwebGradle(private val env: ServerEnvironment, projectDir: File) : Close
8384 }
8485
8586 /* *
86- * An optional listener for a progress event .
87+ * An optional listener that is triggered when a Gradle alert fires .
8788 *
88- * Users may want to listen to this and feed the instance into a [GradleAlertBundle] so it can respond to them .
89+ * Users may want to listen to this and feed the alert into [GradleAlertBundle] so it can respond to it .
8990 */
90- var onProgress : (progress : GradleAlert . Progress ) -> Unit = { }
91+ var onAlert : (alert : GradleAlert ) -> Unit = { }
9192
9293 internal val onCompleted: MutableList < (failure: Exception ? ) -> Unit > = mutableListOf ()
9394
@@ -146,11 +147,17 @@ class KobwebGradle(private val env: ServerEnvironment, projectDir: File) : Close
146147 .forTasks(task)
147148 .withArguments(finalArgs)
148149 .withCancellationToken(cancelToken.token())
150+ // Progress listener for events useful to surface during startup
149151 .addProgressListener({ event ->
150152 event.descriptor.displayName.takeIf { it.isNotBlank() }?.let { desc ->
151- handle.onProgress .invoke(GradleAlert .Progress (desc))
153+ handle.onAlert .invoke(GradleAlert .Progress (desc))
152154 }
153155 }, * startupProgressEvents.toTypedArray())
156+ // Progress listener for tasks
157+ .addProgressListener({ event ->
158+ if (event !is TaskStartEvent ) return @addProgressListener
159+ handle.onAlert.invoke(GradleAlert .Task (event.descriptor.taskPath))
160+ }, OperationType .TASK )
154161 .run (object : ResultHandler <Void > {
155162 private fun handleFinished () {
156163 handle.onCompleted.clear()
@@ -223,7 +230,6 @@ private const val GRADLE_ERROR_PREFIX = "e: "
223230private const val GRADLE_WARNING_PREFIX = " w: "
224231private const val GRADLE_WHAT_WENT_WRONG = " * What went wrong:"
225232private const val GRADLE_TRY_PREFIX = " * Try:"
226- private const val GRADLE_TASK_PREFIX = " > Task :"
227233
228234sealed interface GradleAlert {
229235 class Warning (val line : String ) : GradleAlert
@@ -235,15 +241,16 @@ sealed interface GradleAlert {
235241
236242private val WhatWentWrongKey = RunScope .Lifecycle .createKey<StringBuilder >()
237243
244+ /* *
245+ * Given a line to render, render it appropriately and also generate [GradleAlert] events from Gradle output.
246+ */
238247fun RunScope.handleGradleOutput (line : String , isError : Boolean , onGradleEvent : (GradleAlert ) -> Unit ) {
239248 handleConsoleOutput(line, isError)
240249
241250 if (line.startsWith(GRADLE_ERROR_PREFIX )) {
242251 onGradleEvent(GradleAlert .Error (line.removePrefix(GRADLE_ERROR_PREFIX )))
243252 } else if (line.startsWith(GRADLE_WARNING_PREFIX )) {
244253 onGradleEvent(GradleAlert .Warning (line.removePrefix(GRADLE_WARNING_PREFIX )))
245- } else if (line.startsWith(GRADLE_TASK_PREFIX )) {
246- onGradleEvent(GradleAlert .Task (line.removePrefix(GRADLE_TASK_PREFIX ).substringBefore(' ' )))
247254 } else if (line == " Change detected, executing build..." ) {
248255 onGradleEvent(GradleAlert .BuildRestarted )
249256 }
0 commit comments