diff --git a/util-cache/src/main/scala/sbt/internal/util/EmptyCacheError.scala b/util-cache/src/main/scala/sbt/internal/util/EmptyCacheError.scala new file mode 100644 index 000000000..5d8b97f20 --- /dev/null +++ b/util-cache/src/main/scala/sbt/internal/util/EmptyCacheError.scala @@ -0,0 +1,5 @@ +package sbt +package internal +package util + +class EmptyCacheError extends RuntimeException diff --git a/util-cache/src/main/scala/sbt/util/Input.scala b/util-cache/src/main/scala/sbt/util/Input.scala index 6f1d895e8..2a011ed63 100644 --- a/util-cache/src/main/scala/sbt/util/Input.scala +++ b/util-cache/src/main/scala/sbt/util/Input.scala @@ -4,6 +4,7 @@ import java.io.{ Closeable, InputStream } import scala.util.control.NonFatal import sjsonnew.{ IsoString, JsonReader, SupportConverter } import sbt.io.{ IO, Using } +import sbt.internal.util.EmptyCacheError trait Input extends Closeable { def read[T: JsonReader](): T @@ -28,7 +29,11 @@ class PlainInput[J: IsoString](input: InputStream, converter: SupportConverter[J } } - def read[T: JsonReader]() = converter.fromJson(isoFormat.from(readFully())).get + def read[T: JsonReader](): T = { + val str = readFully() + if (str == "") throw new EmptyCacheError() + else converter.fromJson(isoFormat.from(str)).get + } def close() = input.close() } diff --git a/util-tracking/src/main/scala/sbt/util/Tracked.scala b/util-tracking/src/main/scala/sbt/util/Tracked.scala index c6286a832..238101e07 100644 --- a/util-tracking/src/main/scala/sbt/util/Tracked.scala +++ b/util-tracking/src/main/scala/sbt/util/Tracked.scala @@ -8,6 +8,7 @@ import scala.util.{ Failure, Try, Success } import java.io.File import sbt.io.IO import sbt.io.syntax._ +import sbt.internal.util.EmptyCacheError import sjsonnew.JsonFormat import sjsonnew.support.murmurhash.Hasher @@ -178,7 +179,9 @@ object Tracked { def save(store: CacheStore, value: I): Unit = { Hasher.hash(value) match { case Success(keyHash) => store.write[Long](keyHash.toLong) - case Failure(_) => () + case Failure(e) => + if (isStrictMode) throw e + else () } } @@ -187,12 +190,19 @@ object Tracked { case Success(prev: Long) => Hasher.hash(value) match { case Success(keyHash: Int) => keyHash.toLong != prev - case Failure(_) => true + case Failure(e) => + if (isStrictMode) throw e + else true } - case Failure(_) => true + case Failure(_: EmptyCacheError) => true + case Failure(e) => + if (isStrictMode) throw e + else true } } + private[sbt] def isStrictMode: Boolean = + java.lang.Boolean.getBoolean("sbt.strict") } trait Tracked {