From 21e2d89fdcbc859a2bd511bad34acd44cf133264 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 31 May 2016 23:50:43 -0800 Subject: [PATCH] Actual transitive closure. --- .../com/beust/kobalt/internal/TaskManager.kt | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) 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 7dc8c2eb..432e1471 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 @@ -151,13 +151,28 @@ class TaskManager @Inject constructor(val args: Args, projects.forEach { put(it.name, it)} } val result = ArrayList(taskNames) - taskNames.forEach { taskName -> - val ti = TaskInfo(taskName) - projectMap[ti.project]?.let { project -> - project.projectExtra.dependsOn.forEach { dp -> - result.add(TaskInfo(dp.projectName, ti.taskName).id) + val toProcess = ArrayList(taskNames) + val newToProcess = arrayListOf() + val seen = hashSetOf() + var stop = false + while (! stop) { + toProcess.forEach { taskName -> + val ti = TaskInfo(taskName) + projectMap[ti.project]?.let { project -> + project.projectExtra.dependsOn.forEach { dp -> + val newTask = TaskInfo(dp.projectName, ti.taskName).id + result.add(newTask) + if (! seen.contains(newTask)) { + newToProcess.add(newTask) + seen.add(newTask) + } + } } } + stop = newToProcess.isEmpty() + toProcess.clear() + toProcess.addAll(newToProcess) + newToProcess.clear() } return result