From 947271dc4709dbce94e7830d0523b48f37d2070c Mon Sep 17 00:00:00 2001 From: dmharrah Date: Sun, 5 Jul 2009 18:57:25 +0000 Subject: [PATCH] * Added constant processes 'true' and 'false' * Added simple processes that do no I/O and return an exit value * Fixed support for defining a process in scala.xml.Elem git-svn-id: https://simple-build-tool.googlecode.com/svn/trunk@840 d89573ee-9141-11dd-94d4-bdf5e562f29c --- src/main/scala/sbt/Process.scala | 4 +++- src/main/scala/sbt/ScalaProject.scala | 4 +++- src/main/scala/sbt/impl/ProcessImpl.scala | 14 +++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/scala/sbt/Process.scala b/src/main/scala/sbt/Process.scala index 41bfc0b62..092eda35c 100644 --- a/src/main/scala/sbt/Process.scala +++ b/src/main/scala/sbt/Process.scala @@ -17,7 +17,9 @@ object Process implicit def apply(builder: JProcessBuilder): ProcessBuilder = new SimpleProcessBuilder(builder) implicit def apply(file: File): FilePartialBuilder = new FileBuilder(file) implicit def apply(url: URL): URLPartialBuilder = new URLBuilder(url) - implicit def apply(command: scala.xml.Elem): ProcessBuilder = apply(command.text) + implicit def apply(command: scala.xml.Elem): ProcessBuilder = apply(command.text.trim) + def apply(value: Boolean): ProcessBuilder = apply(value.toString, if(value) 0 else 1) + def apply(name: String, exitValue: => Int): ProcessBuilder = new DummyProcessBuilder(name, exitValue) } trait URLPartialBuilder extends NotNull diff --git a/src/main/scala/sbt/ScalaProject.scala b/src/main/scala/sbt/ScalaProject.scala index 6a50be53f..4e1110fcb 100644 --- a/src/main/scala/sbt/ScalaProject.scala +++ b/src/main/scala/sbt/ScalaProject.scala @@ -53,9 +53,11 @@ trait SimpleScalaProject extends Project pathClean orElse restored } } - def execTask(command: => ProcessBuilder): Task = + def execTask(buildCommand: => ProcessBuilder): Task = task { + val command = buildCommand + log.debug("Executing command " + command) val exitValue = command ! log if(exitValue == 0) None diff --git a/src/main/scala/sbt/impl/ProcessImpl.scala b/src/main/scala/sbt/impl/ProcessImpl.scala index 0d5373bfa..eb1707671 100644 --- a/src/main/scala/sbt/impl/ProcessImpl.scala +++ b/src/main/scala/sbt/impl/ProcessImpl.scala @@ -292,7 +292,19 @@ private class PipeSink(pipe: PipedInputStream, currentSink: SyncVar[Option[Outpu } } - +private[sbt] class DummyProcessBuilder(override val toString: String, exitValue : => Int) extends AbstractProcessBuilder +{ + override def run(io: ProcessIO): Process = new DummyProcess(exitValue) + override def canPipeTo = true +} +/** A thin wrapper around a java.lang.Process. `ioThreads` are the Threads created to do I/O. +* The implementation of `exitValue` waits until these threads die before returning. */ +private class DummyProcess(action: => Int) extends Process +{ + private[this] val exitCode = scala.concurrent.ops.future(action) + override def exitValue() = exitCode() + override def destroy() {} +} /** Represents a simple command without any redirection or combination. */ private[sbt] class SimpleProcessBuilder(p: JProcessBuilder) extends AbstractProcessBuilder {