summaryrefslogtreecommitdiff
path: root/core/src/main/scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-12-30 18:00:18 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-12-30 18:14:18 -0800
commit282d9a667b69863fefbddb83ade4b9efbc98b994 (patch)
tree06ef80cf9cfd11b80bde22e1c6cffa61905e139b /core/src/main/scala
parent476640d8b78a2d1bc902fcdd15fcef996b73ca2c (diff)
downloadmill-282d9a667b69863fefbddb83ade4b9efbc98b994.tar.gz
mill-282d9a667b69863fefbddb83ade4b9efbc98b994.tar.bz2
mill-282d9a667b69863fefbddb83ade4b9efbc98b994.zip
Make use of `T.command`s `T.ctx().dest` in `ScalaPlugin#test.test` and `forkTest`, and allow users to dump the structured JSON test results via `--show`
Diffstat (limited to 'core/src/main/scala')
-rw-r--r--core/src/main/scala/mill/eval/Evaluator.scala19
-rw-r--r--core/src/main/scala/mill/main/RunScript.scala2
-rw-r--r--core/src/main/scala/mill/modules/Jvm.scala7
-rw-r--r--core/src/main/scala/mill/util/JsonFormatters.scala27
4 files changed, 42 insertions, 13 deletions
diff --git a/core/src/main/scala/mill/eval/Evaluator.scala b/core/src/main/scala/mill/eval/Evaluator.scala
index 0a295ee1..ebb21a94 100644
--- a/core/src/main/scala/mill/eval/Evaluator.scala
+++ b/core/src/main/scala/mill/eval/Evaluator.scala
@@ -14,7 +14,12 @@ import scala.collection.mutable
case class Labelled[T](target: NamedTask[T],
segments: Seq[Segment]){
def format = target match{
- case t: Target[Any] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[Any]])
+ case t: Target[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]])
+ case _ => None
+ }
+ def writer = target match{
+ case t: mill.define.Command[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]])
+ case t: Target[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]])
case _ => None
}
}
@@ -90,12 +95,14 @@ class Evaluator[T](val workspacePath: Path,
json <- scala.util.Try(upickle.json.read(read(paths.meta))).toOption
(cachedHash, terminalResult) <- scala.util.Try(upickle.default.readJs[(Int, upickle.Js.Value)](json)).toOption
if cachedHash == inputsHash
- } yield terminalResult
+ reader <- labelledTarget.format
+ parsed <- reader.read.lift(terminalResult)
+ } yield parsed
cached match{
- case Some(terminalResult) =>
+ case Some(parsed) =>
val newResults = mutable.LinkedHashMap.empty[Task[_], Result[Any]]
- newResults(labelledTarget.target) = labelledTarget.format.get.read(terminalResult)
+ newResults(labelledTarget.target) = parsed
(newResults, Nil)
case _ =>
@@ -116,8 +123,8 @@ class Evaluator[T](val workspacePath: Path,
newResults(labelledTarget.target) match{
case Result.Success(v) =>
val terminalResult = labelledTarget
- .format
- .asInstanceOf[Option[upickle.default.ReadWriter[Any]]]
+ .writer
+ .asInstanceOf[Option[upickle.default.Writer[Any]]]
.map(_.write(v))
for(t <- terminalResult){
diff --git a/core/src/main/scala/mill/main/RunScript.scala b/core/src/main/scala/mill/main/RunScript.scala
index 22d6fc95..ad813026 100644
--- a/core/src/main/scala/mill/main/RunScript.scala
+++ b/core/src/main/scala/mill/main/RunScript.scala
@@ -141,7 +141,7 @@ object RunScript{
case 0 =>
val json = for(t <- Seq(target)) yield {
t match {
- case t: mill.define.Target[_] =>
+ case t: mill.define.NamedTask[_] =>
for (segments <- evaluator.mapping.modules.get(t.owner)) yield {
val jsonFile = Evaluator.resolveDestPaths(evaluator.workspacePath, segments :+ Segment.Label(t.name)).meta
val metadata = upickle.json.read(jsonFile.toIO)
diff --git a/core/src/main/scala/mill/modules/Jvm.scala b/core/src/main/scala/mill/modules/Jvm.scala
index f366a0e0..3bed0917 100644
--- a/core/src/main/scala/mill/modules/Jvm.scala
+++ b/core/src/main/scala/mill/modules/Jvm.scala
@@ -58,7 +58,8 @@ object Jvm {
val stdout = proc.getInputStream
val stderr = proc.getErrorStream
- val sources = Seq(stdout , stderr)
+ val sources = Seq(stdout -> (Left(_: Bytes)), stderr -> (Right(_: Bytes)))
+ val chunks = mutable.Buffer.empty[Either[Bytes, Bytes]]
while(
// Process.isAlive doesn't exist on JDK 7 =/
util.Try(proc.exitValue).isFailure ||
@@ -66,11 +67,12 @@ object Jvm {
stderr.available() > 0
){
var readSomething = false
- for (std <- sources){
+ for ((std, wrapper) <- sources){
while (std.available() > 0){
readSomething = true
val array = new Array[Byte](std.available())
val actuallyRead = std.read(array)
+ chunks.append(wrapper(new ammonite.ops.Bytes(array)))
ctx.log.outputStream.write(array, 0, actuallyRead)
}
}
@@ -80,6 +82,7 @@ object Jvm {
}
if (proc.exitValue() != 0) throw new InteractiveShelloutException()
+ else ammonite.ops.CommandResult(proc.exitValue(), chunks)
}
private def createManifest(mainClass: Option[String]) = {
diff --git a/core/src/main/scala/mill/util/JsonFormatters.scala b/core/src/main/scala/mill/util/JsonFormatters.scala
index d8125ff2..00a40e7d 100644
--- a/core/src/main/scala/mill/util/JsonFormatters.scala
+++ b/core/src/main/scala/mill/util/JsonFormatters.scala
@@ -1,17 +1,18 @@
package mill.util
import ammonite.ops.{Bytes, Path}
+import upickle.Js
import upickle.default.{ReadWriter => RW}
object JsonFormatters extends JsonFormatters
trait JsonFormatters {
implicit val pathReadWrite: RW[ammonite.ops.Path] = RW[ammonite.ops.Path](
- o => upickle.Js.Str(o.toString()),
- {case upickle.Js.Str(json) => Path(json.toString)},
+ o => Js.Str(o.toString()),
+ {case Js.Str(json) => Path(json.toString)},
)
implicit val bytesReadWrite: RW[Bytes] = RW[Bytes](
- o => upickle.Js.Str(javax.xml.bind.DatatypeConverter.printBase64Binary(o.array)),
- {case upickle.Js.Str(json) => new Bytes(javax.xml.bind.DatatypeConverter.parseBase64Binary(json.toString))}
+ o => Js.Str(javax.xml.bind.DatatypeConverter.printBase64Binary(o.array)),
+ {case Js.Str(json) => new Bytes(javax.xml.bind.DatatypeConverter.parseBase64Binary(json.toString))}
)
@@ -20,4 +21,22 @@ trait JsonFormatters {
implicit lazy val modFormat: RW[coursier.Module] = upickle.default.macroRW
implicit lazy val depFormat: RW[coursier.Dependency]= upickle.default.macroRW
implicit lazy val attrFormat: RW[coursier.Attributes] = upickle.default.macroRW
+ implicit val stackTraceRW = upickle.default.ReadWriter[StackTraceElement](
+ ste => Js.Obj(
+ "declaringClass" -> Js.Str(ste.getClassName),
+ "methodName" -> Js.Str(ste.getMethodName),
+ "fileName" -> Js.Str(ste.getFileName),
+ "lineNumber" -> Js.Num(ste.getLineNumber)
+ ),
+ {case json: Js.Obj =>
+ new StackTraceElement(
+ json("declaringClass").str.toString,
+ json("methodName").str.toString,
+ json("fileName").str.toString,
+ json("lineNumber").num.toInt
+ )
+ }
+ )
+
+
}