From b0f52510e0c31bb324439903563ec202e2b849f2 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 26 Feb 2018 11:29:31 +1000 Subject: [PATCH] Use Java's redirectInput rather than sys.process's connectInput Fixes #3737 --- run/src/main/scala/sbt/Fork.scala | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/run/src/main/scala/sbt/Fork.scala b/run/src/main/scala/sbt/Fork.scala index 7058e3a31..74b70d024 100644 --- a/run/src/main/scala/sbt/Fork.scala +++ b/run/src/main/scala/sbt/Fork.scala @@ -8,10 +8,14 @@ package sbt import java.io.File +import java.lang.ProcessBuilder.Redirect + import scala.sys.process.Process import OutputStrategy._ import sbt.internal.util.Util +import java.lang.{ ProcessBuilder => JProcessBuilder } + /** * Represents a command that can be forked. * @@ -45,13 +49,19 @@ final class Fork(val commandName: String, val runnerClass: Option[String]) { (classpathEnv map { value => Fork.ClasspathEnvKey -> value }) - val process = Process(command, workingDirectory, environment.toList: _*) + val jpb = new JProcessBuilder(command.toArray: _*) + workingDirectory foreach (jpb directory _) + environment foreach { case (k, v) => jpb.environment.put(k, v) } + if (connectInput) + jpb.redirectInput(Redirect.INHERIT) + val process = Process(jpb) outputStrategy.getOrElse(StdoutOutput) match { - case StdoutOutput => process.run(connectInput) - case out: BufferedOutput => out.logger.buffer { process.run(out.logger, connectInput) } - case out: LoggedOutput => process.run(out.logger, connectInput) - case out: CustomOutput => (process #> out.output).run(connectInput) + case StdoutOutput => process.run(connectInput = false) + case out: BufferedOutput => + out.logger.buffer { process.run(out.logger, connectInput = false) } + case out: LoggedOutput => process.run(out.logger, connectInput = false) + case out: CustomOutput => (process #> out.output).run(connectInput = false) } } private[this] def makeOptions(jvmOptions: Seq[String],