From 5d7d42659c545571b7201efce0ba6a57ab4b0935 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sat, 24 Feb 2018 15:48:48 -0800 Subject: better error messages when you run interactive commands without -i --- main/src/mill/Main.scala | 5 +++-- main/src/mill/modules/Jvm.scala | 41 +++++++++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 18 deletions(-) (limited to 'main/src') diff --git a/main/src/mill/Main.scala b/main/src/mill/Main.scala index 4adb8d9c..482de0bf 100644 --- a/main/src/mill/Main.scala +++ b/main/src/mill/Main.scala @@ -1,12 +1,13 @@ package mill -import java.io.{InputStream, OutputStream, PrintStream} +import java.io.{InputStream, PrintStream} import ammonite.main.Cli._ import ammonite.ops._ import ammonite.util.Util import mill.clientserver.{Client, FileLocks} import mill.eval.Evaluator +import mill.util.DummyInputStream object ClientMain { @@ -73,7 +74,7 @@ object ServerMain extends mill.clientserver.ServerMain[Evaluator.State]{ stateCache, mainInteractive, watchInterrupted, - stdin, + DummyInputStream, stdout, stderr ) diff --git a/main/src/mill/modules/Jvm.scala b/main/src/mill/modules/Jvm.scala index fb2661e1..5e297072 100644 --- a/main/src/mill/modules/Jvm.scala +++ b/main/src/mill/modules/Jvm.scala @@ -1,6 +1,6 @@ package mill.modules -import java.io.FileOutputStream +import java.io.{ByteArrayInputStream, FileOutputStream} import java.lang.reflect.Modifier import java.net.URLClassLoader import java.nio.file.attribute.PosixFilePermission @@ -28,39 +28,48 @@ object Jvm { envArgs: Map[String, String] = Map.empty, mainArgs: Seq[String] = Seq.empty, workingDir: Path = null): Unit = { - - import ammonite.ops.ImplicitWd._ - val commandArgs = + baseInteractiveSubprocess( Vector("java") ++ jvmArgs ++ Vector("-cp", classPath.mkString(":"), mainClass) ++ - mainArgs - baseInteractiveSubprocess(commandArgs, envArgs, workingDir) + mainArgs, + envArgs, + workingDir + ) } + def baseInteractiveSubprocess(commandArgs: Seq[String], envArgs: Map[String, String], workingDir: Path) = { val builder = new java.lang.ProcessBuilder() - import collection.JavaConverters._ + for ((k, v) <- envArgs){ if (v != null) builder.environment().put(k, v) else builder.environment().remove(k) } builder.directory(workingDir.toIO) - val process = - builder + val process = if (System.in.isInstanceOf[ByteArrayInputStream]){ + + val process = builder .command(commandArgs:_*) .start() - val sources = Seq( - process.getInputStream -> System.out, - process.getErrorStream -> System.err, - System.in -> process.getOutputStream - ) + val sources = Seq( + process.getInputStream -> System.out, + process.getErrorStream -> System.err, + System.in -> process.getOutputStream + ) - for((std, dest) <- sources){ - new Thread(new ClientInputPumper(std, dest)).start() + for((std, dest) <- sources){ + new Thread(new ClientInputPumper(std, dest)).start() + } + process + }else{ + builder + .command(commandArgs:_*) + .inheritIO() + .start() } val exitCode = process.waitFor() -- cgit v1.2.3