diff --git a/example/build.gradle.kts b/example/build.gradle.kts index 45a96c5..37d7529 100644 --- a/example/build.gradle.kts +++ b/example/build.gradle.kts @@ -3,12 +3,33 @@ plugins { id("tasktree") } -tasks.create("simple_first_task") { +val firstTask = tasks.create("simple_first_task") { doLast { println("run simple_first_task") } tasks.getByName("assemble").dependsOn(this) } + +tasks.create("sub_first_task") { + doLast { println("run sub_first_task") } + + firstTask.dependsOn(this) +} + + +val secondTask = tasks.create("simple_second_task") { + doLast { println("run simple_second_task") } + + tasks.getByName("assemble").dependsOn(this) +} + + +tasks.create("sub_second_task") { + doLast { println("run sub_second_task") } + + secondTask.dependsOn(this) +} + tasktree { inputs = false @@ -17,6 +38,9 @@ tasktree { printPrice = true printImportance = true printComplexPrice = true + printDoubles = true + printImportanceOutSide = true + } diff --git a/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/TaskStat.kt b/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/TaskStat.kt index e9eb351..e61ab25 100644 --- a/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/TaskStat.kt +++ b/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/TaskStat.kt @@ -1,10 +1,7 @@ package com.github.klee0kai.tasktree -import com.github.klee0kai.tasktree.utils.getAllDeps -import com.github.klee0kai.tasktree.utils.taskGraph import org.gradle.api.Project import org.gradle.api.Task -import org.gradle.kotlin.dsl.provideDelegate class TaskStat( val task: Task, @@ -12,31 +9,19 @@ class TaskStat( val rootProject: Project, ) { - val allDepsCount by lazy { rootProject.taskGraph.getAllDeps(task).count() } - val allDependedOnCount by lazy { - allTasks.count { - rootProject.taskGraph - .getAllDeps(it) - .contains(task) - } - } - val price by lazy { allDepsCount } - val importance by lazy { allDependedOnCount } + var allDepsCount: Long = 0 + var allDependedOnCount: Long = 0 + var allDependedOnOutsideProjectCount: Long = 0 - val complexPrice by lazy { - (price * importance).toFloat() / allTasks.size - } + + val price get() = allDepsCount + val importance get() = allDependedOnCount + + val complexPrice get() = (price * importance).toFloat() / allTasks.size // ---- outside of project ------ - val allDependedOnOutsideProjectCount by lazy { - allTasks.count { - it.project != task.project && - rootProject.taskGraph - .getAllDeps(it) - .contains(task) - } - } - val importanceOutsideProject by lazy { allDependedOnOutsideProjectCount } - val complexPriceOutsideProject by lazy { (price * importanceOutsideProject).toFloat() / allTasks.size } + val importanceOutsideProject get() = allDependedOnOutsideProjectCount + val complexPriceOutsideProject get() = (price * importanceOutsideProject).toFloat() / allTasks.size + } diff --git a/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/TaskTreeExtension.kt b/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/TaskTreeExtension.kt index 57129ab..25b2e81 100644 --- a/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/TaskTreeExtension.kt +++ b/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/TaskTreeExtension.kt @@ -28,15 +28,20 @@ open class TaskTreeExtension { var printDoubles: Boolean = false /** - * Print dependency count for task + * Print the number of dependencies for a task */ var printPrice: Boolean = false /** - * Print depended task count + * Print number of dependent tasks */ var printImportance: Boolean = false + /** + * Print the number of dependent tasks from another project + */ + var printImportanceOutSide: Boolean = false + /** * Complex price * ``` diff --git a/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/tasks/TaskTreeTask.kt b/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/tasks/TaskTreeTask.kt index 7285dd7..2753b53 100644 --- a/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/tasks/TaskTreeTask.kt +++ b/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/tasks/TaskTreeTask.kt @@ -16,10 +16,11 @@ open class TaskTreeTask @Inject constructor( private val renderedTasks = mutableSetOf() private val taskStat = mutableMapOf() - override fun generate(project: Project) { - val allTasks = project.allRequestedTasks.toSet() + renderedTasks.clear() + taskStat.clear() + val allTasks = project.allRequestedTasks.toSet() allTasks.forEach { task -> taskStat.putIfAbsent( task, @@ -31,6 +32,27 @@ open class TaskTreeTask @Inject constructor( ) } + //https://docs.gradle.org/current/javadoc/org/gradle/api/execution/TaskExecutionGraph.html#getAllTasks-- + // use sorted list + allTasks.forEach { task -> + val stat = taskStat[task]!! + val deps = project.taskGraph.getDeps(task) + stat.allDepsCount = deps.count() + deps.sumOf { dep -> + taskStat[dep]!!.allDepsCount + } + } + allTasks.reversed().forEach { task -> + val stat = taskStat[task]!! + project.taskGraph.getDeps(task).forEach { + val depStat = taskStat[it]!! + depStat.allDependedOnCount += 1 + stat.allDependedOnCount + if (depStat.task.project != stat.task.project) { + depStat.allDependedOnOutsideProjectCount += 1 + stat.allDependedOnCount + } + } + + } + val topTasks = taskStat.values .filter { it.allDependedOnCount <= 0 } .map { it.task } @@ -39,7 +61,7 @@ open class TaskTreeTask @Inject constructor( printMostExpensiveTasksIfNeed() printMostExpensiveModulesIfNeed() - renderedTasks.clear() + } private fun render(task: Task, lastChild: Boolean = true, depth: Int = 0) { @@ -149,6 +171,10 @@ open class TaskTreeTask @Inject constructor( withStyle(Description) .text(" importance: ${taskStat.importance};") } + if (ext.printImportanceOutSide) { + withStyle(Description) + .text(" importance outside: ${taskStat.importanceOutsideProject};") + } if (ext.printComplexPrice) { withStyle(Description) .text(" complexPrice: ${taskStat.complexPrice.formatString()};") diff --git a/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/utils/ProjectExt.kt b/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/utils/ProjectExt.kt index 546d9ad..031276e 100644 --- a/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/utils/ProjectExt.kt +++ b/tasktree/src/main/kotlin/com/github/klee0kai/tasktree/utils/ProjectExt.kt @@ -6,6 +6,8 @@ import org.gradle.api.Project import org.gradle.api.Task import org.gradle.execution.taskgraph.DefaultTaskExecutionGraph +private const val RECURSIVE_DETECT = 10_000 + val Project.fullName get() = buildString { parents @@ -24,18 +26,11 @@ val Project.taskGraph get() = gradle.taskGraph as DefaultTaskExecutionGraph val Project.allRequestedTasks get() = taskGraph.allTasks .filter { it !is TaskTreeTask && it !is DiagonDagTask } - .flatMap { setOf(it) + taskGraph.getAllDeps(it) } - .toSet() - -val Project.parents get() = generateSequence(this) { runCatching { it.parent }.getOrNull() } - -fun DefaultTaskExecutionGraph.getAllDeps(task: Task): Set = - getDeps(task) - .flatMap { - setOf(it) + getAllDeps(it) - } - .toSet() +val Project.parents + get() = generateSequence(this) { + runCatching { it.parent }.getOrNull() + }.take(RECURSIVE_DETECT) fun DefaultTaskExecutionGraph.getDeps(task: Task): Set = try {