diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Args.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Args.kt index b8742a71..cf29ea55 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Args.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Args.kt @@ -65,6 +65,9 @@ class Args { @Parameter(names = arrayOf("--profiles"), description = "Comma-separated list of profiles to run") var profiles: String? = null + @Parameter(names = arrayOf("--profiling"), description = "Display task timings at the end of the build") + var profiling: Boolean = false + @Parameter(names = arrayOf("--resolve"), description = "Resolve the given comma-separated dependencies and display their dependency tree") var dependencies: String? = null diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt index 718bd15d..26f39a0c 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt @@ -62,7 +62,7 @@ class TaskManager @Inject constructor(val args: Args, override fun toString() = id } - class RunTargetResult(val taskResult: TaskResult, val messages: List) + class RunTargetResult(val taskResult: TaskResult, val timings: List) /** * @return the list of tasks available for the given project. @@ -124,10 +124,12 @@ class TaskManager @Inject constructor(val args: Args, return if (result.any()) result.toList() else projects } + class ProfilerInfo(val taskName: String, val durationMillis: Long) + private fun runProjects(taskInfos: List, projects: List) : RunTargetResult { var result = TaskResult() val failedProjects = hashSetOf() - val messages = Collections.synchronizedList(arrayListOf()) + val messages = Collections.synchronizedList(arrayListOf()) projects.forEach { project -> AsciiArt.logBox("Building ${project.name}") @@ -532,7 +534,7 @@ class TaskManager @Inject constructor(val args: Args, ///// } -class TaskWorker(val tasks: List, val dryRun: Boolean, val messages: MutableList) +class TaskWorker(val tasks: List, val dryRun: Boolean, val timings: MutableList) : IWorker { override fun call() : TaskResult2 { @@ -550,7 +552,7 @@ class TaskWorker(val tasks: List, val dryRun: Boolean, val messages: Muta success = success and tr.success if (tr.errorMessage != null) errorMessages.add(tr.errorMessage) } - messages.add("$name: $time ms") + timings.add(TaskManager.ProfilerInfo(name, time.first)) } return TaskResult2(success, errorMessages.joinToString("\n"), tasks[0]) } diff --git a/src/main/kotlin/com/beust/kobalt/Main.kt b/src/main/kotlin/com/beust/kobalt/Main.kt index b25f72cd..5e2bd2cc 100644 --- a/src/main/kotlin/com/beust/kobalt/Main.kt +++ b/src/main/kotlin/com/beust/kobalt/Main.kt @@ -213,7 +213,14 @@ private class Main @Inject constructor( // Shutdown all plug-ins plugins.shutdownPlugins() - log(3, "Timings:\n " + runTargetResult.messages.joinToString("\n ")) + if (args.profiling) { + log(1, "\nTIMINGS (SECONDS)") + log(1, "================\n") + runTargetResult.timings.sortedByDescending { it.durationMillis }.forEach { + log(1, String.format("%.2f", it.durationMillis.toDouble() / 1000) + " " + it.taskName) + } + log(1, "\n") + } } } }