summaryrefslogtreecommitdiff
path: root/main/src/mill/main/MainRunner.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-02-19 22:28:01 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-02-19 22:28:01 -0800
commit09b5b5639d4885e2d32b521d97b0870879cf86f6 (patch)
treef65482af6b7c3df83949990616d15d19f32d8bee /main/src/mill/main/MainRunner.scala
parent3e66c8630be00c01f2cb7720e988a94af338de18 (diff)
downloadmill-09b5b5639d4885e2d32b521d97b0870879cf86f6.tar.gz
mill-09b5b5639d4885e2d32b521d97b0870879cf86f6.tar.bz2
mill-09b5b5639d4885e2d32b521d97b0870879cf86f6.zip
`--watch` now works in client-server mode, with the server probing the lockfile to see if the client is still alive
Diffstat (limited to 'main/src/mill/main/MainRunner.scala')
-rw-r--r--main/src/mill/main/MainRunner.scala18
1 files changed, 16 insertions, 2 deletions
diff --git a/main/src/mill/main/MainRunner.scala b/main/src/mill/main/MainRunner.scala
index 7087dbc7..f6aec9c8 100644
--- a/main/src/mill/main/MainRunner.scala
+++ b/main/src/mill/main/MainRunner.scala
@@ -7,26 +7,40 @@ import ammonite.ops.Path
import ammonite.util._
import mill.define.Discover
import mill.eval.{Evaluator, PathRef}
+import mill.main.MainRunner.WatchInterrupted
import mill.util.PrintLogger
import mill.main.RunScript
import upickle.Js
-
+object MainRunner{
+ case class WatchInterrupted(mr: MainRunner) extends Exception
+}
/**
* Customized version of [[ammonite.MainRunner]], allowing us to run Mill
* `build.sc` scripts with mill-specific tweaks such as a custom
* `scriptCodeWrapper` or with a persistent evaluator between runs.
*/
-class MainRunner(config: ammonite.main.Cli.Config,
+class MainRunner(val config: ammonite.main.Cli.Config,
outprintStream: PrintStream,
errPrintStream: PrintStream,
stdIn: InputStream,
+ interruptWatch: () => Boolean,
var lastEvaluator: Option[(Seq[(Path, Long)], Evaluator[Any])] = None)
extends ammonite.MainRunner(
config, outprintStream, errPrintStream,
stdIn, outprintStream, errPrintStream
){
+ override def watchAndWait(watched: Seq[(Path, Long)]) = {
+ printInfo(s"Watching for changes to ${watched.length} files... (Ctrl-C to exit)")
+ def statAll() = watched.forall{ case (file, lastMTime) =>
+ Interpreter.pathSignature(file) == lastMTime
+ }
+ while(statAll()) {
+ if (interruptWatch()) throw WatchInterrupted(this)
+ Thread.sleep(100)
+ }
+ }
override def runScript(scriptPath: Path, scriptArgs: List[String]) =
watchLoop(