|
1 | 1 | package com.asarkar.gradle.buildtimetracker
|
2 | 2 |
|
3 |
| -import org.gradle.BuildAdapter |
4 |
| -import org.gradle.BuildResult |
5 |
| -import org.gradle.api.Task |
6 |
| -import org.gradle.api.execution.TaskExecutionListener |
7 |
| -import org.gradle.api.invocation.Gradle |
8 |
| -import org.gradle.api.logging.Logger |
9 |
| -import org.gradle.api.plugins.ExtensionAware |
10 |
| -import org.gradle.api.reflect.TypeOf |
11 |
| -import org.gradle.api.tasks.TaskState |
| 3 | +import org.gradle.api.provider.Property |
| 4 | +import org.gradle.api.services.BuildService |
| 5 | +import org.gradle.api.services.BuildServiceParameters |
| 6 | +import org.gradle.tooling.events.FinishEvent |
| 7 | +import org.gradle.tooling.events.OperationCompletionListener |
| 8 | +import org.gradle.tooling.events.task.TaskFinishEvent |
12 | 9 | import java.time.Duration
|
13 | 10 | import java.time.Instant
|
14 |
| -import java.util.concurrent.ConcurrentHashMap |
15 | 11 | import java.util.concurrent.ConcurrentLinkedQueue
|
16 | 12 |
|
17 |
| -class TimingRecorder(private val ext: BuildTimeTrackerPluginExtension) : TaskExecutionListener, BuildAdapter() { |
18 |
| - private val taskStartTimings: MutableMap<String, Instant> = ConcurrentHashMap() |
19 |
| - private val taskDurations: MutableCollection<Pair<String, Long>> = ConcurrentLinkedQueue() |
20 |
| - private lateinit var buildStarted: Instant |
21 |
| - |
22 |
| - override fun beforeExecute(task: Task) { |
23 |
| - taskStartTimings[task.path] = Instant.now() |
| 13 | +@Suppress("UnstableApiUsage") |
| 14 | +abstract class TimingRecorder : BuildService<TimingRecorder.Params>, OperationCompletionListener, AutoCloseable { |
| 15 | + interface Params : BuildServiceParameters { |
| 16 | + fun getParams(): Property<BuildTimeTrackerPluginParams> |
24 | 17 | }
|
25 | 18 |
|
26 |
| - override fun afterExecute(task: Task, state: TaskState) { |
27 |
| - check(taskStartTimings.contains(task.path)) { "No start timing for task ${task.path}" } |
28 |
| - val duration = Duration.between(taskStartTimings[task.path], Instant.now()).seconds |
29 |
| - if (duration >= ext.minTaskDuration.get().seconds) { |
30 |
| - taskDurations.add(task.path to duration) |
| 19 | + private val taskDurations: MutableCollection<Pair<String, Long>> = ConcurrentLinkedQueue() |
| 20 | + private val buildStarted: Instant = Instant.now() |
| 21 | + |
| 22 | + override fun onFinish(event: FinishEvent) { |
| 23 | + if (event is TaskFinishEvent) { |
| 24 | + val params = parameters.getParams().get() |
| 25 | + val duration = Duration.ofMillis(event.result.endTime - event.result.startTime).seconds |
| 26 | + if (duration >= params.minTaskDuration.seconds) { |
| 27 | + taskDurations.add(event.descriptor.taskPath to duration) |
| 28 | + } |
31 | 29 | }
|
32 | 30 | }
|
33 | 31 |
|
34 |
| - override fun buildFinished(result: BuildResult) { |
| 32 | + override fun close() { |
35 | 33 | if (taskDurations.isEmpty()) {
|
36 |
| - val extra = (ext as ExtensionAware).extensions.getByType( |
37 |
| - object : TypeOf<Map<String, Any>>() {} |
38 |
| - ) |
39 |
| - (extra[Constants.LOGGER_KEY] as Logger).lifecycle( |
40 |
| - "All tasks completed within the minimum threshold: {}s, no build summary to show", |
41 |
| - ext.minTaskDuration.get().seconds |
42 |
| - ) |
43 | 34 | return
|
44 | 35 | }
|
| 36 | + val params = parameters.getParams().get() |
45 | 37 | val buildDuration = Duration.between(buildStarted, Instant.now()).seconds
|
46 |
| - Printer.newInstance(ext) |
| 38 | + Printer.newInstance(params) |
47 | 39 | .use { printer ->
|
48 | 40 | val input = PrinterInput(
|
49 | 41 | buildDuration,
|
50 |
| - if (ext.sort.get()) taskDurations.sortedBy { -it.second } else taskDurations, |
51 |
| - ext.maxWidth.get(), |
52 |
| - ext.showBars.get(), |
53 |
| - ext.barPosition.get() |
| 42 | + if (params.sort) taskDurations.sortedBy { -it.second } else taskDurations, |
| 43 | + params.maxWidth, |
| 44 | + params.showBars, |
| 45 | + params.barPosition |
54 | 46 | )
|
55 | 47 | printer.print(input)
|
56 | 48 | }
|
57 | 49 | }
|
58 |
| - |
59 |
| - override fun projectsEvaluated(gradle: Gradle) { |
60 |
| - buildStarted = Instant.now() |
61 |
| - } |
62 | 50 | }
|
0 commit comments