Include classesDirectory into the digest

This commit is contained in:
Eugene Yokota 2024-09-08 12:13:34 -04:00
parent 0021c3a0bd
commit f12cbcb450
1 changed files with 9 additions and 5 deletions

View File

@ -11,7 +11,7 @@ package internal
import java.io.File import java.io.File
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import Keys.{ test, fileConverter, fullClasspath, streams } import Keys.{ test, compileInputs, fileConverter, fullClasspath, streams }
import sbt.Def.Initialize import sbt.Def.Initialize
import sbt.internal.inc.Analysis import sbt.internal.inc.Analysis
import sbt.internal.util.Attributed import sbt.internal.util.Attributed
@ -47,10 +47,12 @@ object IncrementalTest:
val cp = (Keys.test / fullClasspath).value val cp = (Keys.test / fullClasspath).value
val testNames = Keys.definedTests.value.map(_.name).toVector.distinct val testNames = Keys.definedTests.value.map(_.name).toVector.distinct
val converter = fileConverter.value val converter = fileConverter.value
val inputs = Keys.compileInputs.value
val extra = Digest(converter.toVirtualFile(inputs.options.classesDirectory))
val stamper = ClassStamper(cp, converter) val stamper = ClassStamper(cp, converter)
// TODO: Potentially do something about JUnit 5 and others which might not use class name // TODO: Potentially do something about JUnit 5 and others which might not use class name
Map((testNames.flatMap: name => Map((testNames.flatMap: name =>
stamper.transitiveStamp(name) match stamper.transitiveStamp(name, Vector(extra)) match
case Some(ts) => Seq(name -> ts) case Some(ts) => Seq(name -> ts)
case None => Nil case None => Nil
): _*) ): _*)
@ -135,10 +137,12 @@ class ClassStamper(
/** /**
* Given a classpath and a class name, this tries to create a SHA-256 digest. * Given a classpath and a class name, this tries to create a SHA-256 digest.
* @param className className to stamp
* @param extraHashes additional information to include into the returning digest
*/ */
def transitiveStamp(className: String): Option[Digest] = private[sbt] def transitiveStamp(className: String, extaHashes: Seq[Digest]): Option[Digest] =
val digests = SortedSet(analyses.flatMap(internalStamp(className, _, Set.empty)): _*) val digests = SortedSet(analyses.flatMap(internalStamp(className, _, Set.empty)): _*)
if digests.nonEmpty then Some(Digest.sha256Hash(digests.toSeq: _*)) if digests.nonEmpty then Some(Digest.sha256Hash(digests.toSeq ++ extaHashes: _*))
else None else None
private def internalStamp( private def internalStamp(
@ -159,7 +163,7 @@ class ClassStamper(
val internalJarDeps = relations val internalJarDeps = relations
.externalDeps(className) .externalDeps(className)
.flatMap: libClassName => .flatMap: libClassName =>
transitiveStamp(libClassName) transitiveStamp(libClassName, Nil)
val externalDeps = relations val externalDeps = relations
.externalDeps(className) .externalDeps(className)
.flatMap: libClassName => .flatMap: libClassName =>