1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-26 00:17:11 -07:00

Fix free task bug.

This commit is contained in:
Cedric Beust 2015-10-11 12:47:17 -07:00
parent 36b41c11e9
commit 4b042fa94f
3 changed files with 19 additions and 16 deletions

View file

@ -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<String> = arrayListOf<String>(),
runAfter: List<String> = arrayListOf<String>(),
wrapAfter: List<String> = arrayListOf<String>(),
alwaysRunAfter: List<String> = arrayListOf<String>(),
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

View file

@ -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<String> = arrayOf(),
@ -14,5 +15,5 @@ annotation class Task(val name: String,
val runAfter: Array<String> = arrayOf(),
/** Tasks that this task will always run after */
val wrapAfter: Array<String> = arrayOf()
val alwaysRunAfter: Array<String> = arrayOf()
)

View file

@ -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<String, String>()
private val runAfter = TreeMultimap.create<String, String>()
private val wrapAfter = TreeMultimap.create<String, String>()
private val alwaysRunAfter = TreeMultimap.create<String, String>()
/**
* 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<PluginTask>()
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 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)