Fixes update task not invalidating

Fixes https://github.com/sbt/sbt/issues/5292
Ref https://github.com/sbt/sbt/issues/5142

`update` task checks if the timestamp is still the same from the previous resolution. This no longer works since lm-coursier does not populate the timestamps in `UpdateReport`. See 2e5c8aed5e/modules/lm-coursier/src/main/scala/lmcoursier/internal/SbtUpdateReport.scala (L346-L351)

Since the stamps are empty, this caused `update` not to invalidate when the cache is completely missing. This works around the issue by checking if the file still exists. It also adds a warning that the file is missing.
This commit is contained in:
Eugene Yokota 2019-12-12 22:39:05 -05:00
parent 18c6264656
commit 2b24f05435
1 changed files with 15 additions and 4 deletions

View File

@ -73,8 +73,8 @@ private[sbt] object LibraryManagement {
!force &&
!depsUpdated &&
!inChanged &&
out.allFiles.forall(f => fileUptodate(f, out.stamps)) &&
fileUptodate(out.cachedDescriptor, out.stamps)
out.allFiles.forall(f => fileUptodate(f, out.stamps, log)) &&
fileUptodate(out.cachedDescriptor, out.stamps, log)
}
/* Skip resolve if last output exists, otherwise error. */
@ -129,8 +129,19 @@ private[sbt] object LibraryManagement {
handler((extraInputHash, settings, withoutClock))
}
private[this] def fileUptodate(file: File, stamps: Map[File, Long]): Boolean =
stamps.get(file).forall(_ == IO.getModifiedTimeOrZero(file))
private[this] def fileUptodate(file: File, stamps: Map[File, Long], log: Logger): Boolean = {
val exists = file.exists
// https://github.com/sbt/sbt/issues/5292 warn the user that the file is missing since this indicates
// that UpdateReport was persisted but Coursier cache was not.
if (!exists) {
log.warn(s"${file.getName} no longer exists at $file")
}
// coursier doesn't populate stamps
val timeStampIsSame = stamps
.get(file)
.forall(_ == IO.getModifiedTimeOrZero(file))
exists && timeStampIsSame
}
private[sbt] def transitiveScratch(
lm: DependencyResolution,