summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-11-11 11:36:47 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-11-11 11:36:47 -0800
commit0b5de583df91b7f2b33490003a8d35934c7e27f9 (patch)
tree6b938209cf4ea270c059136fa944b7c38831e067
parentefbaf34d7d977a13a083638426b86f5a2218eceb (diff)
downloadmill-0b5de583df91b7f2b33490003a8d35934c7e27f9.tar.gz
mill-0b5de583df91b7f2b33490003a8d35934c7e27f9.tar.bz2
mill-0b5de583df91b7f2b33490003a8d35934c7e27f9.zip
Swap over to new `projectDeps` mechanism for defining dependencies between various `scalaplugin.Subproject`s
-rw-r--r--build.sc27
-rw-r--r--core/src/main/scala/mill/discover/Discovered.scala2
-rw-r--r--core/src/main/scala/mill/eval/PathRef.scala1
-rw-r--r--core/src/main/scala/mill/modules/Jvm.scala2
-rw-r--r--core/src/test/examples/javac/build.sc2
-rw-r--r--core/src/test/scala/mill/CacherTests.scala2
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala41
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala84
-rw-r--r--scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala4
9 files changed, 137 insertions, 28 deletions
diff --git a/build.sc b/build.sc
index 63de65bf..f31fb69f 100644
--- a/build.sc
+++ b/build.sc
@@ -9,10 +9,12 @@ import mill._
import mill.scalaplugin._
object Build{
+ trait MillSubproject extends Subproject{
+ def scalaVersion = T{ "2.12.4" }
+ }
+ object Core extends MillSubproject {
- object Core extends Subproject {
- def scalaVersion = T{ "2.12.4" }
override def compileIvyDeps = T{
super.compileIvyDeps() ++ Seq[ScalaDep](
Dep(Mod("org.scala-lang", "scala-reflect"), scalaVersion(), configuration = "provided")
@@ -25,23 +27,24 @@ object Build{
ScalaDep(Dep(Mod("com.lihaoyi", "pprint"), "0.5.3")),
ScalaDep.Point(Dep(Mod("com.lihaoyi", "ammonite"), "1.0.3")),
ScalaDep(Dep(Mod("com.typesafe.play", "play-json"), "2.6.6")),
- ScalaDep(Dep(Mod("org.scala-sbt", "zinc"), "1.0.3"))
+ ScalaDep(Dep(Mod("org.scala-sbt", "zinc"), "1.0.3")),
+ Dep(Mod("org.scala-sbt", "test-interface"), "1.0")
)
}
-
def basePath = T{ pwd / 'core }
- override def sources = T{ PathRef(pwd/'core/'src/'main/'scala) }
- override def resources = T{ sources }
+ override def sources = T{ pwd/'core/'src/'main/'scala }
+ }
+ object CoreTests extends MillSubproject {
+ override def projectDeps = Seq(Core)
+ def basePath = T{ pwd / 'scalaplugin }
+ override def sources = T{ pwd/'core/'src/'test/'scala }
}
- object ScalaPlugin extends Subproject {
- def scalaVersion = T{ "2.12.4" }
- override def depClasspath = T{ Seq(Core.compiled()) }
- override def ivyDeps = T{ Core.ivyDeps }
+ object ScalaPlugin extends MillSubproject {
+ override def projectDeps = Seq(Core)
def basePath = T{ pwd / 'scalaplugin }
- override def sources = T{ PathRef(pwd/'scalaplugin/'src/'main/'scala) }
- override def resources = T{ sources }
+ override def sources = T{ pwd/'scalaplugin/'src/'main/'scala }
}
}
@main def main(): Any = Build -> mill.discover.Discovered[Build.type]
diff --git a/core/src/main/scala/mill/discover/Discovered.scala b/core/src/main/scala/mill/discover/Discovered.scala
index c8edf26a..3fca9a9f 100644
--- a/core/src/main/scala/mill/discover/Discovered.scala
+++ b/core/src/main/scala/mill/discover/Discovered.scala
@@ -1,6 +1,6 @@
package mill.discover
-import mill.define.Task
+import mill.define.{Target, Task}
import mill.discover.Router.{EntryPoint, Result}
import play.api.libs.json.Format
diff --git a/core/src/main/scala/mill/eval/PathRef.scala b/core/src/main/scala/mill/eval/PathRef.scala
index 5f7efe89..6d99ad91 100644
--- a/core/src/main/scala/mill/eval/PathRef.scala
+++ b/core/src/main/scala/mill/eval/PathRef.scala
@@ -55,6 +55,7 @@ case class PathRef(path: ammonite.ops.Path){
}
object PathRef{
+ implicit def make(p: ammonite.ops.Path): PathRef = PathRef(p)
private implicit val pathFormat: Format[Path] = JsonFormatters.pathFormat
implicit def jsonFormatter: Format[PathRef] = Json.format
}
diff --git a/core/src/main/scala/mill/modules/Jvm.scala b/core/src/main/scala/mill/modules/Jvm.scala
index bfb7defe..bbaf1474 100644
--- a/core/src/main/scala/mill/modules/Jvm.scala
+++ b/core/src/main/scala/mill/modules/Jvm.scala
@@ -64,7 +64,7 @@ object Jvm {
val inputs = roots
def evaluate(args: Args): PathRef = {
createJar(args.dest, args.args.map(_.asInstanceOf[PathRef].path))
- PathRef(args.dest)
+ args.dest
}
}
}
diff --git a/core/src/test/examples/javac/build.sc b/core/src/test/examples/javac/build.sc
index f8789eb7..a54e2110 100644
--- a/core/src/test/examples/javac/build.sc
+++ b/core/src/test/examples/javac/build.sc
@@ -60,7 +60,7 @@ object Foo {
output.write(read.bytes(path))
}
output.close()
- PathRef(args.dest)
+ args.dest
}
}
diff --git a/core/src/test/scala/mill/CacherTests.scala b/core/src/test/scala/mill/CacherTests.scala
index 1a510e4c..b6aebb0c 100644
--- a/core/src/test/scala/mill/CacherTests.scala
+++ b/core/src/test/scala/mill/CacherTests.scala
@@ -33,7 +33,7 @@ object CacherTests extends TestSuite{
'simpleDefIsCached - assert(
Base.value eq Base.value,
- eval(Base, Base.value) == 1
+ eval(Base, Base.value) == 11
)
'overridingDefIsAlsoCached - assert(
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala b/scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala
index f30e74d2..054bc5be 100644
--- a/scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala
@@ -110,7 +110,7 @@ object Subproject{
l
}
)
- PathRef(outputPath)
+ outputPath
}
def resolveDependencies(repositories: Seq[Repository],
@@ -171,7 +171,7 @@ object Subproject{
}
import Subproject._
-abstract class Subproject extends Cacher{
+trait Subproject extends Cacher{
def scalaVersion: T[String]
def scalaBinaryVersion = T{ scalaVersion().split('.').dropRight(1).mkString(".") }
@@ -185,9 +185,25 @@ abstract class Subproject extends Cacher{
MavenRepository("https://repo1.maven.org/maven2")
)
+ def projectDeps = Seq.empty[Subproject]
def depClasspath = T{ Seq.empty[PathRef] }
- def compileDepClasspath = T[Seq[PathRef]] {
- depClasspath() ++ resolveDependencies(
+
+
+ def upstreamRunClasspath = T {
+ Task.traverse(
+ for (p <- projectDeps)
+ yield T.task(p.runDepClasspath() ++ Seq(p.compiled()))
+ )
+ }
+ def upstreamCompileClasspath = T {
+ Task.traverse(
+ for (p <- projectDeps)
+ yield T.task(p.compileDepClasspath() ++ Seq(p.compiled()))
+ )
+ }
+
+ def compileDepClasspath: T[Seq[PathRef]] = T{
+ upstreamCompileClasspath().flatten ++ depClasspath() ++ resolveDependencies(
repositories,
scalaVersion(),
scalaBinaryVersion(),
@@ -195,8 +211,10 @@ abstract class Subproject extends Cacher{
)
}
- def runDepClasspath = T[Seq[PathRef]] {
- depClasspath() ++ resolveDependencies(
+ def runDepClasspath: T[Seq[PathRef]] = T{
+ upstreamRunClasspath().flatten ++
+ depClasspath() ++
+ resolveDependencies(
repositories,
scalaVersion(),
scalaBinaryVersion(),
@@ -204,8 +222,8 @@ abstract class Subproject extends Cacher{
)
}
- def sources = T{ PathRef(basePath() / 'src) }
- def resources = T{ PathRef(basePath() / 'resources) }
+ def sources = T[PathRef]{ basePath() / 'src }
+ def resources = T[PathRef]{ basePath() / 'resources }
def compiled = T{
compileScala(scalaVersion(), sources(), compileDepClasspath(), Task.ctx().dest)
}
@@ -215,16 +233,19 @@ abstract class Subproject extends Cacher{
def run(mainClass: String) = T.command{
import ammonite.ops._, ImplicitWd._
- %('java, "-cp", (runDepClasspath().map(_.path) :+ compiled()).mkString(":"), mainClass)
+ %('java, "-cp", (runDepClasspath().map(_.path) :+ compiled().path).mkString(":"), mainClass)
}
def console() = T.command{
import ammonite.ops._, ImplicitWd._
%('java,
"-cp",
- (runDepClasspath().map(_.path) :+ compiled()).mkString(":"),
+ (runDepClasspath().map(_.path) :+ compiled().path).mkString(":"),
"scala.tools.nsc.MainGenericRunner",
"-usejavacp"
)
}
+ def test() = T.command{
+ TestRunner.apply("mill.UTestFramework", Seq(pwd/'core/'target/"scala-2.12"/"test-classes"))
+ }
}
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala b/scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala
new file mode 100644
index 00000000..fb6ff772
--- /dev/null
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala
@@ -0,0 +1,84 @@
+package mill.scalaplugin
+
+import java.io.FileInputStream
+import java.lang.annotation.Annotation
+import java.util.zip.ZipInputStream
+
+import ammonite.ops.{Path, ls, pwd}
+import sbt.testing._
+
+object TestRunner {
+ def listClassFiles(base: Path): Iterator[String] = {
+ if (base.isDir) ls.rec(base).toIterator.filter(_.ext == "class").map(_.relativeTo(base).toString)
+ else {
+ val zip = new ZipInputStream(new FileInputStream(base.toIO))
+ Iterator.continually(zip.getNextEntry).takeWhile(_ != null).map(_.getName).filter(_.endsWith(".class"))
+ }
+ }
+ def runTests(framework: Framework, classpath: Seq[Path]) = {
+
+
+ val fingerprints = framework.fingerprints()
+ val testClasses = classpath.flatMap { base =>
+ listClassFiles(base).flatMap { path =>
+ val cls = Class.forName(path.stripSuffix(".class").replace('/', '.'))
+ fingerprints.find {
+ case f: SubclassFingerprint =>
+ Class.forName(f.superclassName()).isAssignableFrom(cls)
+ case f: AnnotatedFingerprint =>
+ cls.isAnnotationPresent(
+ Class.forName(f.annotationName()).asInstanceOf[Class[Annotation]]
+ )
+ }.map { f => (cls, f) }
+ }
+ }
+ testClasses
+ }
+ // "mill.UTestFramework"
+ // Seq(pwd/'core/'target/"scala-2.12"/"test-classes")
+ def apply(frameworkName: String, testClassfilePath: Seq[Path]): Unit = {
+
+ val framework = Class.forName(frameworkName)
+ .newInstance()
+ .asInstanceOf[sbt.testing.Framework]
+
+ val testClasses = runTests(framework, testClassfilePath)
+
+ pprint.log(testClasses)
+
+ val runner = framework.runner(Array(), Array(), getClass.getClassLoader)
+ println(runner)
+
+ val tasks = runner.tasks(
+ for((cls, fingerprint) <- testClasses.toArray)
+ yield {
+ new TaskDef(cls.getName.stripSuffix("$"), fingerprint, true, Array())
+ }
+ )
+ for(t <- tasks){
+ t.execute(
+ new EventHandler {
+ def handle(event: Event) = ()
+ },
+ Array(
+ new Logger {
+ def debug(msg: String) = println(msg)
+
+ def error(msg: String) = println(msg)
+
+ def ansiCodesSupported() = true
+
+ def warn(msg: String) = println(msg)
+
+ def trace(t: Throwable) = println(t)
+
+ def info(msg: String) = println(msg)
+ })
+ )
+ }
+ val doneMsg = runner.done()
+ if (doneMsg.trim.nonEmpty){
+ println(doneMsg)
+ }
+ }
+}
diff --git a/scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala b/scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala
index 2d6d25e7..21640e6b 100644
--- a/scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala
+++ b/scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala
@@ -30,7 +30,7 @@ object MetacircularTests extends TestSuite{
def basePath = T{ pwd / 'core }
- override def sources = T{ PathRef(pwd/'core/'src/'main/'scala) }
+ override def sources = T{ pwd/'core/'src/'main/'scala }
override def resources = T{ sources }
}
object ScalaPlugin extends Subproject {
@@ -39,7 +39,7 @@ object MetacircularTests extends TestSuite{
override def depClasspath = T{ Seq(Core.compiled()) }
override def ivyDeps = T{ Core.ivyDeps }
def basePath = T{ pwd / 'scalaplugin }
- override def sources = T{ PathRef(pwd/'scalaplugin/'src/'main/'scala) }
+ override def sources = T{ pwd/'scalaplugin/'src/'main/'scala }
override def resources = T{ sources }
}