From ccf149e8bf87cd2cbf70313db023ec70ba4a618e Mon Sep 17 00:00:00 2001 From: Antonio Cunei Date: Thu, 30 Nov 2017 04:12:13 +0100 Subject: [PATCH 1/6] Convert lastModified() calls to sbt.io.Milli.getModifiedTime() --- .../src/main/scala/sbt/internal/scripted/FileCommands.scala | 4 +++- util-cache/src/main/scala/sbt/util/FileInfo.scala | 5 +++-- util-cache/src/test/scala/FileInfoSpec.scala | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala index 3b5daaef7..8849f4987 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala @@ -9,6 +9,7 @@ import java.io.File import sbt.io.{ IO, Path } import sbt.io.syntax._ import Path._ +import sbt.io.Milli.getModifiedTime class FileCommands(baseDirectory: File) extends BasicStatementHandler { lazy val commands = commandMap @@ -67,7 +68,8 @@ class FileCommands(baseDirectory: File) extends BasicStatementHandler { def newer(a: String, b: String): Unit = { val pathA = fromString(a) val pathB = fromString(b) - val isNewer = pathA.exists && (!pathB.exists || pathA.lastModified > pathB.lastModified) + val isNewer = pathA.exists && (!pathB.exists || getModifiedTime(pathA) > getModifiedTime( + pathB)) if (!isNewer) { scriptError(s"$pathA is not newer than $pathB") } diff --git a/util-cache/src/main/scala/sbt/util/FileInfo.scala b/util-cache/src/main/scala/sbt/util/FileInfo.scala index 6fcb3d619..90a65b40b 100644 --- a/util-cache/src/main/scala/sbt/util/FileInfo.scala +++ b/util-cache/src/main/scala/sbt/util/FileInfo.scala @@ -8,6 +8,7 @@ import scala.util.control.NonFatal import sbt.io.Hash import sjsonnew.{ Builder, JsonFormat, Unbuilder, deserializationError } import CacheImplicits._ +import sbt.io.Milli.getModifiedTime sealed trait FileInfo { def file: File } sealed trait HashFileInfo extends FileInfo { def hash: List[Byte] } @@ -88,7 +89,7 @@ object FileInfo { } implicit def apply(file: File): HashModifiedFileInfo = - FileHashModified(file.getAbsoluteFile, Hash(file).toList, file.lastModified) + FileHashModified(file.getAbsoluteFile, Hash(file).toList, getModifiedTime(file)) } object hash extends Style { @@ -145,7 +146,7 @@ object FileInfo { } implicit def apply(file: File): ModifiedFileInfo = - FileModified(file.getAbsoluteFile, file.lastModified) + FileModified(file.getAbsoluteFile, getModifiedTime(file)) } object exists extends Style { diff --git a/util-cache/src/test/scala/FileInfoSpec.scala b/util-cache/src/test/scala/FileInfoSpec.scala index debd427c7..a10d4b6bc 100644 --- a/util-cache/src/test/scala/FileInfoSpec.scala +++ b/util-cache/src/test/scala/FileInfoSpec.scala @@ -3,10 +3,11 @@ package sbt.util import sjsonnew.shaded.scalajson.ast.unsafe._ import sjsonnew._, support.scalajson.unsafe._ import sbt.internal.util.UnitSpec +import sbt.io.Milli.getModifiedTime class FileInfoSpec extends UnitSpec { val file = new java.io.File(".").getAbsoluteFile - val fileInfo: ModifiedFileInfo = FileModified(file, file.lastModified()) + val fileInfo: ModifiedFileInfo = FileModified(file, getModifiedTime(file)) val filesInfo = FilesInfo(Set(fileInfo)) it should "round trip" in assertRoundTrip(filesInfo) From d03dfb39817be24a84556cabfc4affc4ac257bb2 Mon Sep 17 00:00:00 2001 From: Antonio Cunei Date: Mon, 4 Dec 2017 21:22:07 +0100 Subject: [PATCH 2/6] Moved Milli._ to IO. --- .../src/main/scala/sbt/internal/scripted/FileCommands.scala | 5 ++--- util-cache/src/main/scala/sbt/util/FileInfo.scala | 2 +- util-cache/src/test/scala/FileInfoSpec.scala | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala index 8849f4987..95257d288 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala @@ -9,7 +9,7 @@ import java.io.File import sbt.io.{ IO, Path } import sbt.io.syntax._ import Path._ -import sbt.io.Milli.getModifiedTime +import sbt.io.IO.getModifiedTime class FileCommands(baseDirectory: File) extends BasicStatementHandler { lazy val commands = commandMap @@ -68,8 +68,7 @@ class FileCommands(baseDirectory: File) extends BasicStatementHandler { def newer(a: String, b: String): Unit = { val pathA = fromString(a) val pathB = fromString(b) - val isNewer = pathA.exists && (!pathB.exists || getModifiedTime(pathA) > getModifiedTime( - pathB)) + val isNewer = pathA.exists && (!pathB.exists || getModifiedTime(pathA) > getModifiedTime(pathB)) if (!isNewer) { scriptError(s"$pathA is not newer than $pathB") } diff --git a/util-cache/src/main/scala/sbt/util/FileInfo.scala b/util-cache/src/main/scala/sbt/util/FileInfo.scala index 90a65b40b..218110f20 100644 --- a/util-cache/src/main/scala/sbt/util/FileInfo.scala +++ b/util-cache/src/main/scala/sbt/util/FileInfo.scala @@ -8,7 +8,7 @@ import scala.util.control.NonFatal import sbt.io.Hash import sjsonnew.{ Builder, JsonFormat, Unbuilder, deserializationError } import CacheImplicits._ -import sbt.io.Milli.getModifiedTime +import sbt.io.IO.getModifiedTime sealed trait FileInfo { def file: File } sealed trait HashFileInfo extends FileInfo { def hash: List[Byte] } diff --git a/util-cache/src/test/scala/FileInfoSpec.scala b/util-cache/src/test/scala/FileInfoSpec.scala index a10d4b6bc..936441fbb 100644 --- a/util-cache/src/test/scala/FileInfoSpec.scala +++ b/util-cache/src/test/scala/FileInfoSpec.scala @@ -3,7 +3,7 @@ package sbt.util import sjsonnew.shaded.scalajson.ast.unsafe._ import sjsonnew._, support.scalajson.unsafe._ import sbt.internal.util.UnitSpec -import sbt.io.Milli.getModifiedTime +import sbt.io.IO.getModifiedTime class FileInfoSpec extends UnitSpec { val file = new java.io.File(".").getAbsoluteFile From cd4346c5d7aa0c04893bc7ae85c240e1a6926c62 Mon Sep 17 00:00:00 2001 From: Antonio Cunei Date: Fri, 8 Dec 2017 23:50:40 +0100 Subject: [PATCH 3/6] Allow FileInfo for non-existent files with the new timestamps FileInfo is used to wrap information like last modified time on files that may or may not exist. Arguably, that does not make much sense: the non-existent files should not lead to modification file information, hashes, and a persistent serialized version of the resulting meaningless information. However, considering that the FileInfo information is serialized and saved, it is necessary to preserve compatibility at this stage. Therefore the modification time is explicitly set to zero for those files that do not exist when each FileInfo is built. --- util-cache/src/main/scala/sbt/util/FileInfo.scala | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/util-cache/src/main/scala/sbt/util/FileInfo.scala b/util-cache/src/main/scala/sbt/util/FileInfo.scala index 218110f20..4981831f4 100644 --- a/util-cache/src/main/scala/sbt/util/FileInfo.scala +++ b/util-cache/src/main/scala/sbt/util/FileInfo.scala @@ -4,6 +4,7 @@ package sbt.util import java.io.File +import java.io.FileNotFoundException import scala.util.control.NonFatal import sbt.io.Hash import sjsonnew.{ Builder, JsonFormat, Unbuilder, deserializationError } @@ -50,6 +51,15 @@ object FilesInfo { } object FileInfo { + + def getModifiedTimeOrZero(file: File) = { // returns 0L if file does not exist + try { + getModifiedTime(file) + } catch { + case _: FileNotFoundException => 0L + } + } + sealed trait Style { type F <: FileInfo @@ -89,7 +99,7 @@ object FileInfo { } implicit def apply(file: File): HashModifiedFileInfo = - FileHashModified(file.getAbsoluteFile, Hash(file).toList, getModifiedTime(file)) + FileHashModified(file.getAbsoluteFile, Hash(file).toList, getModifiedTimeOrZero(file)) } object hash extends Style { @@ -146,7 +156,7 @@ object FileInfo { } implicit def apply(file: File): ModifiedFileInfo = - FileModified(file.getAbsoluteFile, getModifiedTime(file)) + FileModified(file.getAbsoluteFile, getModifiedTimeOrZero(file)) } object exists extends Style { From 13a8d5336944ac12ed5dc39232effeedaea32ab7 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Wed, 13 Dec 2017 15:47:15 +0000 Subject: [PATCH 4/6] Use IO.getModified over importing the method .. and make getModifiedTimeOrZero private. --- .../scala/sbt/internal/scripted/FileCommands.scala | 3 ++- util-cache/src/main/scala/sbt/util/FileInfo.scala | 14 +++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala index 95257d288..549352ca1 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala @@ -68,7 +68,8 @@ class FileCommands(baseDirectory: File) extends BasicStatementHandler { def newer(a: String, b: String): Unit = { val pathA = fromString(a) val pathB = fromString(b) - val isNewer = pathA.exists && (!pathB.exists || getModifiedTime(pathA) > getModifiedTime(pathB)) + val isNewer = pathA.exists && + (!pathB.exists || IO.getModifiedTime(pathA) > IO.getModifiedTime(pathB)) if (!isNewer) { scriptError(s"$pathA is not newer than $pathB") } diff --git a/util-cache/src/main/scala/sbt/util/FileInfo.scala b/util-cache/src/main/scala/sbt/util/FileInfo.scala index 4981831f4..2a26e193d 100644 --- a/util-cache/src/main/scala/sbt/util/FileInfo.scala +++ b/util-cache/src/main/scala/sbt/util/FileInfo.scala @@ -6,10 +6,9 @@ package sbt.util import java.io.File import java.io.FileNotFoundException import scala.util.control.NonFatal -import sbt.io.Hash +import sbt.io.{ Hash, IO } import sjsonnew.{ Builder, JsonFormat, Unbuilder, deserializationError } import CacheImplicits._ -import sbt.io.IO.getModifiedTime sealed trait FileInfo { def file: File } sealed trait HashFileInfo extends FileInfo { def hash: List[Byte] } @@ -52,13 +51,10 @@ object FilesInfo { object FileInfo { - def getModifiedTimeOrZero(file: File) = { // returns 0L if file does not exist - try { - getModifiedTime(file) - } catch { - case _: FileNotFoundException => 0L - } - } + // returns 0L if file does not exist + private def getModifiedTimeOrZero(file: File) = + try IO.getModifiedTime(file) + catch { case _: FileNotFoundException => 0L } sealed trait Style { type F <: FileInfo From d2338ff28760232e827e7f8cbca07af44c01ccf2 Mon Sep 17 00:00:00 2001 From: Antonio Cunei Date: Fri, 15 Dec 2017 17:23:39 +0100 Subject: [PATCH 5/6] Removed a couple more direct imports of getModifiedTime() --- .../src/main/scala/sbt/internal/scripted/FileCommands.scala | 2 +- util-cache/src/test/scala/FileInfoSpec.scala | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala index 549352ca1..3a1dcc1fe 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala @@ -9,7 +9,7 @@ import java.io.File import sbt.io.{ IO, Path } import sbt.io.syntax._ import Path._ -import sbt.io.IO.getModifiedTime +import sbt.io.IO class FileCommands(baseDirectory: File) extends BasicStatementHandler { lazy val commands = commandMap diff --git a/util-cache/src/test/scala/FileInfoSpec.scala b/util-cache/src/test/scala/FileInfoSpec.scala index 936441fbb..62e941254 100644 --- a/util-cache/src/test/scala/FileInfoSpec.scala +++ b/util-cache/src/test/scala/FileInfoSpec.scala @@ -3,11 +3,11 @@ package sbt.util import sjsonnew.shaded.scalajson.ast.unsafe._ import sjsonnew._, support.scalajson.unsafe._ import sbt.internal.util.UnitSpec -import sbt.io.IO.getModifiedTime +import sbt.io.IO class FileInfoSpec extends UnitSpec { val file = new java.io.File(".").getAbsoluteFile - val fileInfo: ModifiedFileInfo = FileModified(file, getModifiedTime(file)) + val fileInfo: ModifiedFileInfo = FileModified(file, IO.getModifiedTime(file)) val filesInfo = FilesInfo(Set(fileInfo)) it should "round trip" in assertRoundTrip(filesInfo) From 3d9eab1bf8866010b8643261e7f2df3bab1102ab Mon Sep 17 00:00:00 2001 From: eugene yokota Date: Fri, 15 Dec 2017 12:51:29 -0500 Subject: [PATCH 6/6] IO 1.1.2 --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 439ff5650..453f20649 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -7,7 +7,7 @@ object Dependencies { val scala211 = "2.11.12" val scala212 = "2.12.4" - private val ioVersion = "1.1.1" + private val ioVersion = "1.1.2" private val sbtIO = "org.scala-sbt" %% "io" % ioVersion