diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 19dacc16f..d3b77ae5e 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -214,8 +214,41 @@ object Defaults extends BuildCommon { VirtualTerminal.handler, ) ++ serverHandlers.value :+ ServerHandler.fallback }, - uncachedStamper := Stamps.uncachedStamps(fileConverter.value), - reusableStamper := Stamps.timeWrapLibraryStamps(uncachedStamper.value, fileConverter.value), + timeWrappedStamper := Stamps + .timeWrapLibraryStamps(Stamps.uncachedStamps(fileConverter.value), fileConverter.value), + reusableStamper := { + val converter = fileConverter.value + val unmanagedCache = unmanagedFileStampCache.value + val managedCache = managedFileStampCache.value + val backing = timeWrappedStamper.value + new xsbti.compile.analysis.ReadStamps { + def getAllLibraryStamps() + : java.util.Map[xsbti.VirtualFileRef, xsbti.compile.analysis.Stamp] = + backing.getAllLibraryStamps() + def getAllProductStamps() + : java.util.Map[xsbti.VirtualFileRef, xsbti.compile.analysis.Stamp] = + backing.getAllProductStamps() + def getAllSourceStamps() + : java.util.Map[xsbti.VirtualFileRef, xsbti.compile.analysis.Stamp] = + new java.util.HashMap[xsbti.VirtualFileRef, xsbti.compile.analysis.Stamp] + def library(fr: xsbti.VirtualFileRef): xsbti.compile.analysis.Stamp = { + val path = converter.toPath(fr) + managedCache + .getOrElseUpdate(path, sbt.nio.FileStamper.Hash) + .map(_.stamp) + .getOrElse(backing.library(fr)) + } + def product(fr: xsbti.VirtualFileRef): xsbti.compile.analysis.Stamp = backing.product(fr) + def source(fr: xsbti.VirtualFile): xsbti.compile.analysis.Stamp = { + val path = converter.toPath(fr) + unmanagedCache + .get(path) + .orElse(managedCache.getOrElseUpdate(path, sbt.nio.FileStamper.Hash)) + .map(_.stamp) + .getOrElse(backing.source(fr)) + } + } + }, traceLevel in run :== 0, traceLevel in runMain :== 0, traceLevel in bgRun :== 0, diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index 51f4ad4eb..12a28d56c 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -227,8 +227,8 @@ object Keys { val fileConverter = settingKey[FileConverter]("The file converter used to convert between Path and VirtualFile") val allowMachinePath = settingKey[Boolean]("Allow machine-specific paths during conversion.") val rootPaths = settingKey[Map[String, NioPath]]("The root paths used to abstract machine-specific paths.") - private[sbt] val uncachedStamper = settingKey[ReadStamps]("The stamper to create timestamp or hash.") - private[sbt] val reusableStamper = settingKey[ReadStamps]("The stamper can be reused across subprojects and sessions.") + private[sbt] val timeWrappedStamper = settingKey[ReadStamps]("The stamper to create timestamp or hash.") + private[sbt] val reusableStamper = taskKey[ReadStamps]("The stamper can be reused across subprojects and sessions.") // package keys val packageBin = taskKey[File]("Produces a main artifact, such as a binary jar.").withRank(ATask) diff --git a/sbt/src/sbt-test/nio/external-hooks/pending b/sbt/src/sbt-test/nio/external-hooks/test similarity index 100% rename from sbt/src/sbt-test/nio/external-hooks/pending rename to sbt/src/sbt-test/nio/external-hooks/test