From 517abc2c9c15511b3be7c7d3cf0c27b7a052534c Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 16:39:33 +0800 Subject: [PATCH 01/19] compiles --- .../src/mill/bsp/worker/MillBuildServer.scala | 2 +- build.sc | 4 +- .../contrib/buildinfo/BuildInfoTests.scala | 7 +- .../playlib/src/mill/playlib/PlayModule.scala | 3 +- .../mill/contrib/versionfile/Version.scala | 8 +-- .../misc/5-module-run-task/bar/src/Bar.scala | 25 +++++++ example/misc/5-module-run-task/build.sc | 36 ++++++++++ .../misc/5-module-run-task/foo/src/Foo.scala | 14 ++++ .../mill/integration/ExampleTestSuite.scala | 3 +- main/core/src/mill/define/Discover.scala | 2 +- main/core/src/mill/define/Task.scala | 9 ++- main/src/mill/main/ResolveCore.scala | 4 +- main/src/mill/main/TokenReaders.scala | 70 +++++++++++-------- runner/src/mill/runner/MillCliConfig.scala | 6 +- .../src/mill/scalajslib/ScalaJSModule.scala | 4 +- .../mill/scalajslib/HelloJSWorldTests.scala | 2 +- .../mill/scalajslib/MultiModuleTests.scala | 2 +- .../mill/scalajslib/NodeJSConfigTests.scala | 2 +- scalalib/src/mill/scalalib/JavaModule.scala | 9 +-- .../src/mill/scalalib/HelloWorldTests.scala | 14 ++-- .../scalalib/ScalaVersionsRangesTests.scala | 2 +- .../scalanativelib/ScalaNativeModule.scala | 4 +- 22 files changed, 163 insertions(+), 69 deletions(-) create mode 100644 example/misc/5-module-run-task/bar/src/Bar.scala create mode 100644 example/misc/5-module-run-task/build.sc create mode 100644 example/misc/5-module-run-task/foo/src/Foo.scala diff --git a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala index 7a948a382bd..ded5a0095f0 100644 --- a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala +++ b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala @@ -538,7 +538,7 @@ class MillBuildServer( case m: JavaModule => m }.get val args = params.getArguments.getOrElse(Seq.empty[String]) - val runTask = module.run(args: _*) + val runTask = module.run(T.task(mainargs.Leftover(args:_*))) val runResult = evaluator.evaluate( Strict.Agg(runTask), Utils.getBspLoggedReporterPool(runParams.getOriginId, bspIdByModule, client), diff --git a/build.sc b/build.sc index 709cf76f2ea..55ad124b458 100644 --- a/build.sc +++ b/build.sc @@ -127,7 +127,7 @@ object Deps { val lambdaTest = ivy"de.tototec:de.tobiasroeser.lambdatest:0.8.0" val log4j2Core = ivy"org.apache.logging.log4j:log4j-core:2.20.0" val osLib = ivy"com.lihaoyi::os-lib:0.9.1" - val mainargs = ivy"com.lihaoyi::mainargs:0.4.0" + val mainargs = ivy"com.lihaoyi::mainargs:0.5.0-M1" val millModuledefsVersion = "0.10.9" val millModuledefsString = s"com.lihaoyi::mill-moduledefs:${millModuledefsVersion}" val millModuledefs = ivy"${millModuledefsString}" @@ -726,7 +726,7 @@ object main extends MillModule { } object testkit extends MillInternalModule with MillAutoTestSetup { - def moduleDeps = Seq(core, util) + def moduleDeps = Seq(core, util, main) } def testModuleDeps = super.testModuleDeps ++ Seq(testkit) diff --git a/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala b/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala index ddb0ec6d777..94ec4e1b80e 100644 --- a/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala +++ b/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala @@ -159,7 +159,8 @@ object BuildInfoTests extends TestSuite { "run" - workspaceTest(BuildInfoPlain, "scala") { eval => val runResult = eval.outPath / "hello-mill" val Right((result, evalCount)) = - eval.apply(BuildInfoPlain.run(runResult.toString)) + + eval.apply(BuildInfoPlain.run(T.task(mainargs.Leftover(runResult.toString)))) assert( os.exists(runResult), @@ -173,7 +174,7 @@ object BuildInfoTests extends TestSuite { val runResult = eval.outPath / "hello-mill" val Right((result2, evalCount2)) = - eval.apply(BuildInfoStatic.run(runResult.toString)) + eval.apply(BuildInfoStatic.run(T.task(mainargs.Leftover(runResult.toString)))) assert(os.exists(buildInfoSourcePath(eval))) assert(!os.exists(buildInfoResourcePath(eval))) @@ -184,7 +185,7 @@ object BuildInfoTests extends TestSuite { "java" - workspaceTest(BuildInfoJava, "java") { eval => val runResult = eval.outPath / "hello-mill" val Right((result, evalCount)) = - eval.apply(BuildInfoJava.run(runResult.toString)) + eval.apply(BuildInfoJava.run(T.task(mainargs.Leftover(runResult.toString)))) assert( os.exists(runResult), diff --git a/contrib/playlib/src/mill/playlib/PlayModule.scala b/contrib/playlib/src/mill/playlib/PlayModule.scala index b1bc268c372..829148144c5 100644 --- a/contrib/playlib/src/mill/playlib/PlayModule.scala +++ b/contrib/playlib/src/mill/playlib/PlayModule.scala @@ -1,5 +1,6 @@ package mill.playlib +import mill.define.Task import mill.playlib.api.Versions import mill.scalalib._ import mill.{Agg, T} @@ -17,7 +18,7 @@ trait PlayApiModule extends Dependencies with Router with Server { override def sources = T.sources { millSourcePath } } - def start(args: String*) = T.command { run(args: _*) } + def start(args: Task[mainargs.Leftover[String]]) = T.command { run(args) } } trait PlayModule extends PlayApiModule with Static with Twirl diff --git a/contrib/versionfile/src/mill/contrib/versionfile/Version.scala b/contrib/versionfile/src/mill/contrib/versionfile/Version.scala index 483912afc16..362283c66a2 100644 --- a/contrib/versionfile/src/mill/contrib/versionfile/Version.scala +++ b/contrib/versionfile/src/mill/contrib/versionfile/Version.scala @@ -69,8 +69,8 @@ object Version { implicit val readWriter: ReadWriter[Version] = readwriter[String].bimap(_.toString, Version.of) - implicit val read: mainargs.TokensReader[Version] = new mainargs.TokensReader[Version]( - "", - s => Right(Version.of(s.last)) - ) + implicit val read: mainargs.TokensReader.Simple[Version] = new mainargs.TokensReader.Simple[Version] { + def shortName = "" + def read(s: Seq[String]) = Right(Version.of(s.last)) + } } diff --git a/example/misc/5-module-run-task/bar/src/Bar.scala b/example/misc/5-module-run-task/bar/src/Bar.scala new file mode 100644 index 00000000000..52a994dd755 --- /dev/null +++ b/example/misc/5-module-run-task/bar/src/Bar.scala @@ -0,0 +1,25 @@ +package bar +object Bar { + def main(args: Array[String]) = { + println("LOLS") + val Array(sourcesStrJoined, destStr) = args + val sourceStrs = sourcesStrJoined.split(",") + println("sourceStrs " + sourceStrs.toList) + println("destStr " + destStr) + val dest = os.Path(destStr) + for(sourceStr <- sourceStrs){ + val sourcePath = os.Path(sourceStr) + println("sourcePath " + sourcePath) + for(p <- os.walk(sourcePath) if p.ext == "scala"){ + println("p " + p) + val text = os.read(p) + println("text " + text) + val mangledText = text.replace("hello", "HELLO") + println("mangledText " + mangledText) + val fileDest = dest / (p.subRelativeTo(sourcePath)) + println("fileDest " + fileDest) + os.write(fileDest, mangledText) + } + } + } +} diff --git a/example/misc/5-module-run-task/build.sc b/example/misc/5-module-run-task/build.sc new file mode 100644 index 00000000000..88065174cc1 --- /dev/null +++ b/example/misc/5-module-run-task/build.sc @@ -0,0 +1,36 @@ +import mill._, scalalib._ + +trait MyModule extends ScalaModule{ + def scalaVersion = "2.13.8" +} + +object foo extends MyModule { + def moduleDeps = Seq(bar) + def ivyDeps = Agg(ivy"com.lihaoyi::mainargs:0.4.0") + def sources = T{ + val dest = bar.run( + T.task{ + mainargs.Leftover(super.sources().map(_.path).mkString(","), T.dest.toString()) + } + ).mapCtx((x, y) => y.dest)() + + Seq(PathRef(dest)) + } +} + +object bar extends MyModule{ + def ivyDeps = Agg(ivy"com.lihaoyi::os-lib:0.9.1") +} + +// explanation + +/** Usage + +> ./mill show foo.sources +sdad + +> ./mill foo.run +asdas + + +*/ diff --git a/example/misc/5-module-run-task/foo/src/Foo.scala b/example/misc/5-module-run-task/foo/src/Foo.scala new file mode 100644 index 00000000000..bc1ef1e8b66 --- /dev/null +++ b/example/misc/5-module-run-task/foo/src/Foo.scala @@ -0,0 +1,14 @@ +package foo +import mainargs.{main, ParserForMethods, arg} +object Foo { + val value = "hello" + + @main + def main(@arg(name = "foo-text") fooText: String, + @arg(name = "bar-text") barText: String): Unit = { + println("Foo.value: " + Foo.value) + bar.Bar.printText(barText) + } + + def main(args: Array[String]): Unit = ParserForMethods(this).runOrExit(args) +} diff --git a/example/src/mill/integration/ExampleTestSuite.scala b/example/src/mill/integration/ExampleTestSuite.scala index 20490b19a09..506f1d2fc7a 100644 --- a/example/src/mill/integration/ExampleTestSuite.scala +++ b/example/src/mill/integration/ExampleTestSuite.scala @@ -50,10 +50,9 @@ object ExampleTestSuite extends IntegrationTestSuite { val usageComment = parsed.collect { case ("example", txt) => txt }.mkString("\n\n") val commandBlocks = ("\n" + usageComment.trim).split("\n> ").filter(_.nonEmpty) - "\n(" for (commandBlock <- commandBlocks) processCommandBlock(workspaceRoot, commandBlock) } finally { - os.remove.all(workspaceRoot / "out") +// os.remove.all(workspaceRoot / "out") } } } diff --git a/main/core/src/mill/define/Discover.scala b/main/core/src/mill/define/Discover.scala index 7e577e4d126..62eafadd8ed 100644 --- a/main/core/src/mill/define/Discover.scala +++ b/main/core/src/mill/define/Discover.scala @@ -114,7 +114,7 @@ object Discover { } c.Expr[Discover[T]]( - q"_root_.mill.define.Discover(_root_.scala.collection.immutable.Map(..$mapping))" + q"import mill.main.TokenReaders._; _root_.mill.define.Discover(_root_.scala.collection.immutable.Map(..$mapping))" ) } } diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index 2f5cfdf5881..ee84601d72c 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -47,7 +47,7 @@ object Task { abstract class Ops[+T] { this: Task[T] => def map[V](f: T => V): Task[V] = new Task.Mapped(this, f) - + def mapCtx[V](f: (T, mill.api.Ctx) => Result[V]) = new Task.MappedCtx(this, f) def filter(f: T => Boolean) = this def withFilter(f: T => Boolean) = this def zip[V](other: Task[V]): Task[(T, V)] = new Task.Zipped(this, other) @@ -74,10 +74,17 @@ object Task { ) } } + private[define] class Mapped[+T, +V](source: Task[T], f: T => V) extends Task[V] { def evaluate(ctx: mill.api.Ctx) = f(ctx.arg(0)) val inputs = List(source) } + + private[define] class MappedCtx[+T, +V](source: Task[T], f: (T, mill.api.Ctx) => Result[V]) extends Task[V] { + def evaluate(ctx: mill.api.Ctx) = f(ctx.args(0).asInstanceOf[T], ctx) + val inputs = List(source) + } + private[define] class Zipped[+T, +V](source1: Task[T], source2: Task[V]) extends Task[(T, V)] { def evaluate(ctx: mill.api.Ctx) = (ctx.arg(0), ctx.arg(1)) val inputs = List(source1, source2) diff --git a/main/src/mill/main/ResolveCore.scala b/main/src/mill/main/ResolveCore.scala index 8807d3acf51..a863e9c9af6 100644 --- a/main/src/mill/main/ResolveCore.scala +++ b/main/src/mill/main/ResolveCore.scala @@ -245,8 +245,8 @@ object ResolveCore { ep._2.argSigs0, allowPositional = true, allowRepeats = false, - allowLeftover = ep._2.leftoverArgSig.nonEmpty - ).flatMap { grouped => + allowLeftover = ep._2.argSigs0.exists(_.reader.isLeftover) + ).flatMap { (grouped: TokenGrouping[_]) => mainargs.Invoker.invoke( target, ep._2.asInstanceOf[MainData[_, Any]], diff --git a/main/src/mill/main/TokenReaders.scala b/main/src/mill/main/TokenReaders.scala index c1f57f1c431..0a11c77fff5 100644 --- a/main/src/mill/main/TokenReaders.scala +++ b/main/src/mill/main/TokenReaders.scala @@ -7,49 +7,57 @@ import mill.define.{SelectMode, Target, Task} case class Tasks[T](value: Seq[mill.define.NamedTask[T]]) object Tasks { - class TokenReader[T]() - extends mainargs.TokensReader[Tasks[T]]( - shortName = "", - read = s => - ResolveTasks.resolve( - Evaluator.currentEvaluator.get, - s, - SelectMode.Single - ).map(x => Tasks(x.asInstanceOf[Seq[mill.define.NamedTask[T]]])), - alwaysRepeatable = false, - allowEmpty = false - ) + class TokenReader[T]() extends mainargs.TokensReader.Simple[Tasks[T]]{ + def shortName = "" + def read(s: Seq[String]) = { + ResolveTasks.resolve( + Evaluator.currentEvaluator.get, + s, + SelectMode.Single + ).map(x => Tasks(x.asInstanceOf[Seq[mill.define.NamedTask[T]]])) + } + override def alwaysRepeatable = false + override def allowEmpty = false + } } -class EvaluatorTokenReader[T]() - extends mainargs.TokensReader[mill.eval.Evaluator]( - shortName = "", - read = s => Right(Evaluator.currentEvaluator.get.asInstanceOf[mill.eval.Evaluator]), - alwaysRepeatable = false, - allowEmpty = true, - noTokens = true - ) +class EvaluatorTokenReader[T]() extends mainargs.TokensReader.Simple[mill.eval.Evaluator]{ + def shortName = "" + def read(s: Seq[String]) = Right(Evaluator.currentEvaluator.get.asInstanceOf[mill.eval.Evaluator]) + override def alwaysRepeatable = false + override def allowEmpty = true +} /** * Transparently handle `Task[T]` like simple `T` but lift the result into a T.task. */ -class TaskTokenReader[T](tokensReaderOfT: TokensReader[T]) - extends mainargs.TokensReader[Task[T]]( - shortName = tokensReaderOfT.shortName, - read = s => tokensReaderOfT.read(s).map(t => Target.task(t)), - alwaysRepeatable = tokensReaderOfT.alwaysRepeatable, - allowEmpty = tokensReaderOfT.allowEmpty, - noTokens = tokensReaderOfT.noTokens - ) +class SimpleTaskTokenReader[T](tokensReaderOfT: TokensReader.Simple[T]) + extends mainargs.TokensReader.Simple[Task[T]]{ + def shortName = tokensReaderOfT.shortName + def read(s: Seq[String]) = tokensReaderOfT.read(s).map(t => Target.task(t)) + override def alwaysRepeatable = tokensReaderOfT.alwaysRepeatable + override def allowEmpty = tokensReaderOfT.allowEmpty +} + +class LeftoverTaskTokenReader[T](tokensReaderOfT: TokensReader.Leftover[T, _]) + extends mainargs.TokensReader.Leftover[Task[T], T]{ + def read(strs: Seq[String]): Either[String, Task[T]] = tokensReaderOfT.read(strs).map(t => Target.task(t)) + def wrapped = tokensReaderOfT +} object TokenReaders { + implicitly[TokensReader[Task[mainargs.Leftover[String]]]] implicit def millEvaluatorTokenReader[T] = new mill.main.EvaluatorTokenReader[T]() implicit def millTasksTokenReader[T]: mainargs.TokensReader[Tasks[T]] = new mill.main.Tasks.TokenReader[T]() + implicit def millTaskTokenReader[T](implicit - tokensReaderOfT: TokensReader[T] - ): TokensReader[Task[T]] = - new TaskTokenReader[T](tokensReaderOfT) + tokensReaderOfT: TokensReader.ShortNamed[T] + ): TokensReader.ShortNamed[Task[T]] = tokensReaderOfT match{ + case t: TokensReader.Simple[_] => new SimpleTaskTokenReader[T](t) + case t: TokensReader.Leftover[_, _] => new LeftoverTaskTokenReader[T](t) + } + } diff --git a/runner/src/mill/runner/MillCliConfig.scala b/runner/src/mill/runner/MillCliConfig.scala index 3daac7627ff..118d803e7ff 100644 --- a/runner/src/mill/runner/MillCliConfig.scala +++ b/runner/src/mill/runner/MillCliConfig.scala @@ -218,8 +218,10 @@ object MillCliConfigParser { /** * Additional [[mainargs.TokensReader]] instance to teach it how to read Ammonite paths */ - implicit object PathRead - extends mainargs.TokensReader[os.Path]("path", strs => Right(os.Path(strs.last, os.pwd))) + implicit object PathRead extends mainargs.TokensReader.Simple[os.Path]{ + def shortName = "path" + def read(strs: Seq[String]) = Right(os.Path(strs.last, os.pwd)) + } private[this] lazy val parser: ParserForClass[MillCliConfig] = mainargs.ParserForClass[MillCliConfig] diff --git a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala index 181639b6611..64c2b1aa0b3 100644 --- a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala +++ b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala @@ -122,9 +122,9 @@ trait ScalaJSModule extends scalalib.ScalaModule { outer => ) } - override def runLocal(args: String*): Command[Unit] = T.command { run(args: _*) } + override def runLocal(args: Task[mainargs.Leftover[String]]): Command[Unit] = T.command { run(args) } - override def run(args: String*): Command[Unit] = T.command { + override def run(args: Task[mainargs.Leftover[String]]): Command[Unit] = T.command { finalMainClassOpt() match { case Left(err) => Result.Failure(err) case Right(_) => diff --git a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala index 50ae3bc5265..cc4e73b9865 100644 --- a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala +++ b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala @@ -273,7 +273,7 @@ object HelloJSWorldTests extends TestSuite { } def checkRun(scalaVersion: String, scalaJSVersion: String): Unit = { - val task = HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).run() + val task = HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).run(T.task(mainargs.Leftover[String]())) val Right((_, evalCount)) = helloWorldEvaluator(task) diff --git a/scalajslib/test/src/mill/scalajslib/MultiModuleTests.scala b/scalajslib/test/src/mill/scalajslib/MultiModuleTests.scala index 265204e8c36..036a0a44c24 100644 --- a/scalajslib/test/src/mill/scalajslib/MultiModuleTests.scala +++ b/scalajslib/test/src/mill/scalajslib/MultiModuleTests.scala @@ -64,7 +64,7 @@ object MultiModuleTests extends TestSuite { } test("run") { - val command = MultiModule.client.run() + val command = MultiModule.client.run(T.task(mainargs.Leftover[String]())) val Right((_, evalCount)) = evaluator(command) diff --git a/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala b/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala index 34f3c77b685..854ae5f16ed 100644 --- a/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala +++ b/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala @@ -92,7 +92,7 @@ object NodeJSConfigTests extends TestSuite { } def checkRun(nodeArgs: List[String], notNodeArgs: List[String]): Unit = { - checkLog(HelloJSWorld.helloJsWorld(scalaVersion, nodeArgs).run(), nodeArgs, notNodeArgs) + checkLog(HelloJSWorld.helloJsWorld(scalaVersion, nodeArgs).run(T.task(mainargs.Leftover[String]())), nodeArgs, notNodeArgs) } "run" - { diff --git a/scalalib/src/mill/scalalib/JavaModule.scala b/scalalib/src/mill/scalalib/JavaModule.scala index df95487d3dc..2a9591a093a 100644 --- a/scalalib/src/mill/scalalib/JavaModule.scala +++ b/scalalib/src/mill/scalalib/JavaModule.scala @@ -18,6 +18,7 @@ import mill.scalalib.bsp.{BspBuildTarget, BspModule} import mill.scalalib.publish.Artifact import os.Path + /** * Core configuration required to compile a single Java compilation target */ @@ -706,25 +707,25 @@ trait JavaModule * since the code can dirty the parent Mill process and potentially leave it * in a bad state. */ - def runLocal(args: String*): Command[Unit] = T.command { + def runLocal(args: Task[mainargs.Leftover[String]]): Command[Unit] = T.command { Jvm.runLocal( finalMainClass(), runClasspath().map(_.path), - args + args().value ) } /** * Runs this module's code in a subprocess and waits for it to finish */ - def run(args: String*): Command[Unit] = T.command { + def run(args: Task[mainargs.Leftover[String]]): Command[Unit] = T.command { try Result.Success( Jvm.runSubprocess( finalMainClass(), runClasspath().map(_.path), forkArgs(), forkEnv(), - args, + args().value, workingDir = forkWorkingDir(), useCpPassingJar = runUseArgsFile() ) diff --git a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala index 54c21ba4611..fd7bb6080dd 100644 --- a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala +++ b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala @@ -688,7 +688,7 @@ object HelloWorldTests extends TestSuite { "runIfMainClassProvided" - workspaceTest(HelloWorldWithMain) { eval => val runResult = eval.outPath / "core" / "run.dest" / "hello-mill" val Right((_, evalCount)) = eval.apply( - HelloWorldWithMain.core.run(runResult.toString) + HelloWorldWithMain.core.run(T.task(mainargs.Leftover(runResult.toString))) ) assert(evalCount > 0) @@ -702,7 +702,7 @@ object HelloWorldTests extends TestSuite { HelloWorldWithoutMain, os.pwd / "scalalib" / "test" / "resources" / "hello-world-no-main" ) { eval => - val Left(Result.Failure(_, None)) = eval.apply(HelloWorldWithoutMain.core.run()) + val Left(Result.Failure(_, None)) = eval.apply(HelloWorldWithoutMain.core.run((T.task(mainargs.Leftover[String]())))) } "runDiscoverMainClass" - workspaceTest(HelloWorldWithoutMain) { eval => @@ -710,7 +710,7 @@ object HelloWorldTests extends TestSuite { // discovered by Zinc and used val runResult = eval.outPath / "core" / "run.dest" / "hello-mill" val Right((_, evalCount)) = eval.apply( - HelloWorldWithoutMain.core.run(runResult.toString) + HelloWorldWithoutMain.core.run((T.task(mainargs.Leftover(runResult.toString)))) ) assert(evalCount > 0) @@ -726,7 +726,7 @@ object HelloWorldTests extends TestSuite { "runIfMainClassProvided" - workspaceTest(HelloWorldWithMain) { eval => val runResult = eval.outPath / "core" / "run.dest" / "hello-mill" val Right((_, evalCount)) = eval.apply( - HelloWorldWithMain.core.runLocal(runResult.toString) + HelloWorldWithMain.core.runLocal((T.task(mainargs.Leftover(runResult.toString)))) ) assert(evalCount > 0) @@ -739,7 +739,7 @@ object HelloWorldTests extends TestSuite { "runWithDefaultMain" - workspaceTest(HelloWorldDefaultMain) { eval => val runResult = eval.outPath / "core" / "run.dest" / "hello-mill" val Right((_, evalCount)) = eval.apply( - HelloWorldDefaultMain.core.runLocal(runResult.toString) + HelloWorldDefaultMain.core.runLocal((T.task(mainargs.Leftover(runResult.toString)))) ) assert(evalCount > 0) @@ -753,7 +753,7 @@ object HelloWorldTests extends TestSuite { HelloWorldWithoutMain, os.pwd / "scalalib" / "test" / "resources" / "hello-world-no-main" ) { eval => - val Left(Result.Failure(_, None)) = eval.apply(HelloWorldWithoutMain.core.runLocal()) + val Left(Result.Failure(_, None)) = eval.apply(HelloWorldWithoutMain.core.runLocal((T.task(mainargs.Leftover[String]())))) } } @@ -1156,7 +1156,7 @@ object HelloWorldTests extends TestSuite { Dotty213, resourcePath = os.pwd / "scalalib" / "test" / "resources" / "dotty213" ) { eval => - val Right((_, evalCount)) = eval.apply(Dotty213.foo.run()) + val Right((_, evalCount)) = eval.apply(Dotty213.foo.run((T.task(mainargs.Leftover[String]())))) assert(evalCount > 0) } diff --git a/scalalib/test/src/mill/scalalib/ScalaVersionsRangesTests.scala b/scalalib/test/src/mill/scalalib/ScalaVersionsRangesTests.scala index 4436689878f..8f7560dc6ea 100644 --- a/scalalib/test/src/mill/scalalib/ScalaVersionsRangesTests.scala +++ b/scalalib/test/src/mill/scalalib/ScalaVersionsRangesTests.scala @@ -37,7 +37,7 @@ object ScalaVersionsRangesTests extends TestSuite { test("main with Scala 2.12- and 2.13+ specific code") { workspaceTest(ScalaVersionsRanges) { eval => ScalaVersionsRanges.core.crossModules.map { c => - val Right(_) = eval(c.run()) + val Right(_) = eval(c.run((T.task(mainargs.Leftover[String]())))) } } } diff --git a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala index 7ec470f4407..fe628c3842e 100644 --- a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala +++ b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala @@ -261,9 +261,9 @@ trait ScalaNativeModule extends ScalaModule { outer => } // Runs the native binary - override def run(args: String*) = T.command { + override def run(args: Task[mainargs.Leftover[String]]) = T.command { Jvm.runSubprocess( - commandArgs = Vector(nativeLink().toString) ++ args, + commandArgs = Vector(nativeLink().toString) ++ args().value, envArgs = forkEnv(), workingDir = forkWorkingDir() ) From 1b71b89205ae56d028dff904bf1a5fd1fbd09cc7 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 16:43:33 +0800 Subject: [PATCH 02/19] . --- example/misc/5-module-run-task/build.sc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/example/misc/5-module-run-task/build.sc b/example/misc/5-module-run-task/build.sc index 88065174cc1..03d63ed312e 100644 --- a/example/misc/5-module-run-task/build.sc +++ b/example/misc/5-module-run-task/build.sc @@ -7,14 +7,13 @@ trait MyModule extends ScalaModule{ object foo extends MyModule { def moduleDeps = Seq(bar) def ivyDeps = Agg(ivy"com.lihaoyi::mainargs:0.4.0") - def sources = T{ - val dest = bar.run( - T.task{ - mainargs.Leftover(super.sources().map(_.path).mkString(","), T.dest.toString()) - } - ).mapCtx((x, y) => y.dest)() + def barArgs = T.task{ + mainargs.Leftover(super.sources().map(_.path).mkString(","), T.dest.toString()) + } - Seq(PathRef(dest)) + def sources = T{ + val dest = bar.run(barArgs)() + Seq(PathRef(T.dest)) } } From ffe5cfec8d247d60ab73ee232e19309ed53699ab Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 20:46:19 +0800 Subject: [PATCH 03/19] introduce mill.Args --- .../src/mill/bsp/worker/MillBuildServer.scala | 2 +- .../contrib/buildinfo/BuildInfoTests.scala | 6 +++--- .../playlib/src/mill/playlib/PlayModule.scala | 4 ++-- .../misc/5-module-run-task/bar/src/Bar.scala | 8 -------- example/misc/5-module-run-task/build.sc | 20 ++++++++----------- .../misc/5-module-run-task/foo/src/Foo.scala | 7 +------ main/core/src/mill/define/Args.scala | 6 ++++++ main/src/mill/main/TokenReaders.scala | 8 ++++++-- main/src/mill/package.scala | 2 ++ .../src/mill/scalajslib/ScalaJSModule.scala | 4 ++-- .../mill/scalajslib/HelloJSWorldTests.scala | 2 +- .../mill/scalajslib/MultiModuleTests.scala | 2 +- .../mill/scalajslib/NodeJSConfigTests.scala | 2 +- scalalib/src/mill/scalalib/JavaModule.scala | 4 ++-- .../src/mill/scalalib/HelloWorldTests.scala | 14 ++++++------- .../scalalib/ScalaVersionsRangesTests.scala | 2 +- .../scalanativelib/ScalaNativeModule.scala | 2 +- 17 files changed, 45 insertions(+), 50 deletions(-) create mode 100644 main/core/src/mill/define/Args.scala diff --git a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala index ded5a0095f0..53fb562510e 100644 --- a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala +++ b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala @@ -538,7 +538,7 @@ class MillBuildServer( case m: JavaModule => m }.get val args = params.getArguments.getOrElse(Seq.empty[String]) - val runTask = module.run(T.task(mainargs.Leftover(args:_*))) + val runTask = module.run() val runResult = evaluator.evaluate( Strict.Agg(runTask), Utils.getBspLoggedReporterPool(runParams.getOriginId, bspIdByModule, client), diff --git a/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala b/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala index 94ec4e1b80e..7abe115241f 100644 --- a/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala +++ b/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala @@ -160,7 +160,7 @@ object BuildInfoTests extends TestSuite { val runResult = eval.outPath / "hello-mill" val Right((result, evalCount)) = - eval.apply(BuildInfoPlain.run(T.task(mainargs.Leftover(runResult.toString)))) + eval.apply(BuildInfoPlain.run(T.task(Args(runResult.toString)))) assert( os.exists(runResult), @@ -174,7 +174,7 @@ object BuildInfoTests extends TestSuite { val runResult = eval.outPath / "hello-mill" val Right((result2, evalCount2)) = - eval.apply(BuildInfoStatic.run(T.task(mainargs.Leftover(runResult.toString)))) + eval.apply(BuildInfoStatic.run(T.task(Args(runResult.toString)))) assert(os.exists(buildInfoSourcePath(eval))) assert(!os.exists(buildInfoResourcePath(eval))) @@ -185,7 +185,7 @@ object BuildInfoTests extends TestSuite { "java" - workspaceTest(BuildInfoJava, "java") { eval => val runResult = eval.outPath / "hello-mill" val Right((result, evalCount)) = - eval.apply(BuildInfoJava.run(T.task(mainargs.Leftover(runResult.toString)))) + eval.apply(BuildInfoJava.run(T.task(Args(runResult.toString)))) assert( os.exists(runResult), diff --git a/contrib/playlib/src/mill/playlib/PlayModule.scala b/contrib/playlib/src/mill/playlib/PlayModule.scala index 829148144c5..6b817994ead 100644 --- a/contrib/playlib/src/mill/playlib/PlayModule.scala +++ b/contrib/playlib/src/mill/playlib/PlayModule.scala @@ -3,7 +3,7 @@ package mill.playlib import mill.define.Task import mill.playlib.api.Versions import mill.scalalib._ -import mill.{Agg, T} +import mill.{Agg, Args, T} trait PlayApiModule extends Dependencies with Router with Server { trait PlayTests extends super.Tests with TestModule.ScalaTest { @@ -18,7 +18,7 @@ trait PlayApiModule extends Dependencies with Router with Server { override def sources = T.sources { millSourcePath } } - def start(args: Task[mainargs.Leftover[String]]) = T.command { run(args) } + def start(args: Task[Args] = T.task(Args())) = T.command { run(args) } } trait PlayModule extends PlayApiModule with Static with Twirl diff --git a/example/misc/5-module-run-task/bar/src/Bar.scala b/example/misc/5-module-run-task/bar/src/Bar.scala index 52a994dd755..14c0daf9c7f 100644 --- a/example/misc/5-module-run-task/bar/src/Bar.scala +++ b/example/misc/5-module-run-task/bar/src/Bar.scala @@ -1,23 +1,15 @@ package bar object Bar { def main(args: Array[String]) = { - println("LOLS") val Array(sourcesStrJoined, destStr) = args val sourceStrs = sourcesStrJoined.split(",") - println("sourceStrs " + sourceStrs.toList) - println("destStr " + destStr) val dest = os.Path(destStr) for(sourceStr <- sourceStrs){ val sourcePath = os.Path(sourceStr) - println("sourcePath " + sourcePath) for(p <- os.walk(sourcePath) if p.ext == "scala"){ - println("p " + p) val text = os.read(p) - println("text " + text) val mangledText = text.replace("hello", "HELLO") - println("mangledText " + mangledText) val fileDest = dest / (p.subRelativeTo(sourcePath)) - println("fileDest " + fileDest) os.write(fileDest, mangledText) } } diff --git a/example/misc/5-module-run-task/build.sc b/example/misc/5-module-run-task/build.sc index 03d63ed312e..763fc0732a0 100644 --- a/example/misc/5-module-run-task/build.sc +++ b/example/misc/5-module-run-task/build.sc @@ -1,23 +1,22 @@ import mill._, scalalib._ -trait MyModule extends ScalaModule{ +object foo extends ScalaModule { def scalaVersion = "2.13.8" -} - -object foo extends MyModule { def moduleDeps = Seq(bar) def ivyDeps = Agg(ivy"com.lihaoyi::mainargs:0.4.0") + def barWorkingDir = T{ T.dest } def barArgs = T.task{ - mainargs.Leftover(super.sources().map(_.path).mkString(","), T.dest.toString()) + Args(super.sources().map(_.path).mkString(","), barWorkingDir().toString()) } def sources = T{ val dest = bar.run(barArgs)() - Seq(PathRef(T.dest)) + Seq(PathRef(barWorkingDir())) } } -object bar extends MyModule{ +object bar extends ScalaModule{ + def scalaVersion = "2.13.8" def ivyDeps = Agg(ivy"com.lihaoyi::os-lib:0.9.1") } @@ -25,11 +24,8 @@ object bar extends MyModule{ /** Usage -> ./mill show foo.sources -sdad - > ./mill foo.run -asdas - +... +Foo.value: HELLO */ diff --git a/example/misc/5-module-run-task/foo/src/Foo.scala b/example/misc/5-module-run-task/foo/src/Foo.scala index bc1ef1e8b66..7e106d605a6 100644 --- a/example/misc/5-module-run-task/foo/src/Foo.scala +++ b/example/misc/5-module-run-task/foo/src/Foo.scala @@ -3,12 +3,7 @@ import mainargs.{main, ParserForMethods, arg} object Foo { val value = "hello" - @main - def main(@arg(name = "foo-text") fooText: String, - @arg(name = "bar-text") barText: String): Unit = { + def main(args: Array[String]): Unit = { println("Foo.value: " + Foo.value) - bar.Bar.printText(barText) } - - def main(args: Array[String]): Unit = ParserForMethods(this).runOrExit(args) } diff --git a/main/core/src/mill/define/Args.scala b/main/core/src/mill/define/Args.scala new file mode 100644 index 00000000000..453287068e3 --- /dev/null +++ b/main/core/src/mill/define/Args.scala @@ -0,0 +1,6 @@ +package mill.define + +case class Args(value: String*) +object Args{ + implicit def createArgs(value: Seq[String]) = new Args(value:_*) +} diff --git a/main/src/mill/main/TokenReaders.scala b/main/src/mill/main/TokenReaders.scala index 0a11c77fff5..063b7847433 100644 --- a/main/src/mill/main/TokenReaders.scala +++ b/main/src/mill/main/TokenReaders.scala @@ -2,7 +2,7 @@ package mill.main import mainargs.TokensReader import mill.eval.Evaluator -import mill.define.{SelectMode, Target, Task} +import mill.define.{Args, SelectMode, Target, Task} case class Tasks[T](value: Seq[mill.define.NamedTask[T]]) @@ -46,12 +46,16 @@ class LeftoverTaskTokenReader[T](tokensReaderOfT: TokensReader.Leftover[T, _]) } object TokenReaders { - implicitly[TokensReader[Task[mainargs.Leftover[String]]]] implicit def millEvaluatorTokenReader[T] = new mill.main.EvaluatorTokenReader[T]() implicit def millTasksTokenReader[T]: mainargs.TokensReader[Tasks[T]] = new mill.main.Tasks.TokenReader[T]() + implicit def millArgsTokenReader: mainargs.TokensReader.ShortNamed[Args] = + new TokensReader.Leftover[Args, String]{ + def read(strs: Seq[String]) = Right(new Args(strs:_*)) + def wrapped = implicitly[TokensReader.ShortNamed[String]] + } implicit def millTaskTokenReader[T](implicit tokensReaderOfT: TokensReader.ShortNamed[T] diff --git a/main/src/mill/package.scala b/main/src/mill/package.scala index 2bc2878325d..1cbd8dd7806 100644 --- a/main/src/mill/package.scala +++ b/main/src/mill/package.scala @@ -10,4 +10,6 @@ package object mill extends mill.api.JsonFormatters { val Agg = mill.api.Loose.Agg type RootModule = mill.main.RootModule val RootModule = mill.main.RootModule + type Args = define.Args + val Args = define.Args } diff --git a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala index 64c2b1aa0b3..7ea80c2b0a5 100644 --- a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala +++ b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala @@ -122,9 +122,9 @@ trait ScalaJSModule extends scalalib.ScalaModule { outer => ) } - override def runLocal(args: Task[mainargs.Leftover[String]]): Command[Unit] = T.command { run(args) } + override def runLocal(args: Task[Args] = T.task(Args())): Command[Unit] = T.command { run(args) } - override def run(args: Task[mainargs.Leftover[String]]): Command[Unit] = T.command { + override def run(args: Task[Args] = T.task(Args())): Command[Unit] = T.command { finalMainClassOpt() match { case Left(err) => Result.Failure(err) case Right(_) => diff --git a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala index cc4e73b9865..50ae3bc5265 100644 --- a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala +++ b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala @@ -273,7 +273,7 @@ object HelloJSWorldTests extends TestSuite { } def checkRun(scalaVersion: String, scalaJSVersion: String): Unit = { - val task = HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).run(T.task(mainargs.Leftover[String]())) + val task = HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).run() val Right((_, evalCount)) = helloWorldEvaluator(task) diff --git a/scalajslib/test/src/mill/scalajslib/MultiModuleTests.scala b/scalajslib/test/src/mill/scalajslib/MultiModuleTests.scala index 036a0a44c24..265204e8c36 100644 --- a/scalajslib/test/src/mill/scalajslib/MultiModuleTests.scala +++ b/scalajslib/test/src/mill/scalajslib/MultiModuleTests.scala @@ -64,7 +64,7 @@ object MultiModuleTests extends TestSuite { } test("run") { - val command = MultiModule.client.run(T.task(mainargs.Leftover[String]())) + val command = MultiModule.client.run() val Right((_, evalCount)) = evaluator(command) diff --git a/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala b/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala index 854ae5f16ed..34f3c77b685 100644 --- a/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala +++ b/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala @@ -92,7 +92,7 @@ object NodeJSConfigTests extends TestSuite { } def checkRun(nodeArgs: List[String], notNodeArgs: List[String]): Unit = { - checkLog(HelloJSWorld.helloJsWorld(scalaVersion, nodeArgs).run(T.task(mainargs.Leftover[String]())), nodeArgs, notNodeArgs) + checkLog(HelloJSWorld.helloJsWorld(scalaVersion, nodeArgs).run(), nodeArgs, notNodeArgs) } "run" - { diff --git a/scalalib/src/mill/scalalib/JavaModule.scala b/scalalib/src/mill/scalalib/JavaModule.scala index 2a9591a093a..df0ce4b52e6 100644 --- a/scalalib/src/mill/scalalib/JavaModule.scala +++ b/scalalib/src/mill/scalalib/JavaModule.scala @@ -707,7 +707,7 @@ trait JavaModule * since the code can dirty the parent Mill process and potentially leave it * in a bad state. */ - def runLocal(args: Task[mainargs.Leftover[String]]): Command[Unit] = T.command { + def runLocal(args: Task[Args] = T.task(Args())): Command[Unit] = T.command { Jvm.runLocal( finalMainClass(), runClasspath().map(_.path), @@ -718,7 +718,7 @@ trait JavaModule /** * Runs this module's code in a subprocess and waits for it to finish */ - def run(args: Task[mainargs.Leftover[String]]): Command[Unit] = T.command { + def run(args: Task[Args] = T.task(Args())): Command[Unit] = T.command { try Result.Success( Jvm.runSubprocess( finalMainClass(), diff --git a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala index fd7bb6080dd..bb86a2442cf 100644 --- a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala +++ b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala @@ -688,7 +688,7 @@ object HelloWorldTests extends TestSuite { "runIfMainClassProvided" - workspaceTest(HelloWorldWithMain) { eval => val runResult = eval.outPath / "core" / "run.dest" / "hello-mill" val Right((_, evalCount)) = eval.apply( - HelloWorldWithMain.core.run(T.task(mainargs.Leftover(runResult.toString))) + HelloWorldWithMain.core.run(T.task(Args(runResult.toString))) ) assert(evalCount > 0) @@ -702,7 +702,7 @@ object HelloWorldTests extends TestSuite { HelloWorldWithoutMain, os.pwd / "scalalib" / "test" / "resources" / "hello-world-no-main" ) { eval => - val Left(Result.Failure(_, None)) = eval.apply(HelloWorldWithoutMain.core.run((T.task(mainargs.Leftover[String]())))) + val Left(Result.Failure(_, None)) = eval.apply(HelloWorldWithoutMain.core.run()) } "runDiscoverMainClass" - workspaceTest(HelloWorldWithoutMain) { eval => @@ -710,7 +710,7 @@ object HelloWorldTests extends TestSuite { // discovered by Zinc and used val runResult = eval.outPath / "core" / "run.dest" / "hello-mill" val Right((_, evalCount)) = eval.apply( - HelloWorldWithoutMain.core.run((T.task(mainargs.Leftover(runResult.toString)))) + HelloWorldWithoutMain.core.run(T.task(Args(runResult.toString))) ) assert(evalCount > 0) @@ -726,7 +726,7 @@ object HelloWorldTests extends TestSuite { "runIfMainClassProvided" - workspaceTest(HelloWorldWithMain) { eval => val runResult = eval.outPath / "core" / "run.dest" / "hello-mill" val Right((_, evalCount)) = eval.apply( - HelloWorldWithMain.core.runLocal((T.task(mainargs.Leftover(runResult.toString)))) + HelloWorldWithMain.core.runLocal(T.task(Args(runResult.toString))) ) assert(evalCount > 0) @@ -739,7 +739,7 @@ object HelloWorldTests extends TestSuite { "runWithDefaultMain" - workspaceTest(HelloWorldDefaultMain) { eval => val runResult = eval.outPath / "core" / "run.dest" / "hello-mill" val Right((_, evalCount)) = eval.apply( - HelloWorldDefaultMain.core.runLocal((T.task(mainargs.Leftover(runResult.toString)))) + HelloWorldDefaultMain.core.runLocal(T.task(Args(runResult.toString))) ) assert(evalCount > 0) @@ -753,7 +753,7 @@ object HelloWorldTests extends TestSuite { HelloWorldWithoutMain, os.pwd / "scalalib" / "test" / "resources" / "hello-world-no-main" ) { eval => - val Left(Result.Failure(_, None)) = eval.apply(HelloWorldWithoutMain.core.runLocal((T.task(mainargs.Leftover[String]())))) + val Left(Result.Failure(_, None)) = eval.apply(HelloWorldWithoutMain.core.runLocal()) } } @@ -1156,7 +1156,7 @@ object HelloWorldTests extends TestSuite { Dotty213, resourcePath = os.pwd / "scalalib" / "test" / "resources" / "dotty213" ) { eval => - val Right((_, evalCount)) = eval.apply(Dotty213.foo.run((T.task(mainargs.Leftover[String]())))) + val Right((_, evalCount)) = eval.apply(Dotty213.foo.run()) assert(evalCount > 0) } diff --git a/scalalib/test/src/mill/scalalib/ScalaVersionsRangesTests.scala b/scalalib/test/src/mill/scalalib/ScalaVersionsRangesTests.scala index 8f7560dc6ea..4436689878f 100644 --- a/scalalib/test/src/mill/scalalib/ScalaVersionsRangesTests.scala +++ b/scalalib/test/src/mill/scalalib/ScalaVersionsRangesTests.scala @@ -37,7 +37,7 @@ object ScalaVersionsRangesTests extends TestSuite { test("main with Scala 2.12- and 2.13+ specific code") { workspaceTest(ScalaVersionsRanges) { eval => ScalaVersionsRanges.core.crossModules.map { c => - val Right(_) = eval(c.run((T.task(mainargs.Leftover[String]())))) + val Right(_) = eval(c.run()) } } } diff --git a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala index fe628c3842e..6a0f1a5c932 100644 --- a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala +++ b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala @@ -261,7 +261,7 @@ trait ScalaNativeModule extends ScalaModule { outer => } // Runs the native binary - override def run(args: Task[mainargs.Leftover[String]]) = T.command { + override def run(args: Task[Args] = T.task(Args())) = T.command { Jvm.runSubprocess( commandArgs = Vector(nativeLink().toString) ++ args().value, envArgs = forkEnv(), From fe67585901c2280e166209d25775dc36748a4e87 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 20:57:23 +0800 Subject: [PATCH 04/19] . --- .../misc/5-module-run-task/bar/src/Bar.scala | 3 +-- example/misc/5-module-run-task/build.sc | 22 ++++++++++++++----- main/core/src/mill/define/Args.scala | 5 +++-- main/src/mill/main/TokenReaders.scala | 2 +- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/example/misc/5-module-run-task/bar/src/Bar.scala b/example/misc/5-module-run-task/bar/src/Bar.scala index 14c0daf9c7f..72b88d2ad8f 100644 --- a/example/misc/5-module-run-task/bar/src/Bar.scala +++ b/example/misc/5-module-run-task/bar/src/Bar.scala @@ -1,8 +1,7 @@ package bar object Bar { def main(args: Array[String]) = { - val Array(sourcesStrJoined, destStr) = args - val sourceStrs = sourcesStrJoined.split(",") + val Array(destStr, sourceStrs @ _*) = args val dest = os.Path(destStr) for(sourceStr <- sourceStrs){ val sourcePath = os.Path(sourceStr) diff --git a/example/misc/5-module-run-task/build.sc b/example/misc/5-module-run-task/build.sc index 763fc0732a0..de5be4f5cf6 100644 --- a/example/misc/5-module-run-task/build.sc +++ b/example/misc/5-module-run-task/build.sc @@ -4,13 +4,10 @@ object foo extends ScalaModule { def scalaVersion = "2.13.8" def moduleDeps = Seq(bar) def ivyDeps = Agg(ivy"com.lihaoyi::mainargs:0.4.0") - def barWorkingDir = T{ T.dest } - def barArgs = T.task{ - Args(super.sources().map(_.path).mkString(","), barWorkingDir().toString()) - } + def barWorkingDir = T{ T.dest } def sources = T{ - val dest = bar.run(barArgs)() + bar.run(T.task(Args(barWorkingDir(), super.sources().map(_.path))))() Seq(PathRef(barWorkingDir())) } } @@ -20,7 +17,13 @@ object bar extends ScalaModule{ def ivyDeps = Agg(ivy"com.lihaoyi::os-lib:0.9.1") } -// explanation +// This example demonstrates using Mill `ScalaModule`s as build tasks: rather +// than defining the task logic in the `build.sc`, we instead put the build +// logic within the `bar` module as `bar/src/Bar.scala`. In this example, we use +// `Bar.scala` as a source-code pre-processor on the `foo` module source code: +// we override `foo.sources`, passing the `super.sources()` to `bar.run` along +// with a `barWorkingDir`, and returning a `PathRef(barWorkingDir())` as the +// new `foo.sources`. /** Usage @@ -29,3 +32,10 @@ object bar extends ScalaModule{ Foo.value: HELLO */ + +// This example does a trivial string-replace of "hello" with "HELLO", but is +// enough to demonstrate how you can use Mill `ScalaModule`s to implement your +// own arbitrarily complex transformations. This is useful for build logic that +// may not fit nicely inside a `build.sc` file, whether due to the sheer lines +// of code or due to dependencies that may conflict with the Mill classpath +// present in `build.sc` \ No newline at end of file diff --git a/main/core/src/mill/define/Args.scala b/main/core/src/mill/define/Args.scala index 453287068e3..1960955516a 100644 --- a/main/core/src/mill/define/Args.scala +++ b/main/core/src/mill/define/Args.scala @@ -1,6 +1,7 @@ package mill.define -case class Args(value: String*) +class Args(val value: Seq[String]) object Args{ - implicit def createArgs(value: Seq[String]) = new Args(value:_*) + implicit def createArgs(value: Seq[String]) = new Args(value) + def apply(chunks: os.Shellable*) = new Args(chunks.flatMap(_.value)) } diff --git a/main/src/mill/main/TokenReaders.scala b/main/src/mill/main/TokenReaders.scala index 063b7847433..e7ae2a6454f 100644 --- a/main/src/mill/main/TokenReaders.scala +++ b/main/src/mill/main/TokenReaders.scala @@ -53,7 +53,7 @@ object TokenReaders { implicit def millArgsTokenReader: mainargs.TokensReader.ShortNamed[Args] = new TokensReader.Leftover[Args, String]{ - def read(strs: Seq[String]) = Right(new Args(strs:_*)) + def read(strs: Seq[String]) = Right(new Args(strs)) def wrapped = implicitly[TokensReader.ShortNamed[String]] } From 05a355f55de25bf191c14654662ae68e80e2378c Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 21:11:22 +0800 Subject: [PATCH 05/19] . --- bsp/src/mill/bsp/BSP.scala | 1 - .../src/mill/bsp/worker/MillBuildServer.scala | 5 ++--- .../artifactory/ArtifactoryPublishModule.scala | 2 -- .../contrib/bintray/BintrayPublishModule.scala | 2 -- .../mill/contrib/buildinfo/BuildInfoTests.scala | 1 - .../CodeartifactPublishModule.scala | 2 -- .../contrib/gitlab/GitlabPublishModule.scala | 2 -- .../src/mill/contrib/versionfile/Version.scala | 9 +++++---- .../contrib/versionfile/VersionFileModule.scala | 2 -- .../src/mill/integration/ExampleTestSuite.scala | 2 +- main/core/src/mill/define/Args.scala | 4 ++-- main/core/src/mill/define/Task.scala | 4 ++-- main/src/mill/main/TokenReaders.scala | 17 +++++++++-------- main/src/mill/main/VisualizeModule.scala | 1 - runner/src/mill/runner/MillBuildBootstrap.scala | 1 - .../src/mill/runner/MillBuildRootModule.scala | 1 - runner/src/mill/runner/MillCliConfig.scala | 2 +- scalalib/src/mill/scalalib/Dependency.scala | 1 - scalalib/src/mill/scalalib/GenIdea.scala | 1 - scalalib/src/mill/scalalib/JavaModule.scala | 1 - scalalib/src/mill/scalalib/PublishModule.scala | 2 -- .../mill/scalalib/scalafmt/ScalafmtModule.scala | 2 -- 22 files changed, 22 insertions(+), 43 deletions(-) diff --git a/bsp/src/mill/bsp/BSP.scala b/bsp/src/mill/bsp/BSP.scala index 4a02f92abd1..0a1cefde990 100644 --- a/bsp/src/mill/bsp/BSP.scala +++ b/bsp/src/mill/bsp/BSP.scala @@ -13,7 +13,6 @@ import mill.util.PrintLogger import os.Path object BSP extends ExternalModule with CoursierModule with BspServerStarter { - import mill.main.TokenReaders._ lazy val millDiscover: Discover[this.type] = Discover[this.type] diff --git a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala index 53fb562510e..83b0f28eb8b 100644 --- a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala +++ b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala @@ -58,10 +58,9 @@ import com.google.gson.JsonObject import mill.T import mill.api.{DummyTestReporter, PathRef, Result, Strict, internal} import mill.define.Segment.Label -import mill.define.{Discover, ExternalModule, Module, Segments, Task} +import mill.define.{Args, Discover, ExternalModule, Module, Segments, Task} import mill.eval.Evaluator import mill.main.{BspServerResult, MainModule} -import mill.main.TokenReaders._ import mill.scalalib.{JavaModule, SemanticDbJavaModule, TestModule} import mill.scalalib.bsp.{BspModule, JvmBuildTarget, MillBuildModule, ScalaBuildTarget} import mill.scalalib.internal.ModuleUtils @@ -538,7 +537,7 @@ class MillBuildServer( case m: JavaModule => m }.get val args = params.getArguments.getOrElse(Seq.empty[String]) - val runTask = module.run() + val runTask = module.run(T.task(Args(args))) val runResult = evaluator.evaluate( Strict.Agg(runTask), Utils.getBspLoggedReporterPool(runParams.getOriginId, bspIdByModule, client), diff --git a/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala b/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala index e61ca3cf4f8..7990efb6d04 100644 --- a/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala +++ b/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala @@ -94,7 +94,5 @@ object ArtifactoryPublishModule extends ExternalModule { } } - import mill.main.TokenReaders._ - lazy val millDiscover: mill.define.Discover[this.type] = mill.define.Discover[this.type] } diff --git a/contrib/bintray/src/mill/contrib/bintray/BintrayPublishModule.scala b/contrib/bintray/src/mill/contrib/bintray/BintrayPublishModule.scala index d4e2a86ede0..91cfd99164c 100644 --- a/contrib/bintray/src/mill/contrib/bintray/BintrayPublishModule.scala +++ b/contrib/bintray/src/mill/contrib/bintray/BintrayPublishModule.scala @@ -100,7 +100,5 @@ object BintrayPublishModule extends ExternalModule { } } - import mill.main.TokenReaders._ - lazy val millDiscover: mill.define.Discover[this.type] = mill.define.Discover[this.type] } diff --git a/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala b/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala index 7abe115241f..3d96a933704 100644 --- a/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala +++ b/contrib/buildinfo/test/src/mill/contrib/buildinfo/BuildInfoTests.scala @@ -159,7 +159,6 @@ object BuildInfoTests extends TestSuite { "run" - workspaceTest(BuildInfoPlain, "scala") { eval => val runResult = eval.outPath / "hello-mill" val Right((result, evalCount)) = - eval.apply(BuildInfoPlain.run(T.task(Args(runResult.toString)))) assert( diff --git a/contrib/codeartifact/src/mill/contrib/codeartifact/CodeartifactPublishModule.scala b/contrib/codeartifact/src/mill/contrib/codeartifact/CodeartifactPublishModule.scala index 405f159c598..49f4e1bd718 100644 --- a/contrib/codeartifact/src/mill/contrib/codeartifact/CodeartifactPublishModule.scala +++ b/contrib/codeartifact/src/mill/contrib/codeartifact/CodeartifactPublishModule.scala @@ -58,8 +58,6 @@ object CodeartifactPublishModule extends ExternalModule { ) } - import mill.main.TokenReaders._ - lazy val millDiscover: mill.define.Discover[this.type] = mill.define.Discover[this.type] } diff --git a/contrib/gitlab/src/mill/contrib/gitlab/GitlabPublishModule.scala b/contrib/gitlab/src/mill/contrib/gitlab/GitlabPublishModule.scala index da4f209633d..71fca1eeed1 100644 --- a/contrib/gitlab/src/mill/contrib/gitlab/GitlabPublishModule.scala +++ b/contrib/gitlab/src/mill/contrib/gitlab/GitlabPublishModule.scala @@ -79,7 +79,5 @@ object GitlabPublishModule extends ExternalModule { ) } - import mill.main.TokenReaders._ - lazy val millDiscover: mill.define.Discover[this.type] = mill.define.Discover[this.type] } diff --git a/contrib/versionfile/src/mill/contrib/versionfile/Version.scala b/contrib/versionfile/src/mill/contrib/versionfile/Version.scala index 362283c66a2..535e6fe12bf 100644 --- a/contrib/versionfile/src/mill/contrib/versionfile/Version.scala +++ b/contrib/versionfile/src/mill/contrib/versionfile/Version.scala @@ -69,8 +69,9 @@ object Version { implicit val readWriter: ReadWriter[Version] = readwriter[String].bimap(_.toString, Version.of) - implicit val read: mainargs.TokensReader.Simple[Version] = new mainargs.TokensReader.Simple[Version] { - def shortName = "" - def read(s: Seq[String]) = Right(Version.of(s.last)) - } + implicit val read: mainargs.TokensReader.Simple[Version] = + new mainargs.TokensReader.Simple[Version] { + def shortName = "" + def read(s: Seq[String]) = Right(Version.of(s.last)) + } } diff --git a/contrib/versionfile/src/mill/contrib/versionfile/VersionFileModule.scala b/contrib/versionfile/src/mill/contrib/versionfile/VersionFileModule.scala index af35611c729..5d5fdfcaf4a 100644 --- a/contrib/versionfile/src/mill/contrib/versionfile/VersionFileModule.scala +++ b/contrib/versionfile/src/mill/contrib/versionfile/VersionFileModule.scala @@ -90,7 +90,5 @@ object VersionFileModule extends define.ExternalModule { } yield proc.call() } - import mill.main.TokenReaders._ - lazy val millDiscover: mill.define.Discover[this.type] = mill.define.Discover[this.type] } diff --git a/example/src/mill/integration/ExampleTestSuite.scala b/example/src/mill/integration/ExampleTestSuite.scala index 506f1d2fc7a..f827e16d7c8 100644 --- a/example/src/mill/integration/ExampleTestSuite.scala +++ b/example/src/mill/integration/ExampleTestSuite.scala @@ -52,7 +52,7 @@ object ExampleTestSuite extends IntegrationTestSuite { for (commandBlock <- commandBlocks) processCommandBlock(workspaceRoot, commandBlock) } finally { -// os.remove.all(workspaceRoot / "out") + os.remove.all(workspaceRoot / "out") } } } diff --git a/main/core/src/mill/define/Args.scala b/main/core/src/mill/define/Args.scala index 1960955516a..33d9ed07e92 100644 --- a/main/core/src/mill/define/Args.scala +++ b/main/core/src/mill/define/Args.scala @@ -1,7 +1,7 @@ package mill.define class Args(val value: Seq[String]) -object Args{ +object Args { implicit def createArgs(value: Seq[String]) = new Args(value) - def apply(chunks: os.Shellable*) = new Args(chunks.flatMap(_.value)) + def apply(chunks: os.Shellable*) = new Args(chunks.flatMap(_.value)) } diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index ee84601d72c..faef99d63b1 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -44,7 +44,6 @@ abstract class Task[+T] extends Task.Ops[T] with Applyable[Task, T] { } object Task { - abstract class Ops[+T] { this: Task[T] => def map[V](f: T => V): Task[V] = new Task.Mapped(this, f) def mapCtx[V](f: (T, mill.api.Ctx) => Result[V]) = new Task.MappedCtx(this, f) @@ -80,7 +79,8 @@ object Task { val inputs = List(source) } - private[define] class MappedCtx[+T, +V](source: Task[T], f: (T, mill.api.Ctx) => Result[V]) extends Task[V] { + private[define] class MappedCtx[+T, +V](source: Task[T], f: (T, mill.api.Ctx) => Result[V]) + extends Task[V] { def evaluate(ctx: mill.api.Ctx) = f(ctx.args(0).asInstanceOf[T], ctx) val inputs = List(source) } diff --git a/main/src/mill/main/TokenReaders.scala b/main/src/mill/main/TokenReaders.scala index e7ae2a6454f..6e32b76db61 100644 --- a/main/src/mill/main/TokenReaders.scala +++ b/main/src/mill/main/TokenReaders.scala @@ -7,7 +7,7 @@ import mill.define.{Args, SelectMode, Target, Task} case class Tasks[T](value: Seq[mill.define.NamedTask[T]]) object Tasks { - class TokenReader[T]() extends mainargs.TokensReader.Simple[Tasks[T]]{ + class TokenReader[T]() extends mainargs.TokensReader.Simple[Tasks[T]] { def shortName = "" def read(s: Seq[String]) = { ResolveTasks.resolve( @@ -21,8 +21,8 @@ object Tasks { } } -class EvaluatorTokenReader[T]() extends mainargs.TokensReader.Simple[mill.eval.Evaluator]{ - def shortName = "" +class EvaluatorTokenReader[T]() extends mainargs.TokensReader.Simple[mill.eval.Evaluator] { + def shortName = "" def read(s: Seq[String]) = Right(Evaluator.currentEvaluator.get.asInstanceOf[mill.eval.Evaluator]) override def alwaysRepeatable = false override def allowEmpty = true @@ -32,7 +32,7 @@ class EvaluatorTokenReader[T]() extends mainargs.TokensReader.Simple[mill.eval.E * Transparently handle `Task[T]` like simple `T` but lift the result into a T.task. */ class SimpleTaskTokenReader[T](tokensReaderOfT: TokensReader.Simple[T]) - extends mainargs.TokensReader.Simple[Task[T]]{ + extends mainargs.TokensReader.Simple[Task[T]] { def shortName = tokensReaderOfT.shortName def read(s: Seq[String]) = tokensReaderOfT.read(s).map(t => Target.task(t)) override def alwaysRepeatable = tokensReaderOfT.alwaysRepeatable @@ -40,8 +40,9 @@ class SimpleTaskTokenReader[T](tokensReaderOfT: TokensReader.Simple[T]) } class LeftoverTaskTokenReader[T](tokensReaderOfT: TokensReader.Leftover[T, _]) - extends mainargs.TokensReader.Leftover[Task[T], T]{ - def read(strs: Seq[String]): Either[String, Task[T]] = tokensReaderOfT.read(strs).map(t => Target.task(t)) + extends mainargs.TokensReader.Leftover[Task[T], T] { + def read(strs: Seq[String]): Either[String, Task[T]] = + tokensReaderOfT.read(strs).map(t => Target.task(t)) def wrapped = tokensReaderOfT } @@ -52,14 +53,14 @@ object TokenReaders { new mill.main.Tasks.TokenReader[T]() implicit def millArgsTokenReader: mainargs.TokensReader.ShortNamed[Args] = - new TokensReader.Leftover[Args, String]{ + new TokensReader.Leftover[Args, String] { def read(strs: Seq[String]) = Right(new Args(strs)) def wrapped = implicitly[TokensReader.ShortNamed[String]] } implicit def millTaskTokenReader[T](implicit tokensReaderOfT: TokensReader.ShortNamed[T] - ): TokensReader.ShortNamed[Task[T]] = tokensReaderOfT match{ + ): TokensReader.ShortNamed[Task[T]] = tokensReaderOfT match { case t: TokensReader.Simple[_] => new SimpleTaskTokenReader[T](t) case t: TokensReader.Leftover[_, _] => new LeftoverTaskTokenReader[T](t) } diff --git a/main/src/mill/main/VisualizeModule.scala b/main/src/mill/main/VisualizeModule.scala index 2a6bc38cc75..f2e7598eea1 100644 --- a/main/src/mill/main/VisualizeModule.scala +++ b/main/src/mill/main/VisualizeModule.scala @@ -16,7 +16,6 @@ object VisualizeModule extends ExternalModule with VisualizeModule { MavenRepository("https://oss.sonatype.org/content/repositories/releases") ) - import mill.main.TokenReaders._ lazy val millDiscover = Discover[this.type] } trait VisualizeModule extends mill.define.TaskModule { diff --git a/runner/src/mill/runner/MillBuildBootstrap.scala b/runner/src/mill/runner/MillBuildBootstrap.scala index 9cf2fec7aef..525f690f745 100644 --- a/runner/src/mill/runner/MillBuildBootstrap.scala +++ b/runner/src/mill/runner/MillBuildBootstrap.scala @@ -4,7 +4,6 @@ import mill.{BuildInfo, T} import mill.api.{PathRef, internal} import mill.eval.Evaluator import mill.main.{RootModule, RunScript} -import mill.main.TokenReaders._ import mill.define.{Discover, Segments, SelectMode, Watchable} import java.net.URLClassLoader diff --git a/runner/src/mill/runner/MillBuildRootModule.scala b/runner/src/mill/runner/MillBuildRootModule.scala index 6e42a9aa1ea..45dc77eba6e 100644 --- a/runner/src/mill/runner/MillBuildRootModule.scala +++ b/runner/src/mill/runner/MillBuildRootModule.scala @@ -219,7 +219,6 @@ object MillBuildRootModule { | _root_.os.Path(${literalize(base.toString)}), | _root_.os.Path(${literalize(millTopLevelProjectRoot.toString)}) | ) - | import mill.main.TokenReaders._ | implicit val millBaseModuleInfo: _root_.mill.main.RootModule.Info = _root_.mill.main.RootModule.Info( | millBuildRootModuleInfo.projectRoot, | _root_.mill.define.Discover[$name] diff --git a/runner/src/mill/runner/MillCliConfig.scala b/runner/src/mill/runner/MillCliConfig.scala index 118d803e7ff..aeb7f92c924 100644 --- a/runner/src/mill/runner/MillCliConfig.scala +++ b/runner/src/mill/runner/MillCliConfig.scala @@ -218,7 +218,7 @@ object MillCliConfigParser { /** * Additional [[mainargs.TokensReader]] instance to teach it how to read Ammonite paths */ - implicit object PathRead extends mainargs.TokensReader.Simple[os.Path]{ + implicit object PathRead extends mainargs.TokensReader.Simple[os.Path] { def shortName = "path" def read(strs: Seq[String]) = Right(os.Path(strs.last, os.pwd)) } diff --git a/scalalib/src/mill/scalalib/Dependency.scala b/scalalib/src/mill/scalalib/Dependency.scala index b4f02544853..9efaf0d4e9b 100644 --- a/scalalib/src/mill/scalalib/Dependency.scala +++ b/scalalib/src/mill/scalalib/Dependency.scala @@ -25,6 +25,5 @@ object Dependency extends ExternalModule { DependencyUpdatesImpl.showAllUpdates(updates(ev, allowPreRelease)()) } - import mill.main.TokenReaders._ lazy val millDiscover: Discover[Dependency.this.type] = Discover[this.type] } diff --git a/scalalib/src/mill/scalalib/GenIdea.scala b/scalalib/src/mill/scalalib/GenIdea.scala index 1fb6360a082..3a0fb498d28 100644 --- a/scalalib/src/mill/scalalib/GenIdea.scala +++ b/scalalib/src/mill/scalalib/GenIdea.scala @@ -24,6 +24,5 @@ object GenIdea extends ExternalModule { } } - import mill.main.TokenReaders._ override lazy val millDiscover = Discover[this.type] } diff --git a/scalalib/src/mill/scalalib/JavaModule.scala b/scalalib/src/mill/scalalib/JavaModule.scala index df0ce4b52e6..e886822f603 100644 --- a/scalalib/src/mill/scalalib/JavaModule.scala +++ b/scalalib/src/mill/scalalib/JavaModule.scala @@ -18,7 +18,6 @@ import mill.scalalib.bsp.{BspBuildTarget, BspModule} import mill.scalalib.publish.Artifact import os.Path - /** * Core configuration required to compile a single Java compilation target */ diff --git a/scalalib/src/mill/scalalib/PublishModule.scala b/scalalib/src/mill/scalalib/PublishModule.scala index b26604006ad..3cd5b546161 100644 --- a/scalalib/src/mill/scalalib/PublishModule.scala +++ b/scalalib/src/mill/scalalib/PublishModule.scala @@ -293,7 +293,5 @@ object PublishModule extends ExternalModule { } } - import mill.main.TokenReaders._ - lazy val millDiscover: mill.define.Discover[this.type] = mill.define.Discover[this.type] } diff --git a/scalalib/src/mill/scalalib/scalafmt/ScalafmtModule.scala b/scalalib/src/mill/scalalib/scalafmt/ScalafmtModule.scala index 35cb42232f9..f1fc05c0728 100644 --- a/scalalib/src/mill/scalalib/scalafmt/ScalafmtModule.scala +++ b/scalalib/src/mill/scalalib/scalafmt/ScalafmtModule.scala @@ -87,7 +87,5 @@ object ScalafmtModule extends ExternalModule with ScalafmtModule { ) } - import mill.main.TokenReaders._ - lazy val millDiscover = Discover[this.type] } From 0790389ecf93637ea8ba886108262c444d986a92 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 21:13:41 +0800 Subject: [PATCH 06/19] . --- main/core/src/mill/define/Args.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main/core/src/mill/define/Args.scala b/main/core/src/mill/define/Args.scala index 33d9ed07e92..16da2af0c0d 100644 --- a/main/core/src/mill/define/Args.scala +++ b/main/core/src/mill/define/Args.scala @@ -1,7 +1,13 @@ package mill.define +/** + * Represents an unstructured sequence of command-line arguments that can be + * passed to Mill commands; similar to `mainargs.Leftover`. + */ class Args(val value: Seq[String]) object Args { - implicit def createArgs(value: Seq[String]) = new Args(value) + /** + * Constructs an [[Args]] object from `os.Shellable`s + */ def apply(chunks: os.Shellable*) = new Args(chunks.flatMap(_.value)) } From 30bf4fc3072e71bc85876fdee420c9de51d9bb9c Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 21:15:48 +0800 Subject: [PATCH 07/19] . --- main/core/src/mill/define/Task.scala | 7 ------- 1 file changed, 7 deletions(-) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index faef99d63b1..7a94d6d6c72 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -46,7 +46,6 @@ abstract class Task[+T] extends Task.Ops[T] with Applyable[Task, T] { object Task { abstract class Ops[+T] { this: Task[T] => def map[V](f: T => V): Task[V] = new Task.Mapped(this, f) - def mapCtx[V](f: (T, mill.api.Ctx) => Result[V]) = new Task.MappedCtx(this, f) def filter(f: T => Boolean) = this def withFilter(f: T => Boolean) = this def zip[V](other: Task[V]): Task[(T, V)] = new Task.Zipped(this, other) @@ -79,12 +78,6 @@ object Task { val inputs = List(source) } - private[define] class MappedCtx[+T, +V](source: Task[T], f: (T, mill.api.Ctx) => Result[V]) - extends Task[V] { - def evaluate(ctx: mill.api.Ctx) = f(ctx.args(0).asInstanceOf[T], ctx) - val inputs = List(source) - } - private[define] class Zipped[+T, +V](source1: Task[T], source2: Task[V]) extends Task[(T, V)] { def evaluate(ctx: mill.api.Ctx) = (ctx.arg(0), ctx.arg(1)) val inputs = List(source1, source2) From 43e3004bd9735f808d0ec9567fc7e1db5bc8c9a8 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 21:32:10 +0800 Subject: [PATCH 08/19] tweak imports --- .../bloop/src/mill/contrib/bloop/BloopImpl.scala | 2 +- .../src/mill/contrib/proguard/Proguard.scala | 11 +++-------- .../mill/contrib/scalapblib/ScalaPBModule.scala | 1 - .../mill/contrib/scalapblib/TutorialTests.scala | 3 +-- .../mill/contrib/scoverage/ScoverageModule.scala | 1 - .../twirllib/src/mill/twirllib/TwirlModule.scala | 1 - .../contrib/versionfile/VersionFileModule.scala | 2 +- main/core/src/mill/define/package.scala | 7 ------- main/src/mill/package.scala | 16 +++++++++++++++- .../test/src/mill/eval/JavaCompileJarTests.scala | 1 - main/testkit/src/mill/testkit/MillTestkit.scala | 5 ++--- scalalib/src/mill/scalalib/JavaModule.scala | 1 - scalalib/src/mill/scalalib/ScalaModule.scala | 1 - .../src/mill/scalalib/SemanticDbJavaModule.scala | 4 ++-- .../src/mill/scalalib/ZincWorkerModule.scala | 5 ++--- scalalib/src/mill/scalalib/bsp/BspModule.scala | 10 +++------- .../src/mill/scalalib/bsp/MillBuildModule.scala | 4 ++-- .../mill/scalalib/scalafmt/ScalafmtModule.scala | 2 +- .../test/src/mill/scalalib/HelloWorldTests.scala | 2 +- .../mill/scalalib/scalafmt/ScalafmtTests.scala | 3 +-- 20 files changed, 35 insertions(+), 47 deletions(-) delete mode 100644 main/core/src/mill/define/package.scala diff --git a/contrib/bloop/src/mill/contrib/bloop/BloopImpl.scala b/contrib/bloop/src/mill/contrib/bloop/BloopImpl.scala index 0c7b6458d29..59cd76682d0 100644 --- a/contrib/bloop/src/mill/contrib/bloop/BloopImpl.scala +++ b/contrib/bloop/src/mill/contrib/bloop/BloopImpl.scala @@ -3,7 +3,7 @@ package mill.contrib.bloop import bloop.config.{Config => BloopConfig, Tag => BloopTag} import mill._ import mill.api.Result -import mill.define.{Module => MillModule, _} +import mill.define.{Module => MillModule, ExternalModule, Discover} import mill.eval.Evaluator import mill.scalalib.internal.ModuleUtils import mill.scalajslib.ScalaJSModule diff --git a/contrib/proguard/src/mill/contrib/proguard/Proguard.scala b/contrib/proguard/src/mill/contrib/proguard/Proguard.scala index 38a0e5cb4f3..5c655e4ea95 100644 --- a/contrib/proguard/src/mill/contrib/proguard/Proguard.scala +++ b/contrib/proguard/src/mill/contrib/proguard/Proguard.scala @@ -1,17 +1,12 @@ package mill.contrib.proguard -import scala.util.Properties - -import coursier.Repositories import mill.java9rtexport.Export import mill.T import mill.Agg -import mill.api.{Logger, Loose, PathRef, Result} -import mill.define.{Sources, Target} +import mill.api.{Loose, PathRef} import mill.modules.Jvm -import mill.scalalib.Lib.resolveDependencies -import mill.scalalib.{Dep, DepSyntax, Lib, ScalaModule} -import os.{Path, PathChunk, Shellable, proc} +import mill.scalalib.{DepSyntax, ScalaModule} +import os.{Path, Shellable} /** * Adds proguard capabilities when mixed-in to a module diff --git a/contrib/scalapblib/src/mill/contrib/scalapblib/ScalaPBModule.scala b/contrib/scalapblib/src/mill/contrib/scalapblib/ScalaPBModule.scala index f9f809a0571..9cc26aca5bb 100644 --- a/contrib/scalapblib/src/mill/contrib/scalapblib/ScalaPBModule.scala +++ b/contrib/scalapblib/src/mill/contrib/scalapblib/ScalaPBModule.scala @@ -3,7 +3,6 @@ package contrib.scalapblib import coursier.MavenRepository import coursier.core.Version -import mill.define.Sources import mill.api.{IO, Loose, PathRef} import mill.scalalib.Lib.resolveDependencies import mill.scalalib._ diff --git a/contrib/scalapblib/test/src/mill/contrib/scalapblib/TutorialTests.scala b/contrib/scalapblib/test/src/mill/contrib/scalapblib/TutorialTests.scala index dc0044e9a75..96988026c95 100644 --- a/contrib/scalapblib/test/src/mill/contrib/scalapblib/TutorialTests.scala +++ b/contrib/scalapblib/test/src/mill/contrib/scalapblib/TutorialTests.scala @@ -1,8 +1,7 @@ package mill.contrib.scalapblib -import mill.T +import mill._ import mill.api.{PathRef, Result} -import mill.define.Sources import mill.util.{TestEvaluator, TestUtil} import utest.framework.TestPath import utest.{TestSuite, Tests, assert, _} diff --git a/contrib/scoverage/src/mill/contrib/scoverage/ScoverageModule.scala b/contrib/scoverage/src/mill/contrib/scoverage/ScoverageModule.scala index d7742eba3d1..49cbdbbef70 100644 --- a/contrib/scoverage/src/mill/contrib/scoverage/ScoverageModule.scala +++ b/contrib/scoverage/src/mill/contrib/scoverage/ScoverageModule.scala @@ -4,7 +4,6 @@ import coursier.Repository import mill._ import mill.api.{Loose, PathRef} import mill.contrib.scoverage.api.ScoverageReportWorkerApi.ReportType -import mill.define.{Command, Persistent, Sources, Target, Task} import mill.scalalib.api.ZincWorkerUtil import mill.scalalib.{Dep, DepSyntax, JavaModule, ScalaModule} import mill.api.Result diff --git a/contrib/twirllib/src/mill/twirllib/TwirlModule.scala b/contrib/twirllib/src/mill/twirllib/TwirlModule.scala index b348c07f4e8..5822b468fbb 100644 --- a/contrib/twirllib/src/mill/twirllib/TwirlModule.scala +++ b/contrib/twirllib/src/mill/twirllib/TwirlModule.scala @@ -2,7 +2,6 @@ package mill package twirllib import coursier.{Dependency, Repository} -import mill.define.{Sources, Task} import mill.api.PathRef import mill.scalalib._ import mill.api.Loose diff --git a/contrib/versionfile/src/mill/contrib/versionfile/VersionFileModule.scala b/contrib/versionfile/src/mill/contrib/versionfile/VersionFileModule.scala index 5d5fdfcaf4a..07bb4805a6b 100644 --- a/contrib/versionfile/src/mill/contrib/versionfile/VersionFileModule.scala +++ b/contrib/versionfile/src/mill/contrib/versionfile/VersionFileModule.scala @@ -5,7 +5,7 @@ import mill._, scalalib._ trait VersionFileModule extends Module { /** The file containing the current version. */ - def versionFile: define.Source = T.source(millSourcePath / "version") + def versionFile: Source = T.source(millSourcePath / "version") /** The current version. */ def currentVersion: T[Version] = T { Version.of(os.read(versionFile().path).trim) } diff --git a/main/core/src/mill/define/package.scala b/main/core/src/mill/define/package.scala deleted file mode 100644 index 117076bf4b5..00000000000 --- a/main/core/src/mill/define/package.scala +++ /dev/null @@ -1,7 +0,0 @@ -package mill -package object define { - type Source = define.Target[mill.api.PathRef] - type Sources = define.Target[Seq[mill.api.PathRef]] - type Input[T] = define.Target[T] - type Persistent[T] = define.Target[T] -} diff --git a/main/src/mill/package.scala b/main/src/mill/package.scala index 1cbd8dd7806..071f608e5ec 100644 --- a/main/src/mill/package.scala +++ b/main/src/mill/package.scala @@ -1,6 +1,8 @@ package object mill extends mill.api.JsonFormatters { val T = define.Target - type T[T] = define.Target[T] + type T[+T] = define.Target[T] + val Target = define.Target + type Target[+T] = define.Target[T] val PathRef = mill.api.PathRef type PathRef = mill.api.PathRef type Module = define.Module @@ -12,4 +14,16 @@ package object mill extends mill.api.JsonFormatters { val RootModule = mill.main.RootModule type Args = define.Args val Args = define.Args + + val Task = define.Task + type Task[+T] = define.Task[T] + + type Command[+T] = define.Command[T] + type Worker[+T] = define.Worker[T] + type Input[T] = define.Target[T] + type Persistent[T] = define.Target[T] + type Source = define.Target[mill.api.PathRef] + type Sources = define.Target[Seq[mill.api.PathRef]] + + type TaskModule = define.TaskModule } diff --git a/main/test/src/mill/eval/JavaCompileJarTests.scala b/main/test/src/mill/eval/JavaCompileJarTests.scala index 9839929413a..6dcbe8e19f5 100644 --- a/main/test/src/mill/eval/JavaCompileJarTests.scala +++ b/main/test/src/mill/eval/JavaCompileJarTests.scala @@ -1,6 +1,5 @@ package mill.eval -import mill.define.{Discover, Input, Target, Task} import mill.modules.Jvm import mill.api.Ctx.Dest import mill.{Module, T} diff --git a/main/testkit/src/mill/testkit/MillTestkit.scala b/main/testkit/src/mill/testkit/MillTestkit.scala index c6a1645e418..cfd7d3cc2fd 100644 --- a/main/testkit/src/mill/testkit/MillTestkit.scala +++ b/main/testkit/src/mill/testkit/MillTestkit.scala @@ -1,17 +1,16 @@ package mill.testkit -import mill.define._ +import mill._ +import mill.define.{Discover, TargetImpl, InputImpl} import mill.api.{DummyInputStream, Result, SystemStreams} import mill.api.Result.OuterStack import mill.api.Strict.Agg import java.io.{InputStream, PrintStream} -import mill.define.{Input, Task} import mill.eval.Evaluator import mill.util.PrintLogger import language.experimental.macros -import scala.collection.mutable trait MillTestKit { diff --git a/scalalib/src/mill/scalalib/JavaModule.scala b/scalalib/src/mill/scalalib/JavaModule.scala index e886822f603..873c59ea529 100644 --- a/scalalib/src/mill/scalalib/JavaModule.scala +++ b/scalalib/src/mill/scalalib/JavaModule.scala @@ -11,7 +11,6 @@ import coursier.util.ModuleMatcher import mainargs.Flag import mill.api.Loose.Agg import mill.api.{JarManifest, PathRef, Result, internal} -import mill.define.{Command, Sources, Target, Task, TaskModule} import mill.modules.{Assembly, Jvm} import mill.scalalib.api.CompilationResult import mill.scalalib.bsp.{BspBuildTarget, BspModule} diff --git a/scalalib/src/mill/scalalib/ScalaModule.scala b/scalalib/src/mill/scalalib/ScalaModule.scala index 00bfc70cb4b..40c7da2d7aa 100644 --- a/scalalib/src/mill/scalalib/ScalaModule.scala +++ b/scalalib/src/mill/scalalib/ScalaModule.scala @@ -2,7 +2,6 @@ package mill package scalalib import scala.annotation.nowarn -import mill.define.{Command, Sources, Target, Task} import mill.api.{DummyInputStream, JarManifest, PathRef, Result, internal} import mill.modules.Jvm import mill.modules.Jvm.createJar diff --git a/scalalib/src/mill/scalalib/SemanticDbJavaModule.scala b/scalalib/src/mill/scalalib/SemanticDbJavaModule.scala index 19e8592f77f..bee1589850c 100644 --- a/scalalib/src/mill/scalalib/SemanticDbJavaModule.scala +++ b/scalalib/src/mill/scalalib/SemanticDbJavaModule.scala @@ -1,10 +1,10 @@ package mill.scalalib import mill.api.{PathRef, Result, experimental} -import mill.define.{Input, Target, Task} +import mill.define.{Target, Task} import mill.scalalib.api.{Versions, ZincWorkerUtil} import mill.util.Version -import mill.{Agg, BuildInfo, T} +import mill.{Agg, BuildInfo, Input, T} import scala.util.Properties diff --git a/scalalib/src/mill/scalalib/ZincWorkerModule.scala b/scalalib/src/mill/scalalib/ZincWorkerModule.scala index e2a192b2572..019a9735c3a 100644 --- a/scalalib/src/mill/scalalib/ZincWorkerModule.scala +++ b/scalalib/src/mill/scalalib/ZincWorkerModule.scala @@ -4,13 +4,12 @@ import scala.annotation.nowarn import coursier.Repository import mainargs.Flag import mill.Agg -import mill.T +import mill._ import mill.api.{Ctx, FixSizedCache, KeyedLockedCache, PathRef, Result} -import mill.define.{Command, Discover, ExternalModule, Input, Target, Worker} +import mill.define.{ExternalModule, Discover} import mill.scalalib.Lib.resolveDependencies import mill.scalalib.api.ZincWorkerUtil.{isBinaryBridgeAvailable, isDotty, isDottyOrScala3} import mill.scalalib.api.{ZincWorkerApi, ZincWorkerUtil, Versions} -import os.Path /** * A default implementation of [[ZincWorkerModule]] diff --git a/scalalib/src/mill/scalalib/bsp/BspModule.scala b/scalalib/src/mill/scalalib/bsp/BspModule.scala index 31437689536..16a91f65ac2 100644 --- a/scalalib/src/mill/scalalib/bsp/BspModule.scala +++ b/scalalib/src/mill/scalalib/bsp/BspModule.scala @@ -1,13 +1,9 @@ package mill.scalalib.bsp -import mill.api.{Loose, PathRef, internal} -import mill.define.{BaseModule, Segments, Sources, Task} -import mill.eval.EvaluatorPathsResolver -import mill.modules.Jvm -import mill.scalalib.api.CompilationResult +import mill.api.internal +import mill.define.Task import mill.scalalib.internal.ModuleUtils -import mill.scalalib.{Dep, DepSyntax, ScalaModule} -import mill.{Agg, BuildInfo, Module, T} +import mill._ trait BspModule extends Module { import BspModule._ diff --git a/scalalib/src/mill/scalalib/bsp/MillBuildModule.scala b/scalalib/src/mill/scalalib/bsp/MillBuildModule.scala index fa94f3720fe..323d7a8a4ec 100644 --- a/scalalib/src/mill/scalalib/bsp/MillBuildModule.scala +++ b/scalalib/src/mill/scalalib/bsp/MillBuildModule.scala @@ -1,11 +1,11 @@ package mill.scalalib.bsp import mill.api.{Loose, PathRef, internal} -import mill.define.{BaseModule, Discover, ExternalModule, Sources, Target, Task} +import mill.define.{Discover, ExternalModule} import mill.scalalib.api.CompilationResult import mill.scalalib.bsp.BuildScAwareness.{IncludedDep, IncludedFile} import mill.scalalib.{Dep, DepSyntax, ScalaModule} -import mill.{Agg, BuildInfo, T} +import mill._ import os.Path /** diff --git a/scalalib/src/mill/scalalib/scalafmt/ScalafmtModule.scala b/scalalib/src/mill/scalalib/scalafmt/ScalafmtModule.scala index f1fc05c0728..7b79a652ed8 100644 --- a/scalalib/src/mill/scalalib/scalafmt/ScalafmtModule.scala +++ b/scalalib/src/mill/scalalib/scalafmt/ScalafmtModule.scala @@ -2,7 +2,7 @@ package mill.scalalib.scalafmt import mill._ import mill.api.Result -import mill.define._ +import mill.define.{ExternalModule, Discover} import mill.scalalib._ trait ScalafmtModule extends JavaModule { diff --git a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala index bb86a2442cf..95b5f07c7ca 100644 --- a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala +++ b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala @@ -7,7 +7,7 @@ import scala.util.{Properties, Using} import scala.xml.NodeSeq import mill._ import mill.api.Result -import mill.define.{Input, NamedTask, Target} +import mill.define.NamedTask import mill.eval.{Evaluator, EvaluatorPaths} import mill.modules.Assembly import mill.scalalib.api.ZincWorkerUtil diff --git a/scalalib/test/src/mill/scalalib/scalafmt/ScalafmtTests.scala b/scalalib/test/src/mill/scalalib/scalafmt/ScalafmtTests.scala index 40e1ebfd0a7..144742216ed 100644 --- a/scalalib/test/src/mill/scalalib/scalafmt/ScalafmtTests.scala +++ b/scalalib/test/src/mill/scalalib/scalafmt/ScalafmtTests.scala @@ -1,7 +1,6 @@ package mill.scalalib.scalafmt -import mill.T -import mill.define.Sources +import mill._ import mill.main.Tasks import mill.scalalib.ScalaModule import mill.util.{TestEvaluator, TestUtil} From 95d37326af0997de0a483cbd638b746b255d0e3d Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 21:54:26 +0800 Subject: [PATCH 09/19] . --- main/src/mill/main/TokenReaders.scala | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/main/src/mill/main/TokenReaders.scala b/main/src/mill/main/TokenReaders.scala index 6e32b76db61..4959fdd9e0a 100644 --- a/main/src/mill/main/TokenReaders.scala +++ b/main/src/mill/main/TokenReaders.scala @@ -21,11 +21,8 @@ object Tasks { } } -class EvaluatorTokenReader[T]() extends mainargs.TokensReader.Simple[mill.eval.Evaluator] { - def shortName = "" - def read(s: Seq[String]) = Right(Evaluator.currentEvaluator.get.asInstanceOf[mill.eval.Evaluator]) - override def alwaysRepeatable = false - override def allowEmpty = true +class EvaluatorTokenReader[T]() extends mainargs.TokensReader.Constant[mill.eval.Evaluator] { + def read() = Right(Evaluator.currentEvaluator.get.asInstanceOf[mill.eval.Evaluator]) } /** From 447409a127efe2908a5b27085b33d95ecbcb5563 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 21:59:23 +0800 Subject: [PATCH 10/19] . --- example/scalabuilds/3-override-tasks/build.sc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/scalabuilds/3-override-tasks/build.sc b/example/scalabuilds/3-override-tasks/build.sc index e1812bac057..466c5543ef9 100644 --- a/example/scalabuilds/3-override-tasks/build.sc +++ b/example/scalabuilds/3-override-tasks/build.sc @@ -21,9 +21,9 @@ object foo extends ScalaModule { super.compile() } - def run(args: String*) = T.command { + def run(args: Task[Args] = T.task(Args())) = T.command { println("Running..." + args.mkString(" ")) - super.run(args:_*) + super.run(args) } } From 1a8d93ea861b50513c28b307a1aa474d7d795541 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 21:59:51 +0800 Subject: [PATCH 11/19] . --- example/scalabuilds/3-override-tasks/build.sc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/scalabuilds/3-override-tasks/build.sc b/example/scalabuilds/3-override-tasks/build.sc index 466c5543ef9..7cfc6f548b4 100644 --- a/example/scalabuilds/3-override-tasks/build.sc +++ b/example/scalabuilds/3-override-tasks/build.sc @@ -22,7 +22,7 @@ object foo extends ScalaModule { } def run(args: Task[Args] = T.task(Args())) = T.command { - println("Running..." + args.mkString(" ")) + println("Running..." + args().value.mkString(" ")) super.run(args) } } From ccf2c41b3d986781fe91aecdaad0e4dbe34c15fc Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 22:02:59 +0800 Subject: [PATCH 12/19] . --- example/scalabuilds/3-override-tasks/build.sc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/scalabuilds/3-override-tasks/build.sc b/example/scalabuilds/3-override-tasks/build.sc index 7cfc6f548b4..1dab13a11cc 100644 --- a/example/scalabuilds/3-override-tasks/build.sc +++ b/example/scalabuilds/3-override-tasks/build.sc @@ -23,7 +23,7 @@ object foo extends ScalaModule { def run(args: Task[Args] = T.task(Args())) = T.command { println("Running..." + args().value.mkString(" ")) - super.run(args) + super.run(args)() } } From cb48d1f2a333da6c629f202f9ca41f289f713d84 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 22:16:11 +0800 Subject: [PATCH 13/19] tweak --- main/src/mill/main/TokenReaders.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/src/mill/main/TokenReaders.scala b/main/src/mill/main/TokenReaders.scala index 4959fdd9e0a..c2f65d740a2 100644 --- a/main/src/mill/main/TokenReaders.scala +++ b/main/src/mill/main/TokenReaders.scala @@ -40,7 +40,7 @@ class LeftoverTaskTokenReader[T](tokensReaderOfT: TokensReader.Leftover[T, _]) extends mainargs.TokensReader.Leftover[Task[T], T] { def read(strs: Seq[String]): Either[String, Task[T]] = tokensReaderOfT.read(strs).map(t => Target.task(t)) - def wrapped = tokensReaderOfT + def shortName = tokensReaderOfT.shortName } object TokenReaders { @@ -52,7 +52,7 @@ object TokenReaders { implicit def millArgsTokenReader: mainargs.TokensReader.ShortNamed[Args] = new TokensReader.Leftover[Args, String] { def read(strs: Seq[String]) = Right(new Args(strs)) - def wrapped = implicitly[TokensReader.ShortNamed[String]] + def shortName = implicitly[TokensReader.ShortNamed[String]].shortName } implicit def millTaskTokenReader[T](implicit From ff9e82e597af1978239a533513adf86b5243db6b Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 27 Apr 2023 22:21:43 +0800 Subject: [PATCH 14/19] . --- main/core/src/mill/define/Args.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/main/core/src/mill/define/Args.scala b/main/core/src/mill/define/Args.scala index 16da2af0c0d..480e4f6515a 100644 --- a/main/core/src/mill/define/Args.scala +++ b/main/core/src/mill/define/Args.scala @@ -6,6 +6,7 @@ package mill.define */ class Args(val value: Seq[String]) object Args { + /** * Constructs an [[Args]] object from `os.Shellable`s */ From 707f492f213c2204a2f1d940506e6899d8af7824 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sat, 29 Apr 2023 17:26:06 +0800 Subject: [PATCH 15/19] . --- build.sc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sc b/build.sc index 55ad124b458..b8a93c7d420 100644 --- a/build.sc +++ b/build.sc @@ -127,7 +127,7 @@ object Deps { val lambdaTest = ivy"de.tototec:de.tobiasroeser.lambdatest:0.8.0" val log4j2Core = ivy"org.apache.logging.log4j:log4j-core:2.20.0" val osLib = ivy"com.lihaoyi::os-lib:0.9.1" - val mainargs = ivy"com.lihaoyi::mainargs:0.5.0-M1" + val mainargs = ivy"com.lihaoyi::mainargs:0.5.0" val millModuledefsVersion = "0.10.9" val millModuledefsString = s"com.lihaoyi::mill-moduledefs:${millModuledefsVersion}" val millModuledefs = ivy"${millModuledefsString}" From d45b57b695cb9b73f2928e99ef00cda55fec1890 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 29 Apr 2023 20:33:24 +0800 Subject: [PATCH 16/19] updat-epatch --- ci/mill-bootstrap.patch | 43 ++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/ci/mill-bootstrap.patch b/ci/mill-bootstrap.patch index 8ac8bfce3a7..9495fc07c2d 100644 --- a/ci/mill-bootstrap.patch +++ b/ci/mill-bootstrap.patch @@ -1,8 +1,8 @@ diff --git a/build.sc b/build.sc -index 9bde15da2b..419ffbcab4 100644 +index b6b06b7584..b49a252914 100644 --- a/build.sc +++ b/build.sc -@@ -2,30 +2,21 @@ +@@ -2,34 +2,26 @@ import $file.ci.shared import $file.ci.upload import $ivy.`org.scalaj::scalaj-http:2.4.2` @@ -25,7 +25,8 @@ index 9bde15da2b..419ffbcab4 100644 import coursier.maven.MavenRepository -import de.tobiasroeser.mill.vcs.version.VcsVersion import mill._ - import mill.define.{Command, Source, Sources, Target, Task} +-import mill.define.{Command, Source, Sources, Target, Task} ++import mill.{Command, Source, Sources, Target, Task} import mill.eval.Evaluator import mill.main.MainModule import mill.scalalib._ @@ -37,7 +38,13 @@ index 9bde15da2b..419ffbcab4 100644 import scala.util.control.NonFatal import mill.T -@@ -163,12 +154,8 @@ object Deps { +-import mill.define.{Discover, ExternalModule, Input, Module, Task} ++import mill.define.{Discover, ExternalModule} ++import mill.{Input, Module, Task} + import mill.api.{Logger, Result} + import os.{CommandResult, SubprocessException} + +@@ -164,12 +156,8 @@ object Deps { val requests = ivy"com.lihaoyi::requests:0.8.0" } @@ -52,7 +59,7 @@ index 9bde15da2b..419ffbcab4 100644 def millBinPlatform: T[String] = T { val tag = millLastTag() if (tag.contains("-M")) tag -@@ -217,8 +204,8 @@ val buildBridgeScalaVersions = +@@ -218,8 +206,8 @@ val buildBridgeScalaVersions = if (!buildAllCompilerBridges) Seq() else bridgeScalaVersions @@ -63,7 +70,7 @@ index 9bde15da2b..419ffbcab4 100644 def scalaVersion = crossScalaVersion def publishVersion = bridgeVersion def artifactName = T { "mill-scala-compiler-bridge" } -@@ -237,239 +224,25 @@ class BridgeModule(val crossScalaVersion: String) extends PublishModule with Cro +@@ -238,239 +226,25 @@ class BridgeModule(val crossScalaVersion: String) extends PublishModule with Cro def generatedSources = T { import mill.scalalib.api.ZincWorkerUtil.{grepJar, scalaBinaryVersion} val resolvedJars = resolveDeps( @@ -308,7 +315,7 @@ index 9bde15da2b..419ffbcab4 100644 def commonPomSettings(artifactName: String) = { PomSettings( description = artifactName, -@@ -523,27 +296,8 @@ trait MillCoursierModule extends CoursierModule { +@@ -524,27 +298,8 @@ trait MillCoursierModule extends CoursierModule { ) } @@ -337,7 +344,7 @@ index 9bde15da2b..419ffbcab4 100644 } /** A Module compiled with applied Mill-specific compiler plugins: mill-moduledefs. */ -@@ -859,8 +613,10 @@ object scalajslib extends MillModule with BuildInfo { +@@ -861,8 +616,10 @@ object scalajslib extends MillModule with BuildInfo { override def ivyDeps = Agg(Deps.sbtTestInterface) } object worker extends Cross[WorkerModule]("1") @@ -349,7 +356,7 @@ index 9bde15da2b..419ffbcab4 100644 override def ivyDeps = Agg( Deps.Scalajs_1.scalajsLinker, Deps.Scalajs_1.scalajsSbtTestAdapter, -@@ -926,8 +682,10 @@ object contrib extends MillModule { +@@ -928,8 +685,10 @@ object contrib extends MillModule { object api extends MillPublishModule @@ -362,7 +369,7 @@ index 9bde15da2b..419ffbcab4 100644 override def sources = T.sources { // We want to avoid duplicating code as long as the Play APIs allow. // But if newer Play versions introduce incompatibilities, -@@ -1117,8 +875,9 @@ object scalanativelib extends MillModule { +@@ -1119,8 +878,9 @@ object scalanativelib extends MillModule { override def ivyDeps = Agg(Deps.sbtTestInterface) } object worker extends Cross[WorkerModule]("0.4") @@ -374,7 +381,7 @@ index 9bde15da2b..419ffbcab4 100644 override def moduleDeps = Seq(scalanativelib.`worker-api`) override def ivyDeps = scalaNativeWorkerVersion match { case "0.4" => -@@ -1293,7 +1052,9 @@ trait IntegrationTestModule extends MillScalaModule { +@@ -1295,7 +1055,9 @@ trait IntegrationTestModule extends MillScalaModule { } } @@ -385,7 +392,7 @@ index 9bde15da2b..419ffbcab4 100644 object local extends ModeModule object fork extends ModeModule object server extends ModeModule -@@ -1307,15 +1068,15 @@ object example extends MillScalaModule { +@@ -1309,15 +1071,15 @@ object example extends MillScalaModule { def moduleDeps = Seq(integration) @@ -409,7 +416,7 @@ index 9bde15da2b..419ffbcab4 100644 def sources = T.sources() def testRepoRoot: T[PathRef] = T.source(millSourcePath) def compile = example.compile() -@@ -1365,7 +1126,7 @@ object example extends MillScalaModule { +@@ -1367,7 +1129,7 @@ object example extends MillScalaModule { val title = if (seenCode) "" else { @@ -418,7 +425,7 @@ index 9bde15da2b..419ffbcab4 100644 val exampleDashed = examplePath.segments.mkString("-") val download = s"{mill-download-url}/$label-$exampleDashed.zip[download]" val browse = s"{mill-example-url}/$examplePath[browse]" -@@ -1396,9 +1157,9 @@ object example extends MillScalaModule { +@@ -1398,9 +1160,9 @@ object example extends MillScalaModule { } object integration extends MillScalaModule { @@ -431,7 +438,7 @@ index 9bde15da2b..419ffbcab4 100644 def moduleDeps = Seq(scalalib, scalajslib, scalanativelib, runner.test) -@@ -1707,67 +1468,11 @@ object docs extends Module { +@@ -1709,67 +1471,11 @@ object docs extends Module { def moduleDeps = build.millInternal.modules.collect { case m: MillApiModule => m } def unidocSourceUrl = T { @@ -500,7 +507,7 @@ index 9bde15da2b..419ffbcab4 100644 private val npmExe = if (scala.util.Properties.isWin) "npm.cmd" else "npm" private val antoraExe = if (scala.util.Properties.isWin) "antora.cmd" else "antora" def npmBase: T[os.Path] = T.persistent { T.dest } -@@ -1820,7 +1525,7 @@ object docs extends Module { +@@ -1822,7 +1528,7 @@ object docs extends Module { val contribReadmes = T.traverse(contrib.contribModules)(m => T.task { @@ -509,7 +516,7 @@ index 9bde15da2b..419ffbcab4 100644 } )() -@@ -2050,7 +1755,7 @@ def exampleZips: Target[Seq[PathRef]] = T { +@@ -2052,7 +1758,7 @@ def exampleZips: Target[Seq[PathRef]] = T { examplePath = exampleMod.millSourcePath } yield { val example = examplePath.subRelativeTo(T.workspace) @@ -518,7 +525,7 @@ index 9bde15da2b..419ffbcab4 100644 os.copy(examplePath, T.dest / exampleStr, createFolders = true) os.copy(launcher().path, T.dest / exampleStr / "mill") val zip = T.dest / s"$exampleStr.zip" -@@ -2059,49 +1764,7 @@ def exampleZips: Target[Seq[PathRef]] = T { +@@ -2061,49 +1767,7 @@ def exampleZips: Target[Seq[PathRef]] = T { } } From 75532bc1ad6744d960ee2a5116698f0e276496b9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 29 Apr 2023 20:38:57 +0800 Subject: [PATCH 17/19] update-patch --- ci/mill-bootstrap.patch | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ci/mill-bootstrap.patch b/ci/mill-bootstrap.patch index 9495fc07c2d..adae18d4a39 100644 --- a/ci/mill-bootstrap.patch +++ b/ci/mill-bootstrap.patch @@ -1,5 +1,5 @@ diff --git a/build.sc b/build.sc -index b6b06b7584..b49a252914 100644 +index b6b06b7584..8c62146aef 100644 --- a/build.sc +++ b/build.sc @@ -2,34 +2,26 @@ @@ -438,6 +438,17 @@ index b6b06b7584..b49a252914 100644 def moduleDeps = Seq(scalalib, scalajslib, scalanativelib, runner.test) +@@ -1681,8 +1443,8 @@ object dev extends MillModule { + mill.modules.Jvm.createJar(Agg(), mill.modules.Jvm.JarManifest(manifestEntries)) + } + +- def run(args: String*) = T.command { +- args match { ++ def run(args: Task[Args] = T.task(Args())) = T.command { ++ args().value match { + case Nil => mill.api.Result.Failure("Need to pass in cwd as first argument to dev.run") + case wd0 +: rest => + val wd = os.Path(wd0, T.workspace) @@ -1709,67 +1471,11 @@ object docs extends Module { def moduleDeps = build.millInternal.modules.collect { case m: MillApiModule => m } From 869802491409f33a12a686a47f8c1a14836bbdb1 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 30 Apr 2023 08:20:50 +0800 Subject: [PATCH 18/19] Update main/define/src/mill/define/Discover.scala Co-authored-by: Tobias Roeser --- main/define/src/mill/define/Discover.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/define/src/mill/define/Discover.scala b/main/define/src/mill/define/Discover.scala index 62eafadd8ed..5bf18fc3aa5 100644 --- a/main/define/src/mill/define/Discover.scala +++ b/main/define/src/mill/define/Discover.scala @@ -114,7 +114,7 @@ object Discover { } c.Expr[Discover[T]]( - q"import mill.main.TokenReaders._; _root_.mill.define.Discover(_root_.scala.collection.immutable.Map(..$mapping))" + q"import _root_.mill.main.TokenReaders._; _root_.mill.define.Discover(_root_.scala.collection.immutable.Map(..$mapping))" ) } } From c47d0efce0daa6410c9bea9f46008c8156bf33b8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 30 Apr 2023 08:29:07 +0800 Subject: [PATCH 19/19] update-patch --- ci/mill-bootstrap.patch | 57 ++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/ci/mill-bootstrap.patch b/ci/mill-bootstrap.patch index 15b610b4fce..3d4ee407f26 100644 --- a/ci/mill-bootstrap.patch +++ b/ci/mill-bootstrap.patch @@ -1,8 +1,14 @@ diff --git a/build.sc b/build.sc -index d7275ab3de..96c5bc0d9c 100644 +index 21678b0fbe..0c96446ceb 100644 --- a/build.sc +++ b/build.sc -@@ -25,8 +25,10 @@ import mill.main.MainModule +@@ -19,17 +19,18 @@ import com.github.lolgab.mill.mima.{ + import coursier.maven.MavenRepository + import de.tobiasroeser.mill.vcs.version.VcsVersion + import mill._ +-import mill.define.{Command, Source, Sources, Target, Task} + import mill.eval.Evaluator + import mill.main.MainModule import mill.scalalib._ import mill.scalalib.publish._ import mill.modules.Jvm @@ -14,8 +20,12 @@ index d7275ab3de..96c5bc0d9c 100644 +import mill.scalalib.api.Versions import scala.util.control.NonFatal import mill.T - import mill.define.{Discover, ExternalModule, Input, Module, Task} -@@ -163,12 +165,8 @@ object Deps { +-import mill.define.{Discover, ExternalModule, Input, Module, Task} ++import mill.define.{Discover, ExternalModule} + import mill.api.{Logger, Result} + import os.{CommandResult, SubprocessException} + +@@ -164,12 +165,8 @@ object Deps { val requests = ivy"com.lihaoyi::requests:0.8.0" } @@ -30,7 +40,7 @@ index d7275ab3de..96c5bc0d9c 100644 def millBinPlatform: T[String] = T { val tag = millLastTag() if (tag.contains("-M")) tag -@@ -217,8 +215,8 @@ val buildBridgeScalaVersions = +@@ -218,8 +215,8 @@ val buildBridgeScalaVersions = if (!buildAllCompilerBridges) Seq() else bridgeScalaVersions @@ -41,7 +51,7 @@ index d7275ab3de..96c5bc0d9c 100644 def scalaVersion = crossScalaVersion def publishVersion = bridgeVersion def artifactName = T { "mill-scala-compiler-bridge" } -@@ -237,239 +235,25 @@ class BridgeModule(val crossScalaVersion: String) extends PublishModule with Cro +@@ -238,239 +235,25 @@ class BridgeModule(val crossScalaVersion: String) extends PublishModule with Cro def generatedSources = T { import mill.scalalib.api.ZincWorkerUtil.{grepJar, scalaBinaryVersion} val resolvedJars = resolveDeps( @@ -286,7 +296,7 @@ index d7275ab3de..96c5bc0d9c 100644 def commonPomSettings(artifactName: String) = { PomSettings( description = artifactName, -@@ -523,27 +307,8 @@ trait MillCoursierModule extends CoursierModule { +@@ -524,27 +307,8 @@ trait MillCoursierModule extends CoursierModule { ) } @@ -315,7 +325,7 @@ index d7275ab3de..96c5bc0d9c 100644 } /** A Module compiled with applied Mill-specific compiler plugins: mill-moduledefs. */ -@@ -846,7 +611,10 @@ object scalajslib extends MillModule with BuildInfo { +@@ -852,7 +616,10 @@ object scalajslib extends MillModule with BuildInfo { override def ivyDeps = Agg(Deps.sbtTestInterface) } object worker extends Cross[WorkerModule]("1") @@ -327,7 +337,7 @@ index d7275ab3de..96c5bc0d9c 100644 def testDepPaths = T{ Seq(compile().classes) } override def moduleDeps = Seq(scalajslib.`worker-api`, main.client, main.api) override def ivyDeps = Agg( -@@ -911,8 +679,10 @@ object contrib extends MillModule { +@@ -917,8 +684,10 @@ object contrib extends MillModule { object api extends MillPublishModule @@ -340,7 +350,7 @@ index d7275ab3de..96c5bc0d9c 100644 override def sources = T.sources { // We want to avoid duplicating code as long as the Play APIs allow. // But if newer Play versions introduce incompatibilities, -@@ -1074,8 +844,9 @@ object scalanativelib extends MillModule { +@@ -1080,8 +849,9 @@ object scalanativelib extends MillModule { override def ivyDeps = Agg(Deps.sbtTestInterface) } object worker extends Cross[WorkerModule]("0.4") @@ -352,7 +362,7 @@ index d7275ab3de..96c5bc0d9c 100644 def testDepPaths = T{ Seq(compile().classes) } override def moduleDeps = Seq(scalanativelib.`worker-api`) override def ivyDeps = scalaNativeWorkerVersion match { -@@ -1228,7 +999,9 @@ trait IntegrationTestModule extends MillScalaModule { +@@ -1231,7 +1001,9 @@ trait IntegrationTestModule extends MillScalaModule { } } @@ -363,7 +373,7 @@ index d7275ab3de..96c5bc0d9c 100644 object local extends ModeModule{ def testTransitiveDeps = super.testTransitiveDeps() ++ Seq( runner.linenumbers.testDep(), -@@ -1254,15 +1027,15 @@ object example extends MillScalaModule { +@@ -1252,15 +1024,15 @@ object example extends MillScalaModule { def moduleDeps = Seq(integration) @@ -387,7 +397,7 @@ index d7275ab3de..96c5bc0d9c 100644 def sources = T.sources() def testRepoRoot: T[PathRef] = T.source(millSourcePath) def compile = example.compile() -@@ -1312,7 +1085,7 @@ object example extends MillScalaModule { +@@ -1310,7 +1082,7 @@ object example extends MillScalaModule { val title = if (seenCode) "" else { @@ -396,7 +406,7 @@ index d7275ab3de..96c5bc0d9c 100644 val exampleDashed = examplePath.segments.mkString("-") val download = s"{mill-download-url}/$label-$exampleDashed.zip[download]" val browse = s"{mill-example-url}/$examplePath[browse]" -@@ -1343,9 +1116,9 @@ object example extends MillScalaModule { +@@ -1341,9 +1113,9 @@ object example extends MillScalaModule { } object integration extends MillScalaModule { @@ -409,7 +419,18 @@ index d7275ab3de..96c5bc0d9c 100644 def moduleDeps = Seq(scalalib, scalajslib, scalanativelib, runner.test) -@@ -1677,67 +1450,11 @@ object docs extends Module { +@@ -1640,8 +1412,8 @@ object dev extends MillModule { + mill.modules.Jvm.createJar(Agg(), mill.modules.Jvm.JarManifest(manifestEntries)) + } + +- def run(args: String*) = T.command { +- args match { ++ def run(args: Task[Args] = T.task(Args())) = T.command { ++ args().value match { + case Nil => mill.api.Result.Failure("Need to pass in cwd as first argument to dev.run") + case wd0 +: rest => + val wd = os.Path(wd0, T.workspace) +@@ -1668,67 +1440,11 @@ object docs extends Module { def moduleDeps = build.millInternal.modules.collect { case m: MillApiModule => m } def unidocSourceUrl = T { @@ -478,7 +499,7 @@ index d7275ab3de..96c5bc0d9c 100644 private val npmExe = if (scala.util.Properties.isWin) "npm.cmd" else "npm" private val antoraExe = if (scala.util.Properties.isWin) "antora.cmd" else "antora" def npmBase: T[os.Path] = T.persistent { T.dest } -@@ -1790,7 +1507,7 @@ object docs extends Module { +@@ -1781,7 +1497,7 @@ object docs extends Module { val contribReadmes = T.traverse(contrib.contribModules)(m => T.task { @@ -487,7 +508,7 @@ index d7275ab3de..96c5bc0d9c 100644 } )() -@@ -2019,7 +1736,7 @@ def exampleZips: Target[Seq[PathRef]] = T { +@@ -2011,7 +1727,7 @@ def exampleZips: Target[Seq[PathRef]] = T { examplePath = exampleMod.millSourcePath } yield { val example = examplePath.subRelativeTo(T.workspace) @@ -496,7 +517,7 @@ index d7275ab3de..96c5bc0d9c 100644 os.copy(examplePath, T.dest / exampleStr, createFolders = true) os.copy(launcher().path, T.dest / exampleStr / "mill") val zip = T.dest / s"$exampleStr.zip" -@@ -2028,49 +1745,7 @@ def exampleZips: Target[Seq[PathRef]] = T { +@@ -2020,49 +1736,7 @@ def exampleZips: Target[Seq[PathRef]] = T { } }