From ea6a105cec921c914d4895b4ec0ea0ab89b3274d Mon Sep 17 00:00:00 2001 From: Brice Jaglin <bjaglin@teads.tv> Date: Tue, 26 May 2020 21:28:17 +0200 Subject: [PATCH] naive JAR hashing We need a nightly containing https://github.com/sbt/sbt/pull/5344 if we want children projects to be insensitive to repackaging. --- src/main/scala/sbtmemoize/MemoizePlugin.scala | 37 +++++++++++++++++++ src/sbt-test/sbt-memoize/simple/test | 3 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/scala/sbtmemoize/MemoizePlugin.scala b/src/main/scala/sbtmemoize/MemoizePlugin.scala index 627c844..ac26b0d 100644 --- a/src/main/scala/sbtmemoize/MemoizePlugin.scala +++ b/src/main/scala/sbtmemoize/MemoizePlugin.scala @@ -1,9 +1,46 @@ package sbtmemoize +import sbt.Keys._ import sbt._ +import sjsonnew.support.murmurhash.Hasher +import sjsonnew.{Builder, HashWriter} object MemoizePlugin extends AutoPlugin { override def trigger = noTrigger + object autoImport { + val memoizeCacheKey = + taskKey[Int]("Compute the cache key for the current state of the project") + } + + import autoImport._ + + override def projectSettings: Seq[Def.Setting[_]] = + Seq(Compile, Test).flatMap(inConfig(_)(memoizeConfigSettings)) + + lazy val memoizeConfigSettings: Seq[Def.Setting[_]] = + Seq( + memoizeCacheKey := { + // like FileInfo.hash but without the path (which is environment-specific) + val hashWriter: HashWriter[Seq[File]] = new HashWriter[Seq[File]] { + override def write[J](obj: Seq[File], builder: Builder[J]): Unit = { + import sjsonnew.BasicJsonProtocol._ + builder.beginArray() + obj.foreach { file => + builder.beginObject() + builder.addField("hash", file.hash) + builder.endObject() + } + builder.endArray() + } + } + + val srcs = sources.value + val deps = dependencyClasspathAsJars.value.map(_.data) + + Hasher.hash(srcs ++ deps)(hashWriter).get + } + ) + } diff --git a/src/sbt-test/sbt-memoize/simple/test b/src/sbt-test/sbt-memoize/simple/test index 73a6820..f949919 100644 --- a/src/sbt-test/sbt-memoize/simple/test +++ b/src/sbt-test/sbt-memoize/simple/test @@ -1 +1,2 @@ -> compile \ No newline at end of file +> compile +> show memoizeCacheKey \ No newline at end of file