diff --git a/sbt/src/sbt-test/actions/triggeredby/build.sbt b/sbt/src/sbt-test/actions/triggeredby/build.sbt new file mode 100644 index 000000000..08367b448 --- /dev/null +++ b/sbt/src/sbt-test/actions/triggeredby/build.sbt @@ -0,0 +1,21 @@ +val taskA = taskKey[File]("") +val taskB = taskKey[File]("") +val taskC = taskKey[File]("") +val taskD = taskKey[File]("") + +taskA := touch(target.value / "a") +taskB := touch(target.value / "b") +taskC := touch(target.value / "c") +taskD := touch(target.value / "d") + +// a <<= a triggeredBy b +// means "a" will be triggered by "b" +// said differently, invoking "b" will run "b" and then run "a" + +taskA <<= taskA triggeredBy taskB +taskC := (taskC triggeredBy taskD).value + + + +// test utils +def touch(f: File): File = { IO touch f; f } diff --git a/sbt/src/sbt-test/actions/triggeredby/test b/sbt/src/sbt-test/actions/triggeredby/test new file mode 100644 index 000000000..063b1fbb1 --- /dev/null +++ b/sbt/src/sbt-test/actions/triggeredby/test @@ -0,0 +1,7 @@ +> 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 cf5aa7c34..15a37aa93 100644 --- a/tasks-standard/src/main/scala/sbt/std/TaskExtra.scala +++ b/tasks-standard/src/main/scala/sbt/std/TaskExtra.scala @@ -120,8 +120,14 @@ trait TaskExtra { def failure: Task[Incomplete] = mapFailure(idFun) 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, _)) + } + 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(Info(), new Mapped[T, K](in, f, ml)) + def mapR[T](f: Result[S] => T): Task[T] = Task(newInfo, new Mapped[T, K](in, f, ml)) def dependsOn(tasks: Task[_]*): Task[S] = Task(Info(), new DependsOn(in, tasks)) def flatMap[T](f: S => Task[T]): Task[T] = flatMapR(f compose successM)