From 8f609234d0b48aba9f1e68e068c4ac275dfe3529 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Tue, 20 Feb 2018 08:21:01 -0800 Subject: Properly propagate interactiveness to the server main0 --- main/src/mill/Main.scala | 11 +++-------- main/src/mill/ServerClient.scala | 24 +++++++++++++++++++----- 2 files changed, 22 insertions(+), 13 deletions(-) (limited to 'main/src') diff --git a/main/src/mill/Main.scala b/main/src/mill/Main.scala index a0ef9120..7bc08c61 100644 --- a/main/src/mill/Main.scala +++ b/main/src/mill/Main.scala @@ -9,18 +9,13 @@ import ammonite.util.Util import mill.main.MainRunner object Main { - case class Config(home: ammonite.ops.Path = pwd/'out/'ammonite, - colored: Option[Boolean] = None, - help: Boolean = false, - repl: Boolean = false, - watch: Boolean = false) - def main(args: Array[String]): Unit = { - val (result, _) = main0(args, None, () => false) + val (result, _) = main0(args, None, ammonite.Main.isInteractive(), () => false) System.exit(if(result) 0 else 1) } def main0(args: Array[String], mainRunner: Option[(Cli.Config, MainRunner)], + mainInteractive: Boolean, watchInterrupted: () => Boolean): (Boolean, Option[(Cli.Config, MainRunner)]) = { import ammonite.main.Cli @@ -65,7 +60,7 @@ object Main { ) val runner = new mill.main.MainRunner( - config.copy(home = pwd / "out" / ".ammonite"), + config.copy(home = pwd / "out" / ".ammonite", colored = Some(mainInteractive)), System.out, System.err, System.in, watchInterrupted, mainRunner match{ diff --git a/main/src/mill/ServerClient.scala b/main/src/mill/ServerClient.scala index 5e15314a..4feddeae 100644 --- a/main/src/mill/ServerClient.scala +++ b/main/src/mill/ServerClient.scala @@ -30,6 +30,7 @@ object Client{ def main(args: Array[String]): Unit = { WithLock(1) { lockBase => + val start = System.currentTimeMillis() val inFile = new java.io.File(lockBase + "/stdin") val outErrFile = new java.io.File(lockBase + "/stdouterr") val metaFile = new java.io.File(lockBase + "/stdmeta") @@ -43,12 +44,16 @@ object Client{ metaFile.createNewFile() val f = new FileOutputStream(tmpRunFile) + f.write(if (System.console() != null) 1 else 0) + f.write(args.length) var i = 0 while (i < args.length){ + f.write(args(i).length) f.write(args(i).getBytes) - f.write('\n') i += 1 } + f.flush() + tmpRunFile.renameTo(runFile) val in = new FileOutputStream(inFile) @@ -78,6 +83,7 @@ object Client{ .redirectError(outErrFile) .start() } + val buffer = new Array[Byte](1024) val metaBuffer = new Array[Byte](1024) while({ @@ -141,9 +147,9 @@ class ProxyInputStream(x: => java.io.InputStream) extends java.io.InputStream{ override def read(b: Array[Byte]) = x.read(b) } object Server{ - def main(args: Array[String]): Unit = { + def main(args0: Array[String]): Unit = { import java.nio.file.{Paths, Files} - val lockBase = Paths.get(args(0)) + val lockBase = Paths.get(args0(0)) val runFile = lockBase.resolve("run") var lastRun = System.currentTimeMillis() val pidFile = lockBase.resolve("pid") @@ -165,12 +171,20 @@ object Server{ currentIn = Files.newInputStream(lockBase.resolve("stdin")) currentOutErr = Files.newOutputStream(lockBase.resolve("stdouterr")) currentMeta = Files.newOutputStream(lockBase.resolve("stdmeta")) - val args = new String(Files.readAllBytes(runFile)).split('\n') + val argStream = Files.newInputStream(lockBase.resolve("run")) + val interactive = argStream.read() != 0 + val argsLength = argStream.read() + val args = Array.fill(argsLength){ + val n = argStream.read() + val arr = new Array[Byte](n) + argStream.read(arr) + new String(arr) + } try { - val (_, mr) = mill.Main.main0( args, mainRunner, + interactive, () => { channel.tryLock() match{ case null => -- cgit v1.2.3