Skip to content

Commit 7734f60

Browse files
committed
Use ProgressListener to surface task start events
(instead of parsing Gradle output)
1 parent 2ce91f8 commit 7734f60

4 files changed

Lines changed: 17 additions & 10 deletions

File tree

kobweb/src/main/kotlin/com/varabyte/kobweb/cli/common/GradleUtils.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.gradle.tooling.GradleConnector
2424
import org.gradle.tooling.ProjectConnection
2525
import org.gradle.tooling.ResultHandler
2626
import org.gradle.tooling.events.OperationType
27+
import org.gradle.tooling.events.task.TaskStartEvent
2728
import org.gradle.tooling.internal.consumer.DefaultGradleConnector
2829
import java.io.ByteArrayOutputStream
2930
import 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: "
223230
private const val GRADLE_WARNING_PREFIX = "w: "
224231
private const val GRADLE_WHAT_WENT_WRONG = "* What went wrong:"
225232
private const val GRADLE_TRY_PREFIX = "* Try:"
226-
private const val GRADLE_TASK_PREFIX = "> Task :"
227233

228234
sealed interface GradleAlert {
229235
class Warning(val line: String) : GradleAlert
@@ -235,15 +241,16 @@ sealed interface GradleAlert {
235241

236242
private 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+
*/
238247
fun 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
}

kobweb/src/main/kotlin/com/varabyte/kobweb/cli/export/Export.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ private fun handleExport(
162162
}
163163
val exportProcess = try {
164164
kobwebGradle.export(siteLayout, gradleArgsCommon + gradleArgsExport).apply {
165-
onProgress = { gradleAlertBundle.handleAlert(it) }
165+
onAlert = { gradleAlertBundle.handleAlert(it) }
166166
}
167167
} catch (ex: Exception) {
168168
interruptWithException(ex)

kobweb/src/main/kotlin/com/varabyte/kobweb/cli/run/Run.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ private fun handleRun(
299299
gradleArgsCommon + gradleArgsStart,
300300
).apply {
301301
onFailure { interruptWithException(it) }
302-
onProgress = { gradleAlertBundle.handleAlert(it) }
302+
onAlert = { gradleAlertBundle.handleAlert(it) }
303303
}
304304
} catch (ex: Exception) {
305305
interruptWithException(ex)

kobweb/src/main/kotlin/com/varabyte/kobweb/cli/stop/Stop.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ fun Session.handleStop(
7272
}.run {
7373
kobwebGradle.onStarting = ::informGradleStarting
7474
val stopServerProcess = kobwebGradle.stopServer(gradleArgsCommon + gradleArgsStop).apply {
75-
onProgress = { gradleAlertBundle.handleAlert(it) }
75+
onAlert = { gradleAlertBundle.handleAlert(it) }
7676
}
7777
stopServerProcess.lineHandler = { line, isError ->
7878
handleGradleOutput(line, isError) { alert -> gradleAlertBundle.handleAlert(alert) }

0 commit comments

Comments
 (0)