diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-02-04 14:35:35 -0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-02-04 15:00:58 -0800 |
commit | 7022254ac1b156a466baa45afea1bb723bd59929 (patch) | |
tree | 8bf0fa5bd42765d54ef0d4a9d915550f7586de2b | |
parent | f47697c1da18407374cf11372af36c4960d80576 (diff) | |
download | mill-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.scala | 24 | ||||
-rw-r--r-- | core/src/mill/eval/Result.scala | 26 | ||||
-rw-r--r-- | core/src/mill/main/ReplApplyHandler.scala | 2 | ||||
-rw-r--r-- | core/src/mill/main/RunScript.scala | 2 | ||||
-rw-r--r-- | core/test/src/mill/util/TestEvaluator.scala | 6 | ||||
-rw-r--r-- | core/test/src/mill/util/TestUtil.scala | 6 | ||||
-rw-r--r-- | scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala | 6 | ||||
-rw-r--r-- | scalalib/src/mill/scalalib/ScalaModule.scala | 5 | ||||
-rw-r--r-- | scalalib/test/src/mill/scalalib/HelloWorldTests.scala | 6 | ||||
-rw-r--r-- | scalalib/test/src/mill/scalalib/ResolveDepsTests.scala | 6 | ||||
-rw-r--r-- | scalaworker/src/mill/scalaworker/ScalaWorker.scala | 4 |
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() |