summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-11-15 13:15:21 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-11-15 13:15:21 -0800
commit50aabeaf229e939b2189067c3ea9ce284d538328 (patch)
tree780455a5cd8ead3c9cffcd4b13a777d34e37be01 /core
parent9c7f1930e839be67980e50c614f7c8582b8a707d (diff)
downloadmill-50aabeaf229e939b2189067c3ea9ce284d538328.tar.gz
mill-50aabeaf229e939b2189067c3ea9ce284d538328.tar.bz2
mill-50aabeaf229e939b2189067c3ea9ce284d538328.zip
First pass at cleaning up `build.sc` file syntax
Diffstat (limited to 'core')
-rw-r--r--core/src/main/scala/mill/Main.scala103
1 files changed, 91 insertions, 12 deletions
diff --git a/core/src/main/scala/mill/Main.scala b/core/src/main/scala/mill/Main.scala
index 9a3ade04..87395113 100644
--- a/core/src/main/scala/mill/Main.scala
+++ b/core/src/main/scala/mill/Main.scala
@@ -1,14 +1,18 @@
package mill
+import ammonite.Main
+import ammonite.main.Scripts
import ammonite.ops._
-import ammonite.util.{Name, Res}
+import ammonite.util.{Colors, Name, Res}
import mill.define.Task
import mill.discover._
import mill.eval.Evaluator
import mill.util.OSet
import play.api.libs.json.Format
-
+import scala.annotation.tailrec
+import ammonite.main.Scripts.pathScoptRead
+import ammonite.repl.Repl
object Main {
def apply[T: Discovered](args: Seq[String], obj: T, watch: Path => Unit) = {
val startTime = System.currentTimeMillis()
@@ -58,21 +62,96 @@ object Main {
def main(args: Array[String]): Unit = {
+ case class Config(home: ammonite.ops.Path = pwd/'out/'ammonite,
+ colored: Option[Boolean] = None,
+ help: Boolean = false,
+ repl: Boolean = false,
+ watch: Boolean = false)
+ import ammonite.main.Cli.Arg
+ val signature = Seq(
+ Arg[Config, Path](
+ "home", Some('h'),
+ "The home directory of the REPL; where it looks for config and caches",
+ (c, v) => c.copy(home = v)
+ ),
+ Arg[Config, Unit](
+ "help", None,
+ """Print this message""".stripMargin,
+ (c, v) => c.copy(help = true)
+ ),
+ Arg[Config, Boolean](
+ "color", None,
+ """Enable or disable colored output; by default colors are enabled
+ |in both REPL and scripts if the console is interactive, and disabled
+ |otherwise""".stripMargin,
+ (c, v) => c.copy(colored = Some(v))
+ ),
+ Arg[Config, Unit](
+ "repl", Some('r'),
+ "Open a build REPL",
+ (c, v) => c.copy(repl = true)
+ ),
+ Arg[Config, Unit](
+ "watch", Some('w'),
+ "Watch and re-run your build when it changes",
+ (c, v) => c.copy(watch = true)
+ )
+ )
+ ammonite.main.Cli.groupArgs(args.toList, signature, Config()) match{
+ case Left(err) =>
+ case Right((config, leftover)) =>
+ if (config.help){
+ val leftMargin = signature.map(ammonite.main.Cli.showArg(_).length).max + 2
+ println(ammonite.main.Cli.formatBlock(signature, leftMargin).mkString("\n"))
+ }else if (config.repl){
+ val repl = ammonite.Main(
+ predefFile = Some(pwd/"build.sc")
+ ).instantiateRepl(remoteLogger = None)
+ repl.right.get.interp.initializePredef()
+ repl.right.get.run()
+ }else {
+ val interp = ammonite.Main(
+ predefFile = Some(pwd/"build.sc")
+ ).instantiateInterpreter()
- val List(buildFile, rest @_*) = args.toList
-
- ammonite.Main().instantiateInterpreter() match{
- case Left(problems) => pprint.log(problems)
- case Right(interp) =>
- val result = ammonite.main.Scripts.runScript(pwd, Path(buildFile, pwd), interp, Nil)
+ interp.right.get.initializePredef()
+ val syntheticPath = pwd/'out/"run.sc"
+ write.over(
+ syntheticPath,
+ """@main def run(args: String*) = mill.Main(args, ammonite.predef.FilePredef, interp.watch)
+ |
+ |@main def idea() = mill.scalaplugin.GenIdea(ammonite.predef.FilePredef)
+ """.stripMargin
+ )
- if (!result.isSuccess) println(result)
- else{
- val (obj, discovered) = result.asInstanceOf[Res.Success[(Any, Discovered[Any])]].s
- apply(rest, obj, _ => ())(discovered)
+ val res = ammonite.main.Scripts.runScript(
+ pwd,
+ syntheticPath,
+ interp.right.get,
+ Scripts.groupArgs(leftover)
+ )
+ handleWatchRes(res, true)
}
}
}
+ def handleWatchRes[T](res: Res[T], printing: Boolean) = {
+ val success = res match {
+ case Res.Failure(msg) =>
+ println(msg)
+ false
+ case Res.Exception(ex, s) =>
+ println(
+ Repl.showException(ex, fansi.Color.Red, fansi.Attr.Reset, fansi.Color.Green)
+ )
+ false
+
+ case Res.Success(value) =>
+ if (printing && value != ()) println(pprint.PPrinter.BlackWhite(value))
+ true
+ case Res.Skip => true // do nothing on success, everything's already happened
+ }
+ success
+ }
}