summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-02-04 14:35:35 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-02-04 15:00:58 -0800
commit7022254ac1b156a466baa45afea1bb723bd59929 (patch)
tree8bf0fa5bd42765d54ef0d4a9d915550f7586de2b
parentf47697c1da18407374cf11372af36c4960d80576 (diff)
downloadmill-7022254ac1b156a466baa45afea1bb723bd59929.tar.gz
mill-7022254ac1b156a466baa45afea1bb723bd59929.tar.bz2
mill-7022254ac1b156a466baa45afea1bb723bd59929.zip
allow Result.Failure to take a value
-rw-r--r--core/src/mill/eval/Evaluator.scala24
-rw-r--r--core/src/mill/eval/Result.scala26
-rw-r--r--core/src/mill/main/ReplApplyHandler.scala2
-rw-r--r--core/src/mill/main/RunScript.scala2
-rw-r--r--core/test/src/mill/util/TestEvaluator.scala6
-rw-r--r--core/test/src/mill/util/TestUtil.scala6
-rw-r--r--scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala6
-rw-r--r--scalalib/src/mill/scalalib/ScalaModule.scala5
-rw-r--r--scalalib/test/src/mill/scalalib/HelloWorldTests.scala6
-rw-r--r--scalalib/test/src/mill/scalalib/ResolveDepsTests.scala6
-rw-r--r--scalaworker/src/mill/scalaworker/ScalaWorker.scala4
11 files changed, 61 insertions, 32 deletions
diff --git a/core/src/mill/eval/Evaluator.scala b/core/src/mill/eval/Evaluator.scala
index 3d6d253b..4afbe233 100644
--- a/core/src/mill/eval/Evaluator.scala
+++ b/core/src/mill/eval/Evaluator.scala
@@ -93,9 +93,12 @@ class Evaluator[T](val outPath: Path,
}
- val failing = new util.MultiBiMap.Mutable[Either[Task[_], Labelled[_]], Result.Failing]
+ val failing = new util.MultiBiMap.Mutable[Either[Task[_], Labelled[_]], Result.Failing[_]]
for((k, vs) <- sortedGroups.items()){
- failing.addAll(k, vs.items.flatMap(results.get).collect{case f: Result.Failing => f})
+ failing.addAll(
+ k,
+ vs.items.flatMap(results.get).collect{case f: Result.Failing[_] => f.map(_._1)}
+ )
}
Evaluator.Results(
goals.indexed.map(results(_).map(_._1)),
@@ -177,6 +180,21 @@ class Evaluator[T](val outPath: Path,
)
newResults(labelledNamedTask.task) match{
+ case Result.Failure(_, Some((v, hashCode))) =>
+ labelledNamedTask.task.asWorker match{
+ case Some(w) =>
+ workerCache(w.ctx.segments) = (inputsHash, v)
+ case None =>
+ val terminalResult = labelledNamedTask
+ .writer
+ .asInstanceOf[Option[upickle.default.Writer[Any]]]
+ .map(_.write(v))
+
+ for(t <- terminalResult){
+ write.over(paths.meta, upickle.default.write(inputsHash -> t, indent = 4))
+ }
+ }
+
case Result.Success((v, hashCode)) =>
labelledNamedTask.task.asWorker match{
case Some(w) =>
@@ -335,7 +353,7 @@ object Evaluator{
case class Results(rawValues: Seq[Result[Any]],
evaluated: Agg[Task[_]],
transitive: Agg[Task[_]],
- failing: MultiBiMap[Either[Task[_], Labelled[_]], Result.Failing],
+ failing: MultiBiMap[Either[Task[_], Labelled[_]], Result.Failing[_]],
results: collection.Map[Task[_], Result[Any]]){
def values = rawValues.collect{case Result.Success(v) => v}
}
diff --git a/core/src/mill/eval/Result.scala b/core/src/mill/eval/Result.scala
index f5293c8c..690c5d30 100644
--- a/core/src/mill/eval/Result.scala
+++ b/core/src/mill/eval/Result.scala
@@ -1,22 +1,28 @@
package mill.eval
sealed trait Result[+T]{
- def map[V](f: T => V): Result[V] = this match{
- case Result.Success(v) => Result.Success(f(v))
- case f: Result.Failing => f
- case Result.Skipped => Result.Skipped
- }
+ def map[V](f: T => V): Result[V]
}
object Result{
implicit def create[T](t: => T): Result[T] = {
try Success(t)
catch { case e: Throwable => Exception(e, new OuterStack(new java.lang.Exception().getStackTrace)) }
}
- case class Success[T](value: T) extends Result[T]
- case object Skipped extends Result[Nothing]
- sealed trait Failing extends Result[Nothing]
- case class Failure(msg: String) extends Failing
- case class Exception(throwable: Throwable, outerStack: OuterStack) extends Failing
+ case class Success[T](value: T) extends Result[T]{
+ def map[V](f: T => V) = Result.Success(f(value))
+ }
+ case object Skipped extends Result[Nothing]{
+ def map[V](f: Nothing => V) = this
+ }
+ sealed trait Failing[+T] extends Result[T]{
+ def map[V](f: T => V): Failing[V]
+ }
+ case class Failure[T](msg: String, value: Option[T] = None) extends Failing[T]{
+ def map[V](f: T => V) = Result.Failure(msg, value.map(f(_)))
+ }
+ case class Exception(throwable: Throwable, outerStack: OuterStack) extends Failing[Nothing]{
+ def map[V](f: Nothing => V) = this
+ }
class OuterStack(val value: Seq[StackTraceElement]){
override def hashCode() = value.hashCode()
diff --git a/core/src/mill/main/ReplApplyHandler.scala b/core/src/mill/main/ReplApplyHandler.scala
index 66f80630..33013e2d 100644
--- a/core/src/mill/main/ReplApplyHandler.scala
+++ b/core/src/mill/main/ReplApplyHandler.scala
@@ -51,7 +51,7 @@ class ReplApplyHandler(pprinter0: pprint.PPrinter,
for(v <- vs){
v match{
- case Result.Failure(m) => msg.append(m + "\n")
+ case Result.Failure(m, _) => msg.append(m + "\n")
case Result.Exception(t, outerStack) =>
msg.append(
t.toString +
diff --git a/core/src/mill/main/RunScript.scala b/core/src/mill/main/RunScript.scala
index 4d74833e..fd969524 100644
--- a/core/src/mill/main/RunScript.scala
+++ b/core/src/mill/main/RunScript.scala
@@ -185,7 +185,7 @@ object RunScript{
case Result.Exception(t, outerStack) =>
t.toString +
t.getStackTrace.dropRight(outerStack.value.length).map("\n " + _).mkString
- case Result.Failure(t) => t
+ case Result.Failure(t, _) => t
}
s"$ks ${fss.mkString(", ")}"
}).mkString("\n")
diff --git a/core/test/src/mill/util/TestEvaluator.scala b/core/test/src/mill/util/TestEvaluator.scala
index 3fdd7c63..92ce5b37 100644
--- a/core/test/src/mill/util/TestEvaluator.scala
+++ b/core/test/src/mill/util/TestEvaluator.scala
@@ -32,7 +32,7 @@ class TestEvaluator[T <: TestUtil.TestBuild](module: T)
val logger = new PrintLogger(true, ammonite.util.Colors.Default, System.out, System.out, System.err)
val evaluator = new Evaluator(outPath, TestEvaluator.externalOutPath, module, discover, logger)
- def apply[T](t: Task[T]): Either[Result.Failing, (T, Int)] = {
+ def apply[T](t: Task[T]): Either[Result.Failing[T], (T, Int)] = {
val evaluated = evaluator.evaluate(Agg(t))
if (evaluated.failing.keyCount == 0) {
@@ -49,7 +49,9 @@ class TestEvaluator[T <: TestUtil.TestBuild](module: T)
))
} else {
Left(
- evaluated.failing.lookupKey(evaluated.failing.keys().next).items.next())
+ evaluated.failing.lookupKey(evaluated.failing.keys().next).items.next()
+ .asInstanceOf[Result.Failing[T]]
+ )
}
}
diff --git a/core/test/src/mill/util/TestUtil.scala b/core/test/src/mill/util/TestUtil.scala
index 59ef74df..93ea5ad8 100644
--- a/core/test/src/mill/util/TestUtil.scala
+++ b/core/test/src/mill/util/TestUtil.scala
@@ -49,9 +49,9 @@ object TestUtil {
var failure = Option.empty[String]
var exception = Option.empty[Throwable]
override def evaluate(args: Ctx) = {
- failure.map(Result.Failure) orElse
- exception.map(Result.Exception(_, new OuterStack(Nil))) getOrElse
- Result.Success(counter + args.args.map(_.asInstanceOf[Int]).sum)
+ failure.map(Result.Failure(_)) orElse
+ exception.map(Result.Exception(_, new OuterStack(Nil))) getOrElse
+ Result.Success(counter + args.args.map(_.asInstanceOf[Int]).sum)
}
override def sideHash = counter + failure.hashCode() + exception.hashCode()
}
diff --git a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala
index e1ab3509..16ba1fff 100644
--- a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala
+++ b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala
@@ -7,6 +7,7 @@ import javax.script.{ScriptContext, ScriptEngineManager}
import ammonite.ops._
import mill._
import mill.define.Discover
+import mill.eval.Result
import mill.scalalib.{CrossScalaModule, DepSyntax, Lib, PublishModule, TestRunner}
import mill.scalalib.publish.{Developer, License, PomSettings, SCM}
import mill.util.{TestEvaluator, TestUtil}
@@ -170,10 +171,9 @@ object HelloJSWorldTests extends TestSuite {
}
'test - {
def runTests(testTask: define.Command[(String, Seq[TestRunner.Result])]): Map[String, Map[String, TestRunner.Result]] = {
- val Right(((_, testResults), evalCount)) = helloWorldEvaluator(testTask)
-
- assert(evalCount > 0)
+ val Left(Result.Failure(_, Some(res))) = helloWorldEvaluator(testTask)
+ val (doneMsg, testResults) = res
testResults
.groupBy(_.fullyQualifiedName)
.mapValues(_.map(e => e.selector -> e).toMap)
diff --git a/scalalib/src/mill/scalalib/ScalaModule.scala b/scalalib/src/mill/scalalib/ScalaModule.scala
index 23d7345b..b81cc94a 100644
--- a/scalalib/src/mill/scalalib/ScalaModule.scala
+++ b/scalalib/src/mill/scalalib/ScalaModule.scala
@@ -268,7 +268,10 @@ object TestModule{
} else {
val grouped = badStatuses.groupBy(x => x).mapValues(_.length).toList.sorted
- Result.Failure(grouped.map{case (k, v) => k + ": " + v}.mkString(","))
+ Result.Failure(
+ grouped.map{case (k, v) => k + ": " + v}.mkString(","),
+ Some((doneMsg, results))
+ )
}
}
}
diff --git a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala
index 6fc26b03..24527cf1 100644
--- a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala
+++ b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala
@@ -199,7 +199,7 @@ object HelloWorldTests extends TestSuite {
'failOnError - workspaceTest(HelloWorld){eval =>
write.append(HelloWorld.millSourcePath / 'core / 'src / "Main.scala", "val x: ")
- val Left(Result.Failure("Compilation failed")) = eval.apply(HelloWorld.core.compile)
+ val Left(Result.Failure("Compilation failed", _)) = eval.apply(HelloWorld.core.compile)
val paths = Evaluator.resolveDestPaths(
@@ -221,7 +221,7 @@ object HelloWorldTests extends TestSuite {
}
'passScalacOptions - workspaceTest(HelloWorldFatalWarnings){ eval =>
// compilation fails because of "-Xfatal-warnings" flag
- val Left(Result.Failure("Compilation failed")) = eval.apply(HelloWorldFatalWarnings.core.compile)
+ val Left(Result.Failure("Compilation failed", _)) = eval.apply(HelloWorldFatalWarnings.core.compile)
}
}
@@ -271,7 +271,7 @@ object HelloWorldTests extends TestSuite {
'notRunWhenCompileFailed - workspaceTest(HelloWorld){eval =>
write.append(HelloWorld.millSourcePath / 'core / 'src / "Main.scala", "val x: ")
- val Left(Result.Failure("Compilation failed")) = eval.apply(HelloWorld.core.runMain("Main"))
+ val Left(Result.Failure("Compilation failed", _)) = eval.apply(HelloWorld.core.runMain("Main"))
}
}
diff --git a/scalalib/test/src/mill/scalalib/ResolveDepsTests.scala b/scalalib/test/src/mill/scalalib/ResolveDepsTests.scala
index f697127c..6eb9a014 100644
--- a/scalalib/test/src/mill/scalalib/ResolveDepsTests.scala
+++ b/scalalib/test/src/mill/scalalib/ResolveDepsTests.scala
@@ -21,19 +21,19 @@ object ResolveDepsTests extends TestSuite {
'errOnInvalidOrgDeps - {
val deps = Agg(ivy"xxx.yyy.invalid::pprint:0.5.3")
- val Failure(errMsg) = evalDeps(deps)
+ val Failure(errMsg, _) = evalDeps(deps)
assert(errMsg.contains("xxx.yyy.invalid"))
}
'errOnInvalidVersionDeps - {
val deps = Agg(ivy"com.lihaoyi::pprint:invalid.version.num")
- val Failure(errMsg) = evalDeps(deps)
+ val Failure(errMsg, _) = evalDeps(deps)
assert(errMsg.contains("invalid.version.num"))
}
'errOnPartialSuccess - {
val deps = Agg(ivy"com.lihaoyi::pprint:0.5.3", ivy"fake::fake:fake")
- val Failure(errMsg) = evalDeps(deps)
+ val Failure(errMsg, _) = evalDeps(deps)
assert(errMsg.contains("fake"))
}
}
diff --git a/scalaworker/src/mill/scalaworker/ScalaWorker.scala b/scalaworker/src/mill/scalaworker/ScalaWorker.scala
index 40923309..9ae367e6 100644
--- a/scalaworker/src/mill/scalaworker/ScalaWorker.scala
+++ b/scalaworker/src/mill/scalaworker/ScalaWorker.scala
@@ -239,7 +239,7 @@ class ScalaWorker(ctx0: mill.util.Ctx,
Jvm.inprocess(entireClasspath, classLoaderOverrideSbtTesting = true, cl => {
val framework = frameworkInstance(cl)
- val testClasses = runTests(cl, framework, testClassfilePath)
+ val testClasses = discoverTests(cl, framework, testClassfilePath)
val runner = framework.runner(args.toArray, args.toArray, cl)
@@ -299,7 +299,7 @@ class ScalaWorker(ctx0: mill.util.Ctx,
Iterator.continually(zip.getNextEntry).takeWhile(_ != null).map(_.getName).filter(_.endsWith(".class"))
}
}
- def runTests(cl: ClassLoader, framework: Framework, classpath: Agg[Path]) = {
+ def discoverTests(cl: ClassLoader, framework: Framework, classpath: Agg[Path]) = {
val fingerprints = framework.fingerprints()