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