diff --git a/src/main/kotlin/com/beust/kobalt/api/Plugin.kt b/src/main/kotlin/com/beust/kobalt/api/Plugin.kt index 6692b07d..81129662 100644 --- a/src/main/kotlin/com/beust/kobalt/api/Plugin.kt +++ b/src/main/kotlin/com/beust/kobalt/api/Plugin.kt @@ -19,13 +19,13 @@ public interface Plugin { fun addStaticTask(annotation: Task, project: Project, task: (Project) -> TaskResult) { addTask(project, annotation.name, annotation.description, annotation.runBefore.toList(), - annotation.runAfter.toList(), annotation.wrapAfter.toList(), task) + annotation.runAfter.toList(), annotation.alwaysRunAfter.toList(), task) } fun addTask(project: Project, name: String, description: String = "", runBefore: List = arrayListOf(), runAfter: List = arrayListOf(), - wrapAfter: List = arrayListOf(), + alwaysRunAfter: List = arrayListOf(), task: (Project) -> TaskResult) { tasks.add( object : BasePluginTask(this, name, description, project) { @@ -36,7 +36,7 @@ public interface Plugin { }) runBefore.forEach { taskManager.runBefore(it, name) } runAfter.forEach { taskManager.runBefore(name, it) } - wrapAfter.forEach { taskManager.wrapAfter(it, name)} + alwaysRunAfter.forEach { taskManager.alwaysRunAfter(it, name)} } var taskManager : TaskManager diff --git a/src/main/kotlin/com/beust/kobalt/api/annotation/Annotations.kt b/src/main/kotlin/com/beust/kobalt/api/annotation/Annotations.kt index f728bc9d..949402ac 100644 --- a/src/main/kotlin/com/beust/kobalt/api/annotation/Annotations.kt +++ b/src/main/kotlin/com/beust/kobalt/api/annotation/Annotations.kt @@ -7,6 +7,7 @@ annotation class Directive @Retention(AnnotationRetention.RUNTIME) annotation class Task(val name: String, val description: String, + /** Tasks that this task depends on */ val runBefore: Array = arrayOf(), @@ -14,5 +15,5 @@ annotation class Task(val name: String, val runAfter: Array = arrayOf(), /** Tasks that this task will always run after */ - val wrapAfter: Array = arrayOf() + val alwaysRunAfter: Array = arrayOf() ) diff --git a/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt b/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt index 5e439e7f..91b12cc7 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt @@ -18,7 +18,7 @@ import javax.inject.Singleton public class TaskManager @Inject constructor(val plugins: Plugins, val args: Args) : KobaltLogger { private val runBefore = TreeMultimap.create() private val runAfter = TreeMultimap.create() - private val wrapAfter = TreeMultimap.create() + private val alwaysRunAfter = TreeMultimap.create() /** * Called by plugins to indicate task dependencies defined at runtime. Keys depend on values. @@ -32,8 +32,8 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg runAfter.put(task1, task2) } - fun wrapAfter(task1: String, task2: String) { - wrapAfter.put(task1, task2) + fun alwaysRunAfter(task1: String, task2: String) { + alwaysRunAfter.put(task1, task2) } data class TaskInfo(val id: String) { @@ -62,8 +62,6 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg log(1, "") targets.forEach { target -> - tasksAlreadyRun.add(TaskInfo(projectName, target).id) - val graph = DynamicGraph() val ti = TaskInfo(target) @@ -71,20 +69,24 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg val task = tasksByNames.get(ti.task) if (task != null && task.plugin.accept(project)) { // - // Add free tasks as nodes to the graph + // If the current target is free, add it as a single node to the graph // - calculateFreeTasks(tasksByNames).forEach { - val thisTaskInfo = TaskInfo(projectName, it.name) - if (! tasksAlreadyRun.contains(thisTaskInfo.id)) { - graph.addNode(it) - tasksAlreadyRun.add(thisTaskInfo.id) + val currentFreeTask = calculateFreeTasks(tasksByNames).filter { it.name == target } + if (currentFreeTask.size() == 1) { + currentFreeTask.get(0).let { + val thisTaskInfo = TaskInfo(projectName, it.name) + if (! tasksAlreadyRun.contains(thisTaskInfo.id)) { + graph.addNode(it) + tasksAlreadyRun.add(thisTaskInfo.id) + } } } // // Add the transitive closure of the current task as edges to the graph // - calculateTransitiveClosure(project, tasksByNames, ti, task).forEach { pluginTask -> + val transitiveClosure = calculateTransitiveClosure(project, tasksByNames, ti, task) + transitiveClosure.forEach { pluginTask -> val rb = runBefore.get(pluginTask.name) rb.forEach { val to = tasksByNames.get(it)