From b97acb6f671502f57134932d0e7908e333b7cbbe Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Tue, 6 Feb 2018 22:14:17 -0800 Subject: all T.commands to take targets as CLI arguments, and use that to get rid of our custom releaseCI/releaseManual commands --- core/src/mill/define/BaseModule.scala | 50 ++++++++++++++++++++++++++++++----- core/src/mill/main/MainRunner.scala | 1 + core/src/mill/main/Resolve.scala | 13 ++------- core/src/mill/main/Scopt.scala | 19 +++++++++++++ 4 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 core/src/mill/main/Scopt.scala (limited to 'core/src') diff --git a/core/src/mill/define/BaseModule.scala b/core/src/mill/define/BaseModule.scala index 9cefeeae..a449a6a0 100644 --- a/core/src/mill/define/BaseModule.scala +++ b/core/src/mill/define/BaseModule.scala @@ -2,14 +2,16 @@ package mill.define import ammonite.main.Router.Overrides import ammonite.ops.Path +import mill.main.ParseArgs object BaseModule{ case class Implicit(value: BaseModule) } -class BaseModule(millSourcePath0: Path, external0: Boolean = false) - (implicit millModuleEnclosing0: sourcecode.Enclosing, - millModuleLine0: sourcecode.Line, - millName0: sourcecode.Name) + +abstract class BaseModule(millSourcePath0: Path, external0: Boolean = false) + (implicit millModuleEnclosing0: sourcecode.Enclosing, + millModuleLine0: sourcecode.Line, + millName0: sourcecode.Name) extends Module()( mill.define.Ctx.make( implicitly, @@ -28,6 +30,13 @@ class BaseModule(millSourcePath0: Path, external0: Boolean = false) override def millSourcePath = millOuterCtx.millSourcePath override implicit def millModuleBasePath: BasePath = BasePath(millSourcePath) implicit def millImplicitBaseModule: BaseModule.Implicit = BaseModule.Implicit(this) + def millDiscover: Discover[this.type] +// implicit def millScoptModuleReads[T <: mill.Module] = new mill.main.ModuleScopt[T, this.type]( +// this, millDiscover +// ) + implicit def millScoptTargetReads[T] = new TargetScopt[T, this.type]( + this, millDiscover + ) } @@ -35,7 +44,7 @@ abstract class ExternalModule(implicit millModuleEnclosing0: sourcecode.Enclosin millModuleLine0: sourcecode.Line, millName0: sourcecode.Name) extends BaseModule(ammonite.ops.pwd, external0 = true){ - def millDiscover: Discover[_] + implicit def millDiscoverImplicit: Discover[_] = millDiscover assert( !" #".exists(millModuleEnclosing0.value.contains(_)), @@ -44,4 +53,33 @@ abstract class ExternalModule(implicit millModuleEnclosing0: sourcecode.Enclosin override implicit def millModuleSegments = { Segments(millModuleEnclosing0.value.split('.').map(Segment.Label):_*) } -} \ No newline at end of file +} + +class TargetScopt[T, M <: BaseModule](rootModule: M, d: => Discover[M]) + extends scopt.Read[Seq[mill.define.Target[T]]]{ + def arity = 1 + def reads = s => { + val (expanded, Nil) = ParseArgs(Seq(s)).fold(e => throw new Exception(e), identity) + val resolved = expanded.map{ + case (Some(scoping), segments) => + val moduleCls = rootModule.getClass.getClassLoader.loadClass(scoping.render + "$") + val externalRootModule = moduleCls.getField("MODULE$").get(moduleCls).asInstanceOf[ExternalModule] + val crossSelectors = segments.value.map { + case mill.define.Segment.Cross(x) => x.toList.map(_.toString) + case _ => Nil + } + mill.main.Resolve.resolve(segments.value.toList, externalRootModule, d, Nil, crossSelectors.toList, Nil) + case (None, segments) => + rootModule.millInternal.segmentsToModules(segments).asInstanceOf[T] + val crossSelectors = segments.value.map { + case mill.define.Segment.Cross(x) => x.toList.map(_.toString) + case _ => Nil + } + mill.main.Resolve.resolve(segments.value.toList, rootModule, d, Nil, crossSelectors.toList, Nil) + } + mill.util.EitherOps.sequence(resolved) match{ + case Left(s) => throw new Exception(s) + case Right(ts) => ts.flatten.collect{case t: mill.define.Target[T] => t} + } + } +} diff --git a/core/src/mill/main/MainRunner.scala b/core/src/mill/main/MainRunner.scala index e3820e3d..e312aa7a 100644 --- a/core/src/mill/main/MainRunner.scala +++ b/core/src/mill/main/MainRunner.scala @@ -99,6 +99,7 @@ class MainRunner(config: ammonite.main.Cli.Config, | // even if it does nothing... | def $$main() = Iterator[String]() | + | implicit def millScoptReads = new mill.main.ModuleScopt(this, millDiscover) | implicit def millDiscover: mill.define.Discover[this.type] = mill.define.Discover[this.type] | // Need to wrap the returned Module in Some(...) to make sure it | // doesn't get picked up during reflective child-module discovery diff --git a/core/src/mill/main/Resolve.scala b/core/src/mill/main/Resolve.scala index f4eeb8fe..a83e3552 100644 --- a/core/src/mill/main/Resolve.scala +++ b/core/src/mill/main/Resolve.scala @@ -69,19 +69,10 @@ object Resolve { val newRevSelectorsSoFar = head :: revSelectorsSoFar head match{ case Segment.Label(singleLabel) => - if (singleLabel == "__"){ - val matching = - obj.millInternal - .modules - .map(resolve(tail, _, discover, rest, remainingCrossSelectors, newRevSelectorsSoFar)) - .collect{case Right(vs) => vs}.flatten + if (singleLabel == "_") { - if (matching.nonEmpty) Right(matching.toSeq) - else Left("Cannot resolve module " + Segments(newRevSelectorsSoFar.reverse:_*).render) - }else if (singleLabel == "_") { val matching = - obj.millInternal - .reflectNestedObjects[mill.Module] + obj.millInternal.modules .map(resolve(tail, _, discover, rest, remainingCrossSelectors, newRevSelectorsSoFar)) .collect{case Right(vs) => vs}.flatten diff --git a/core/src/mill/main/Scopt.scala b/core/src/mill/main/Scopt.scala new file mode 100644 index 00000000..57d6529d --- /dev/null +++ b/core/src/mill/main/Scopt.scala @@ -0,0 +1,19 @@ +//package mill.main +// +//import mill.define.{BaseModule, Discover, ExternalModule} +// +////class ModuleScopt[T <: mill.Module, M <: BaseModule](rootModule: M, d: => Discover[M]) +//// extends scopt.Read[Seq[T]]{ +//// def arity = 1 +//// def reads = s => { +//// val (expanded, Nil) = ParseArgs(Seq(s)).fold(e => throw new Exception(e), identity) +//// expanded.map{ +//// case (Some(scoping), segments) => +//// val moduleCls = rootModule.getClass.getClassLoader.loadClass(scoping.render + "$") +//// val externalRootModule = moduleCls.getField("MODULE$").get(moduleCls).asInstanceOf[ExternalModule] +//// externalRootModule.millInternal.segmentsToModules(segments).asInstanceOf[T] +//// case (None, segments) => +//// rootModule.millInternal.segmentsToModules(segments).asInstanceOf[T] +//// } +//// } +////} -- cgit v1.2.3