diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-04-08 08:54:45 -0700 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-04-08 09:13:24 -0700 |
commit | dbcad35c05f1726f26b8033524e8fdd3d68b2de9 (patch) | |
tree | b5664e6b751e9f0c855e03b9fba737d3d6b50932 /main | |
parent | 4f51bd1ccc7cb68822a59ec07946242c1394e8c4 (diff) | |
parent | 997760eeddb75f163f7748c945d81a2f248db974 (diff) | |
download | mill-dbcad35c05f1726f26b8033524e8fdd3d68b2de9.tar.gz mill-dbcad35c05f1726f26b8033524e8fdd3d68b2de9.tar.bz2 mill-dbcad35c05f1726f26b8033524e8fdd3d68b2de9.zip |
merge
Diffstat (limited to 'main')
-rw-r--r-- | main/src/mill/Main.scala | 11 | ||||
-rw-r--r-- | main/src/mill/main/MainRunner.scala | 6 | ||||
-rw-r--r-- | main/src/mill/main/RunScript.scala | 6 | ||||
-rw-r--r-- | main/src/mill/main/Server.scala | 15 | ||||
-rw-r--r-- | main/test/src/mill/main/ClientServerTests.scala | 154 | ||||
-rw-r--r-- | main/test/src/mill/util/ScriptTestSuite.scala | 2 |
6 files changed, 150 insertions, 44 deletions
diff --git a/main/src/mill/Main.scala b/main/src/mill/Main.scala index 734d61e2..a349321e 100644 --- a/main/src/mill/Main.scala +++ b/main/src/mill/Main.scala @@ -2,6 +2,8 @@ package mill import java.io.{InputStream, PrintStream} +import scala.collection.JavaConverters._ + import ammonite.main.Cli._ import ammonite.ops._ import ammonite.util.Util @@ -24,7 +26,8 @@ object Main { ammonite.Main.isInteractive(), System.in, System.out, - System.err + System.err, + System.getenv().asScala.toMap ) System.exit(if(result) 0 else 1) } @@ -34,7 +37,8 @@ object Main { mainInteractive: Boolean, stdin: InputStream, stdout: PrintStream, - stderr: PrintStream): (Boolean, Option[Evaluator.State]) = { + stderr: PrintStream, + env: Map[String, String]): (Boolean, Option[Evaluator.State]) = { import ammonite.main.Cli val removed = Set("predef-code", "no-home-predef") @@ -102,7 +106,8 @@ object Main { val runner = new mill.main.MainRunner( config.copy(colored = Some(mainInteractive)), stdout, stderr, stdin, - stateCache + stateCache, + env ) if (ClientServer.isJava9OrAbove) { diff --git a/main/src/mill/main/MainRunner.scala b/main/src/mill/main/MainRunner.scala index efebd5a5..fed664fd 100644 --- a/main/src/mill/main/MainRunner.scala +++ b/main/src/mill/main/MainRunner.scala @@ -20,7 +20,8 @@ class MainRunner(val config: ammonite.main.Cli.Config, outprintStream: PrintStream, errPrintStream: PrintStream, stdIn: InputStream, - stateCache0: Option[Evaluator.State] = None) + stateCache0: Option[Evaluator.State] = None, + env : Map[String, String]) extends ammonite.MainRunner( config, outprintStream, errPrintStream, stdIn, outprintStream, errPrintStream @@ -75,7 +76,8 @@ class MainRunner(val config: ammonite.main.Cli.Config, errPrintStream, errPrintStream, stdIn - ) + ), + env ) result match{ diff --git a/main/src/mill/main/RunScript.scala b/main/src/mill/main/RunScript.scala index 77930cc8..75042dea 100644 --- a/main/src/mill/main/RunScript.scala +++ b/main/src/mill/main/RunScript.scala @@ -29,7 +29,8 @@ object RunScript{ instantiateInterpreter: => Either[(Res.Failing, Seq[(Path, Long)]), ammonite.interp.Interpreter], scriptArgs: Seq[String], stateCache: Option[Evaluator.State], - log: Logger) + log: Logger, + env : Map[String, String]) : (Res[(Evaluator[Any], Seq[PathRef], Either[String, Seq[Js.Value]])], Seq[(Path, Long)]) = { val (evalState, interpWatched) = stateCache match{ @@ -53,7 +54,8 @@ object RunScript{ val evalRes = for(s <- evalState) - yield new Evaluator[Any](home, wd / 'out, wd / 'out, s.rootModule, log, s.classLoaderSig, s.workerCache) + yield new Evaluator[Any](home, wd / 'out, wd / 'out, s.rootModule, log, + s.classLoaderSig, s.workerCache, env) val evaluated = for{ evaluator <- evalRes diff --git a/main/src/mill/main/Server.scala b/main/src/mill/main/Server.scala index c0d75c87..14aade4c 100644 --- a/main/src/mill/main/Server.scala +++ b/main/src/mill/main/Server.scala @@ -4,6 +4,7 @@ import java.io._ import java.net.Socket import mill.Main +import scala.collection.JavaConverters._ import org.scalasbt.ipcsocket._ import mill.client._ import mill.eval.Evaluator @@ -16,7 +17,8 @@ trait ServerMain[T]{ mainInteractive: Boolean, stdin: InputStream, stdout: PrintStream, - stderr: PrintStream): (Boolean, Option[T]) + stderr: PrintStream, + env : Map[String, String]): (Boolean, Option[T]) } object ServerMain extends mill.main.ServerMain[Evaluator.State]{ @@ -34,13 +36,15 @@ object ServerMain extends mill.main.ServerMain[Evaluator.State]{ mainInteractive: Boolean, stdin: InputStream, stdout: PrintStream, - stderr: PrintStream) = Main.main0( + stderr: PrintStream, + env : Map[String, String]) = Main.main0( args, stateCache, mainInteractive, DummyInputStream, stdout, - stderr + stderr, + env ) } @@ -96,6 +100,7 @@ class Server[T](lockBase: String, val argStream = new FileInputStream(lockBase + "/run") val interactive = argStream.read() != 0; val args = ClientServer.parseArgs(argStream) + val env = ClientServer.parseMap(argStream) argStream.close() var done = false @@ -109,7 +114,9 @@ class Server[T](lockBase: String, sm.stateCache, interactive, socketIn, - stdout, stderr + stdout, + stderr, + env.asScala.toMap ) sm.stateCache = newStateCache diff --git a/main/test/src/mill/main/ClientServerTests.scala b/main/test/src/mill/main/ClientServerTests.scala index e0e74fc7..60c9c9e6 100644 --- a/main/test/src/mill/main/ClientServerTests.scala +++ b/main/test/src/mill/main/ClientServerTests.scala @@ -1,9 +1,10 @@ package mill.main - import java.io._ import java.nio.file.Path import mill.client.{ClientServer, Locks} + +import scala.collection.JavaConverters._ import utest._ class EchoServer extends ServerMain[Int]{ def main0(args: Array[String], @@ -11,13 +12,21 @@ class EchoServer extends ServerMain[Int]{ mainInteractive: Boolean, stdin: InputStream, stdout: PrintStream, - stderr: PrintStream) = { + stderr: PrintStream, + env: Map[String, String]) = { val reader = new BufferedReader(new InputStreamReader(stdin)) val str = reader.readLine() - stdout.println(str + args(0)) + if (args.nonEmpty){ + stdout.println(str + args(0)) + } + env.toSeq.sortBy(_._1).foreach{ + case (key, value) => stdout.println(s"$key=$value") + } stdout.flush() - stderr.println(str.toUpperCase + args(0)) + if (args.nonEmpty){ + stderr.println(str.toUpperCase + args(0)) + } stderr.flush() (true, None) } @@ -37,38 +46,40 @@ object ClientServerTests extends TestSuite{ (tmpDir, locks) } + def spawnEchoServer(tmpDir : Path, locks: Locks): Unit = { + new Thread(() => new Server( + tmpDir.toString, + new EchoServer(), + () => (), + 1000, + locks + ).run()).start() + } + + def runClientAux(tmpDir : Path, locks: Locks) + (env : Map[String, String], args: Array[String]) = { + val (in, out, err) = initStreams() + Server.lockBlock(locks.clientLock){ + mill.client.Main.run( + tmpDir.toString, + () => spawnEchoServer(tmpDir, locks), + locks, + in, + out, + err, + args, + env.asJava + ) + Thread.sleep(100) + (new String(out.toByteArray), new String(err.toByteArray)) + } + } + def tests = Tests{ 'hello - { if (!ClientServer.isWindows){ val (tmpDir, locks) = init() - - def spawnEchoServer(): Unit = { - new Thread(() => new Server( - tmpDir.toString, - new EchoServer(), - () => (), - 1000, - locks - ).run()).start() - } - - - def runClient(arg: String) = { - val (in, out, err) = initStreams() - Server.lockBlock(locks.clientLock){ - mill.client.Main.run( - tmpDir.toString, - () => spawnEchoServer(), - locks, - in, - out, - err, - Array(arg) - ) - Thread.sleep(100) - (new String(out.toByteArray), new String(err.toByteArray)) - } - } + def runClient(s: String) = runClientAux(tmpDir, locks)(Map.empty, Array(s)) // Make sure the simple "have the client start a server and // exchange one message" workflow works from end to end. @@ -119,6 +130,85 @@ object ClientServerTests extends TestSuite{ err3 == "HELLO World\n" ) } + + 'envVars - { + if (!ClientServer.isWindows){ + val (tmpDir, locks) = init() + + def runClient(env : Map[String, String]) = runClientAux(tmpDir, locks)(env, Array()) + + // Make sure the simple "have the client start a server and + // exchange one message" workflow works from end to end. + + assert( + locks.clientLock.probe(), + locks.serverLock.probe(), + locks.processLock.probe() + ) + + def longString(s : String) = Array.fill(1000)(s).mkString + val b1000 = longString("b") + val c1000 = longString("c") + val a1000 = longString("a") + + val env = Map( + "a" -> a1000, + "b" -> b1000, + "c" -> c1000 + ) + + + val (out1, err1) = runClient(env) + val expected = s"a=$a1000\nb=$b1000\nc=$c1000\n" + + assert( + out1 == expected, + err1 == "" + ) + + // Give a bit of time for the server to release the lock and + // re-acquire it to signal to the client that it's done + Thread.sleep(100) + + assert( + locks.clientLock.probe(), + !locks.serverLock.probe(), + !locks.processLock.probe() + ) + + val path = List( + "/Users/foo/Library/Haskell/bin", + "/usr/local/git/bin", + "/sw/bin/", + "/usr/local/bin", + "/usr/local/", + "/usr/local/sbin", + "/usr/local/mysql/bin", + "/usr/local/bin", + "/usr/bin", + "/bin", + "/usr/sbin", + "/sbin", + "/opt/X11/bin", + "/usr/local/MacGPG2/bin", + "/Library/TeX/texbin", + "/usr/local/bin/", + "/Users/foo/bin", + "/Users/foo/go/bin", + "~/.bloop" + ) + + val pathEnvVar = path.mkString(":") + val (out2, err2) = runClient(Map("PATH" -> pathEnvVar)) + + val expected2 = s"PATH=$pathEnvVar\n" + + assert( + out2 == expected2, + err2 == "" + ) + } + } } } } diff --git a/main/test/src/mill/util/ScriptTestSuite.scala b/main/test/src/mill/util/ScriptTestSuite.scala index 2df1c0c0..bbca5d68 100644 --- a/main/test/src/mill/util/ScriptTestSuite.scala +++ b/main/test/src/mill/util/ScriptTestSuite.scala @@ -15,7 +15,7 @@ abstract class ScriptTestSuite(fork: Boolean) extends TestSuite{ val stdIn = new ByteArrayInputStream(Array()) lazy val runner = new mill.main.MainRunner( ammonite.main.Cli.Config(wd = workspacePath), - stdOutErr, stdOutErr, stdIn + stdOutErr, stdOutErr, stdIn, None, Map.empty ) def eval(s: String*) = { if (!fork) runner.runScript(workspacePath / "build.sc", s.toList) |