From 7431dbdf1a16cfa46f8000ba1d1ea4ed814879d9 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Thu, 4 Apr 2019 00:53:44 -0400 Subject: [PATCH] throw error on deserialization error --- .../sbt/internal/util/EmptyCacheError.scala | 5 +++++ util-cache/src/main/scala/sbt/util/Input.scala | 7 ++++++- .../src/main/scala/sbt/util/Tracked.scala | 16 +++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 util-cache/src/main/scala/sbt/internal/util/EmptyCacheError.scala 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 {