diff --git a/main/ClasspathProject.scala b/main/ClasspathProject.scala index 2c68d2219..ccf8c04e1 100644 --- a/main/ClasspathProject.scala +++ b/main/ClasspathProject.scala @@ -216,6 +216,7 @@ object ClasspathProject (cp map extractAnalysis).toMap def data[T](in: Seq[Attributed[T]]): Seq[T] = in.map(_.data) + def taskData[T](in: Task[Seq[Attributed[T]]]): Task[Seq[T]] = in map data def depMap(root: Project): Task[Map[ModuleRevisionId, ModuleDescriptor]] = depMap(MultiProject.topologicalSort(root).dropRight(1) collect { case cp: DefaultClasspathProject => cp }) diff --git a/main/DefaultProject.scala b/main/DefaultProject.scala index 57d8e9a3d..c4625ba21 100644 --- a/main/DefaultProject.scala +++ b/main/DefaultProject.scala @@ -31,8 +31,9 @@ trait IntegrationTest extends BasicProject override def configurations: Seq[Configuration] = super.configurations :+ Configurations.IntegrationTest lazy val integrationTestOptions: Task[Seq[TestOption]] = testOptions - lazy val integrationTest = testTasks(Some("it"), Configurations.IntegrationTest, integrationTestOptions, integrationTestCompile.compile, buildScalaInstance) - lazy val integrationTestCompile = compileTasks(Some("it"), Configurations.IntegrationTest, "src" / "it", Path.emptyPathFinder, buildScalaInstance) + lazy val integrationTest = testTasks(Some("it"), ITestConfig, integrationTestOptions, integrationTestCompile.compile, buildScalaInstance) + lazy val integrationTestCompile = compileTasks(Some("it"), ITestConfig, "src" / "it", Path.emptyPathFinder, buildScalaInstance) + lazy val integrationTestPackage = packages(ITestConfig) } abstract class BasicProject extends TestProject with MultiClasspathProject with ReflectiveClasspathProject { @@ -67,10 +68,17 @@ abstract class BasicProject extends TestProject with MultiClasspathProject with lazy val packages = TaskMap(packageTask) lazy val pkgMainClass = TaskMap(mainClassTask) lazy val jarPath = TaskMap(jarPathTask) + lazy val javaps = TaskMap(javapCompiledTask) + + lazy val javap = javaps(CompileConfig) + lazy val testJavap = javaps(TestConfig) lazy val `package` = packages(CompileConfig) lazy val testPackage = packages(TestConfig) + def javapCompiledTask(conf: Configuration): Task[Unit] = + javapTask(taskData(fullClasspath(conf)), buildScalaInstance) + def directoryProductsTask(conf: Configuration): Task[Seq[Attributed[File]]] = conf match { case CompileConfig | DefaultConfig => makeProducts(compile.compile, compile.compileInputs, name, "") @@ -141,7 +149,7 @@ abstract class BasicProject extends TestProject with MultiClasspathProject with lazy val clean = task { IO.delete(outputDirectory) } - // lazy val test-only, test-quick, test-failed, package-src, package-test, package-doc, javap + // lazy val test-only, test-quick, test-failed, package-src, package-doc, jetty-{run,stop,restart}, prepare-webapp lazy val set = input map { in => val Seq(name, value) = in.splitArgs.take(2) diff --git a/main/OutputTasks.scala b/main/OutputTasks.scala index bb56b06dc..72ec24e71 100644 --- a/main/OutputTasks.scala +++ b/main/OutputTasks.scala @@ -92,4 +92,30 @@ object OutputUtil } def taskForName(ctx: Transform.Context[Project], name: String): Task[_] = ctx.static(ctx.rootOwner, MultiProject.transformName(name)).getOrElse(error("No task '" + name + "'")) +} +trait Exec +{ + def input: Task[Input] + def streams: Task[TaskStreams] + def fork(p: Seq[String], log: Logger): Unit = fork(Process(p), log) + def fork(p: ProcessBuilder, log: Logger): Unit = + { + val exitValue = p ! log + if(exitValue != 0) error("Nonzero exit value: " + exitValue) + } + def forkWithCode(p: ProcessBuilder, log: Logger): Task[Int] = streams map { s => p ! log } + + lazy val sh = (input, streams) map { case in :+: s :+: HNil => fork("sh" :: "-c" :: in.arguments :: Nil, s.log) } + lazy val exec = (input, streams) map { case in :+: s :+: HNil => fork( Process(in.splitArgs), s.log ) } +} +trait Javap extends Exec +{ + def javapTask(classpath: Task[Seq[File]], scalaInstance: Task[ScalaInstance]): Task[Unit] = + javapTask( (classpath, scalaInstance) map { case cp :+: si :+: HNil => cp ++ si.jars } ) + def javapTask(classpath: Task[Seq[File]]): Task[Unit] = + (input, classpath, streams) map { case in :+: cp :+: s :+: HNil => + val args = in.splitArgs + val argsWithClasspath = if(cp.isEmpty) args else "-classpath" +: Path.makeString(cp) +: args + fork("javap" +: argsWithClasspath, s.log) + } } \ No newline at end of file diff --git a/main/TestProject.scala b/main/TestProject.scala index 7c758112c..318ebb9b2 100644 --- a/main/TestProject.scala +++ b/main/TestProject.scala @@ -2,4 +2,4 @@ package sbt import std._ -trait TestProject extends Project with ReflectiveProject with ProjectConstructors with LastOutput with PrintTask with ProjectExtra with TaskSetup \ No newline at end of file +trait TestProject extends Project with ReflectiveProject with ProjectConstructors with LastOutput with PrintTask with ProjectExtra with TaskSetup with Exec with Javap \ No newline at end of file