diff options
-rwxr-xr-x | build.sc | 6 | ||||
-rw-r--r-- | core/src/main/scala/mill/Main.scala | 86 | ||||
-rw-r--r-- | core/src/main/scala/mill/define/Task.scala | 113 | ||||
-rw-r--r-- | core/src/main/scala/mill/package.scala | 6 | ||||
-rw-r--r-- | core/src/test/scala/mill/DiscoveredTests.scala | 1 | ||||
-rw-r--r-- | core/src/test/scala/mill/EvaluationTests.scala | 1 | ||||
-rw-r--r-- | core/src/test/scala/mill/GraphTests.scala | 4 | ||||
-rw-r--r-- | core/src/test/scala/mill/JavaCompileJarTests.scala | 5 | ||||
-rw-r--r-- | core/src/test/scala/mill/TestGraphs.scala | 1 | ||||
-rw-r--r-- | scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala | 6 |
10 files changed, 122 insertions, 107 deletions
@@ -3,7 +3,7 @@ import mill._ import mill.scalaplugin._ -object Core extends Module { +object Core extends ScalaModule { def scalaVersion = "2.12.4" override def compileIvyDeps = Seq( Dep.Java("org.scala-lang", "scala-reflect", scalaVersion()) @@ -21,7 +21,7 @@ object Core extends Module { def basePath = pwd / 'core override def sources = pwd/'core/'src/'main/'scala } -object CoreTests extends Module { +object CoreTests extends ScalaModule { def scalaVersion = "2.12.4" override def projectDeps = Seq(Core) def basePath = pwd / 'scalaplugin @@ -39,7 +39,7 @@ object CoreTests extends Module { } } -object ScalaPlugin extends Module { +object ScalaPlugin extends ScalaModule { def scalaVersion = "2.12.4" override def projectDeps = Seq(Core) def basePath = pwd / 'scalaplugin diff --git a/core/src/main/scala/mill/Main.scala b/core/src/main/scala/mill/Main.scala index 1f43a3e9..0dc6707d 100644 --- a/core/src/main/scala/mill/Main.scala +++ b/core/src/main/scala/mill/Main.scala @@ -1,5 +1,6 @@ package mill +import ammonite.interp.Interpreter import ammonite.main.Scripts import ammonite.ops._ import ammonite.util.Res @@ -7,10 +8,9 @@ import mill.define.Task import mill.discover._ import mill.eval.Evaluator import mill.util.OSet - import ammonite.main.Scripts.pathScoptRead import ammonite.repl.Repl -import mill.discover.Router.EntryPoint + object Main { def timed[T](t: => T) = { val startTime = System.currentTimeMillis() @@ -100,44 +100,60 @@ object Main { (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() - - 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 - ) - - val res = ammonite.main.Scripts.runScript( - pwd, - syntheticPath, - interp.right.get, - Scripts.groupArgs(leftover) - ) - - handleWatchRes(res, true) - } + val loop = config.watch + do { + 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).right.get + repl.interp.initializePredef() + repl.run() + watchAndWait(repl.interp.watchedFiles) + } else { + val interp = ammonite.Main( + predefFile = Some(pwd / "build.sc") + ).instantiateInterpreter().right.get + + interp.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 + ) + + val res = ammonite.main.Scripts.runScript( + pwd, + syntheticPath, + interp, + Scripts.groupArgs(leftover) + ) + + handleWatchRes(res, true) + watchAndWait(interp.watchedFiles) + } + + } while(loop) } } + def watchAndWait(watched: Seq[(Path, Long)]) = { + println(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()) Thread.sleep(100) + } + def handleWatchRes[T](res: Res[T], printing: Boolean) = { val success = res match { case Res.Failure(msg) => diff --git a/core/src/main/scala/mill/define/Task.scala b/core/src/main/scala/mill/define/Task.scala index c256d3db..0e2591c6 100644 --- a/core/src/main/scala/mill/define/Task.scala +++ b/core/src/main/scala/mill/define/Task.scala @@ -1,7 +1,7 @@ package mill.define import mill.define.Applicative.Applyable -import mill.define.Task.targetImpl + import mill.eval.PathRef import mill.util.Args @@ -27,8 +27,62 @@ abstract class Task[+T] extends Task.Ops[T] with Applyable[T]{ } trait Target[+T] extends Task[T] -object Target{ +object Target extends Applicative.Applyer[Task, Task, Args]{ + implicit def apply[T](t: T): Target[T] = macro targetImpl[T] + + def apply[T](t: Task[T]): Target[T] = macro Cacher.impl0[Task, T] + + def command[T](t: T): Command[T] = macro commandImpl[T] + + def source(path: ammonite.ops.Path) = new Source(path) + + def command[T](t: Task[T]): Command[T] = new Command(t) + + def task[T](t: T): Task[T] = macro Applicative.impl[Task, T, Args] + def task[T](t: Task[T]): Task[T] = t + + def commandImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T]): c.Expr[Command[T]] = { + import c.universe._ + + c.Expr[Command[T]]( + q"new ${weakTypeOf[Command[T]]}(${Applicative.impl[Task, T, Args](c)(t).tree})" + ) + } + + def targetImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T]): c.Expr[Target[T]] = { + c.Expr[Target[T]]( + mill.define.Cacher.wrapCached(c)( + Applicative.impl[Task, T, Args](c)(t).tree + ) + ) + } + + def underlying[A](v: Task[A]) = v + def mapCtx[A, B](t: Task[A])(f: (A, Args) => B) = t.mapDest(f) + def zip() = new Task.Task0(()) + def zip[A](a: Task[A]) = a.map(Tuple1(_)) + def zip[A, B](a: Task[A], b: Task[B]) = a.zip(b) + def zip[A, B, C](a: Task[A], b: Task[B], c: Task[C]) = new Task[(A, B, C)]{ + val inputs = Seq(a, b, c) + def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2)) + } + def zip[A, B, C, D](a: Task[A], b: Task[B], c: Task[C], d: Task[D]) = new Task[(A, B, C, D)]{ + val inputs = Seq(a, b, c, d) + def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2), args[D](3)) + } + def zip[A, B, C, D, E](a: Task[A], b: Task[B], c: Task[C], d: Task[D], e: Task[E]) = new Task[(A, B, C, D, E)]{ + val inputs = Seq(a, b, c, d, e) + def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2), args[D](3), args[E](4)) + } + def zip[A, B, C, D, E, F](a: Task[A], b: Task[B], c: Task[C], d: Task[D], e: Task[E], f: Task[F]) = new Task[(A, B, C, D, E, F)]{ + val inputs = Seq(a, b, c, d, e, f) + def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2), args[D](3), args[E](4), args[F](5)) + } + def zip[A, B, C, D, E, F, G](a: Task[A], b: Task[B], c: Task[C], d: Task[D], e: Task[E], f: Task[F], g: Task[G]) = new Task[(A, B, C, D, E, F, G)]{ + val inputs = Seq(a, b, c, d, e, f, g) + def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2), args[D](3), args[E](4), args[F](5), args[G](6)) + } } class TargetImpl[+T](t: Task[T], enclosing: String) extends Target[T] { val inputs = Seq(t) @@ -49,11 +103,9 @@ class Source(path: ammonite.ops.Path) extends Task[PathRef]{ val inputs = Nil } -object Task extends Applicative.Applyer[Task, Task, Args]{ - def apply[T](t: T): Target[T] = macro targetImpl[T] - def underlying[A](v: Task[A]) = v +object Task { + - def source(path: ammonite.ops.Path) = new Source(path) trait Module extends mill.define.Cacher[Task, Target]{ def wrapCached[T](t: Task[T], enclosing: String): Target[T] = new TargetImpl(t, enclosing) @@ -66,30 +118,6 @@ object Task extends Applicative.Applyer[Task, Task, Args]{ - def apply[T](t: Task[T]): Target[T] = macro Cacher.impl0[Task, T] - - def command[T](t: T): Command[T] = macro commandImpl[T] - - def command[T](t: Task[T]): Command[T] = new Command(t) - - def task[T](t: T): Task[T] = macro Applicative.impl[Task, T, Args] - def task[T](t: Task[T]): Task[T] = t - - def commandImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T]): c.Expr[Command[T]] = { - import c.universe._ - - c.Expr[Command[T]]( - q"new ${weakTypeOf[Command[T]]}(${Applicative.impl[Task, T, Args](c)(t).tree})" - ) - } - - def targetImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T]): c.Expr[Target[T]] = { - c.Expr[Target[T]]( - mill.define.Cacher.wrapCached(c)( - Applicative.impl[Task, T, Args](c)(t).tree - ) - ) - } abstract class Ops[+T]{ this: Task[T] => def map[V](f: T => V) = new Task.Mapped(this, f) @@ -128,28 +156,5 @@ object Task extends Applicative.Applyer[Task, Task, Args]{ - def mapCtx[A, B](t: Task[A])(f: (A, Args) => B) = t.mapDest(f) - def zip() = new Task.Task0(()) - def zip[A](a: Task[A]) = a.map(Tuple1(_)) - def zip[A, B](a: Task[A], b: Task[B]) = a.zip(b) - def zip[A, B, C](a: Task[A], b: Task[B], c: Task[C]) = new Task[(A, B, C)]{ - val inputs = Seq(a, b, c) - def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2)) - } - def zip[A, B, C, D](a: Task[A], b: Task[B], c: Task[C], d: Task[D]) = new Task[(A, B, C, D)]{ - val inputs = Seq(a, b, c, d) - def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2), args[D](3)) - } - def zip[A, B, C, D, E](a: Task[A], b: Task[B], c: Task[C], d: Task[D], e: Task[E]) = new Task[(A, B, C, D, E)]{ - val inputs = Seq(a, b, c, d, e) - def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2), args[D](3), args[E](4)) - } - def zip[A, B, C, D, E, F](a: Task[A], b: Task[B], c: Task[C], d: Task[D], e: Task[E], f: Task[F]) = new Task[(A, B, C, D, E, F)]{ - val inputs = Seq(a, b, c, d, e, f) - def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2), args[D](3), args[E](4), args[F](5)) - } - def zip[A, B, C, D, E, F, G](a: Task[A], b: Task[B], c: Task[C], d: Task[D], e: Task[E], f: Task[F], g: Task[G]) = new Task[(A, B, C, D, E, F, G)]{ - val inputs = Seq(a, b, c, d, e, f, g) - def evaluate(args: Args) = (args[A](0), args[B](1), args[C](2), args[D](3), args[E](4), args[F](5), args[G](6)) - } + } diff --git a/core/src/main/scala/mill/package.scala b/core/src/main/scala/mill/package.scala index 81d87426..7dcb83d8 100644 --- a/core/src/main/scala/mill/package.scala +++ b/core/src/main/scala/mill/package.scala @@ -1,9 +1,9 @@ import mill.util.JsonFormatters package object mill extends JsonFormatters{ - val T = define.Task - type T[T] = define.Task[T] + val T = define.Target + type T[T] = define.Target[T] val PathRef = mill.eval.PathRef type PathRef = mill.eval.PathRef - + type Module = define.Task.Module } diff --git a/core/src/test/scala/mill/DiscoveredTests.scala b/core/src/test/scala/mill/DiscoveredTests.scala index 1a0893df..96c84d1b 100644 --- a/core/src/test/scala/mill/DiscoveredTests.scala +++ b/core/src/test/scala/mill/DiscoveredTests.scala @@ -2,7 +2,6 @@ package mill import utest._ import TestUtil.test -import mill.define.Task.Module import mill.discover.{Discovered, Mirror} object DiscoveredTests extends TestSuite{ diff --git a/core/src/test/scala/mill/EvaluationTests.scala b/core/src/test/scala/mill/EvaluationTests.scala index a5fd72a8..053fdd09 100644 --- a/core/src/test/scala/mill/EvaluationTests.scala +++ b/core/src/test/scala/mill/EvaluationTests.scala @@ -3,7 +3,6 @@ package mill import mill.TestUtil.{Test, test} import mill.define.{Target, Task} -import mill.define.Task.Module import mill.discover.Discovered import mill.eval.Evaluator import mill.util.OSet diff --git a/core/src/test/scala/mill/GraphTests.scala b/core/src/test/scala/mill/GraphTests.scala index d19b747d..a9a31971 100644 --- a/core/src/test/scala/mill/GraphTests.scala +++ b/core/src/test/scala/mill/GraphTests.scala @@ -1,10 +1,8 @@ package mill import utest._ -import TestUtil.test import mill.define.Task -import mill.define.Task.Module -import mill.discover.{Discovered, Mirror} +import mill.discover.Discovered import mill.eval.Evaluator import mill.util.OSet diff --git a/core/src/test/scala/mill/JavaCompileJarTests.scala b/core/src/test/scala/mill/JavaCompileJarTests.scala index e19073a4..3e470b9d 100644 --- a/core/src/test/scala/mill/JavaCompileJarTests.scala +++ b/core/src/test/scala/mill/JavaCompileJarTests.scala @@ -30,7 +30,7 @@ object JavaCompileJarTests extends TestSuite{ mkdir(pwd / 'target / 'workspace / 'javac) cp(javacSrcPath, javacDestPath) - object Build extends Task.Module{ + object Build extends Module{ def sourceRootPath = javacDestPath / 'src def resourceRootPath = javacDestPath / 'resources @@ -41,7 +41,7 @@ object JavaCompileJarTests extends TestSuite{ def sourceRoot = T.source{ sourceRootPath } def resourceRoot = T.source{ resourceRootPath } def allSources = T{ ls.rec(sourceRoot().path).map(PathRef(_)) } - def classFiles = T{ compileAll(Task.ctx().dest, allSources()) } + def classFiles = T{ compileAll(T.ctx().dest, allSources()) } def jar = T{ jarUp(resourceRoot, classFiles) } def run(mainClsName: String) = T.command{ @@ -164,7 +164,6 @@ object JavaCompileJarTests extends TestSuite{ evalCount3 == 1 ) - } } } diff --git a/core/src/test/scala/mill/TestGraphs.scala b/core/src/test/scala/mill/TestGraphs.scala index 1e69fc0b..094496c1 100644 --- a/core/src/test/scala/mill/TestGraphs.scala +++ b/core/src/test/scala/mill/TestGraphs.scala @@ -1,6 +1,5 @@ package mill -import mill.define.Task.Module import mill.TestUtil.test class TestGraphs(){ diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala b/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala index a99cf71b..80929088 100644 --- a/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala +++ b/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala @@ -194,10 +194,10 @@ trait ScalaModule extends Module{ def sources = T.source{ basePath / 'src } def resources = T.source{ basePath / 'resources } def compile = T{ - compileScala(scalaVersion(), sources(), compileDepClasspath(), Task.ctx().dest) + compileScala(scalaVersion(), sources(), compileDepClasspath(), T.ctx().dest) } def assembly = T{ - val dest = Task.ctx().dest + val dest = T.ctx().dest createAssembly( dest, (runDepClasspath().filter(_.path.ext != "pom") ++ Seq(resources(), compile())).map(_.path).filter(exists) @@ -207,7 +207,7 @@ trait ScalaModule extends Module{ def classpath = T{ Seq(resources(), compile()) } def jar = T{ - val dest = Task.ctx().dest + val dest = T.ctx().dest createJar(dest, Seq(resources(), compile()).map(_.path).filter(exists)) PathRef(dest) } |