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

runBefore/After experiment.

This commit is contained in:
Cedric Beust 2015-10-10 03:34:22 -07:00
parent e831d33b82
commit d2a739a171
4 changed files with 32 additions and 19 deletions

View file

@ -33,13 +33,9 @@ public interface Plugin {
return TaskResult2(taskResult.success, this)
}
})
runBefore.forEach { dependsOn(it, name) }
runAfter.forEach { dependsOn(name, it) }
runBefore.forEach { taskManager.runBefore(it, name) }
runAfter.forEach { taskManager.runBefore(name, it) }
}
var taskManager : TaskManager
fun dependsOn(task1: String, task2: String) {
taskManager.dependsOn(task1, task2)
}
}

View file

@ -9,7 +9,8 @@ abstract public class PluginTask : Callable<TaskResult2<PluginTask>> {
open val name: String = ""
open val doc: String = ""
abstract val project: Project
val dependsOn = arrayListOf<String>()
val runBefore = arrayListOf<String>()
val runAfter = arrayListOf<String>()
override public fun toString() : String {
return ToString("PluginTask", "id", project.name + ":" + name).s

View file

@ -14,14 +14,19 @@ import javax.inject.Singleton
@Singleton
public class TaskManager @Inject constructor(val plugins: Plugins, val args: Args) : KobaltLogger {
private val dependentTaskMap = TreeMultimap.create<String, String>()
private val runBefore = TreeMultimap.create<String, String>()
private val runAfter= TreeMultimap.create<String, String>()
/**
* Called by plugins to indicate task dependencies defined at runtime. Keys depend on values.
* Declare that `task1` depends on `task2`.
*/
fun dependsOn(task1: String, task2: String) {
dependentTaskMap.put(task1, task2)
fun runBefore(task1: String, task2: String) {
runBefore.put(task1, task2)
}
fun runAfter(task1: String, task2: String) {
runAfter.put(task1, task2)
}
class TaskInfo(val id: String) {
@ -47,22 +52,22 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg
//
plugins.allTasks.filter { it.project.name == project.name }.forEach { rt ->
tasksByNames.put(rt.name, rt)
if (rt.dependsOn.size() > 0) {
rt.dependsOn.forEach { d ->
dependentTaskMap.put(rt.name, d)
if (rt.runBefore.size() > 0) {
rt.runBefore.forEach { d ->
runBefore.put(rt.name, d)
}
}
}
val freeTaskMap = hashMapOf<String, PluginTask>()
tasksByNames.keySet().forEach {
if (!dependentTaskMap.containsKey(it)) freeTaskMap.put(it, tasksByNames.get(it).elementAt(0))
if (! runBefore.containsKey(it)) freeTaskMap.put(it, tasksByNames.get(it).elementAt(0))
}
log(2, "Free tasks: ${freeTaskMap.keySet()}")
log(2, "Dependent tasks:")
dependentTaskMap.keySet().forEach { t ->
log(2, " ${t} -> ${dependentTaskMap.get(t)}}")
runBefore.keySet().forEach { t ->
log(2, " ${t} -> ${runBefore.get(t)}}")
}
//
@ -102,7 +107,7 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg
throw KobaltException("Unknown task: ${target}")
}
tasks.forEach { task ->
val dependencyNames = dependentTaskMap.get(task.name)
val dependencyNames = runBefore.get(task.name)
dependencyNames.forEach { dependencyName ->
if (!seen.contains(dependencyName)) {
newToProcess.add(dependencyName)
@ -127,7 +132,7 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg
//
val graph = DynamicGraph<PluginTask>()
freeTaskMap.values().filter { transitiveClosure.contains(it.name) } forEach { graph.addNode(it) }
dependentTaskMap.entries().filter {
runBefore.entries().filter {
transitiveClosure.contains(it.key)
}.forEach { entry ->
plugins.findTasks(entry.key).filter { it.project.name == project.name }.forEach { from ->

View file

@ -3,12 +3,15 @@ package com.beust.kobalt.plugin.kotlin
import com.beust.kobalt.Plugins
import com.beust.kobalt.api.ICompilerInfo
import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project
import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.internal.JvmCompilerPlugin
import com.beust.kobalt.internal.TaskResult
import com.beust.kobalt.internal.TaskResult2
import com.beust.kobalt.maven.*
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.KobaltExecutors
import com.beust.kobalt.misc.KobaltLogger
import com.beust.kobalt.plugin.java.JavaProject
@ -19,7 +22,7 @@ import javax.inject.Singleton
@Singleton
public class KotlinPlugin @Inject constructor(
override val localRepo: LocalRepo,
override val files: com.beust.kobalt.misc.KFiles,
override val files: KFiles,
override val depFactory: DepFactory,
override val dependencyManager: DependencyManager,
override val executors: KobaltExecutors)
@ -29,6 +32,14 @@ public class KotlinPlugin @Inject constructor(
Kobalt.registerCompiler(KotlinCompilerInfo())
}
override fun apply(project: Project, context: KobaltContext) {
log(1, "ADD SYNTH TASK")
// addTask(project, "syntheticTask", "A dynamic task", runBefore = listOf("clean")) { p: Project ->
// println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Synthetic task")
// TaskResult()
// }
}
companion object {
public const val TASK_COMPILE: String = "compile"
public const val TASK_COMPILE_TEST: String = "compileTest"