diff --git a/sbt/src/sbt-test/actions/triggeredby/build.sbt b/sbt/src/sbt-test/actions/task-map/build.sbt similarity index 53% rename from sbt/src/sbt-test/actions/triggeredby/build.sbt rename to sbt/src/sbt-test/actions/task-map/build.sbt index 08367b448..34c26b3b9 100644 --- a/sbt/src/sbt-test/actions/triggeredby/build.sbt +++ b/sbt/src/sbt-test/actions/task-map/build.sbt @@ -3,11 +3,21 @@ val taskB = taskKey[File]("") val taskC = taskKey[File]("") val taskD = taskKey[File]("") +val taskE = taskKey[File]("") +val taskF = taskKey[File]("") +val taskG = taskKey[File]("") +val taskH = taskKey[File]("") + taskA := touch(target.value / "a") taskB := touch(target.value / "b") taskC := touch(target.value / "c") taskD := touch(target.value / "d") +taskE := touch(target.value / "e") +taskF := touch(target.value / "f") +taskG := touch(target.value / "g") +taskH := touch(target.value / "h") + // a <<= a triggeredBy b // means "a" will be triggered by "b" // said differently, invoking "b" will run "b" and then run "a" @@ -15,6 +25,13 @@ taskD := touch(target.value / "d") taskA <<= taskA triggeredBy taskB taskC := (taskC triggeredBy taskD).value +// e <<= e runBefore f +// means "e" will be run before running "f" +// said differently, invoking "f" will run "e" and then run "f" + +taskE <<= taskE runBefore taskF +taskG := (taskG runBefore taskH).value + // test utils diff --git a/sbt/src/sbt-test/actions/task-map/test b/sbt/src/sbt-test/actions/task-map/test new file mode 100644 index 000000000..0617f3abe --- /dev/null +++ b/sbt/src/sbt-test/actions/task-map/test @@ -0,0 +1,15 @@ +> taskB +$ exists target/b +$ exists target/a + +> taskD +$ exists target/d +$ exists target/c + +> taskF +$ exists target/e +$ exists target/f + +> taskH +$ exists target/g +$ exists target/h diff --git a/sbt/src/sbt-test/actions/triggeredby/test b/sbt/src/sbt-test/actions/triggeredby/test deleted file mode 100644 index 063b1fbb1..000000000 --- a/sbt/src/sbt-test/actions/triggeredby/test +++ /dev/null @@ -1,7 +0,0 @@ -> taskB -$ exists target/b -$ exists target/a - -> taskD -$ exists target/d -$ exists target/c diff --git a/tasks/standard/src/main/scala/sbt/std/TaskExtra.scala b/tasks/standard/src/main/scala/sbt/std/TaskExtra.scala index 0d5f4c2df..be5a01ca7 100644 --- a/tasks/standard/src/main/scala/sbt/std/TaskExtra.scala +++ b/tasks/standard/src/main/scala/sbt/std/TaskExtra.scala @@ -118,10 +118,11 @@ trait TaskExtra { def result: Task[Result[S]] = mapR(idFun) private val triggeredByKey = AttributeKey[Seq[Task[_]]]("triggered-by") - private def newInfo[A]: Info[A] = { - val i = Info[A]() - (in.info get triggeredByKey).fold(i)(i.set(triggeredByKey, _)) - } + private val runBeforeKey = AttributeKey[Seq[Task[_]]]("run-before") + private def newInfo[A]: Info[A] = + Seq(triggeredByKey, runBeforeKey) + .flatMap(k => (in.info get k) map (k -> _)) + .foldLeft(Info[A]()) { case (i, (k, v)) => i.set(k, v) } def flatMapR[T](f: Result[S] => Task[T]): Task[T] = Task(Info(), new FlatMapped[T, K](in, f, ml)) def mapR[T](f: Result[S] => T): Task[T] = Task(newInfo, new Mapped[T, K](in, f, ml))