diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2017-10-29 16:49:44 -0700 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2017-10-29 16:49:44 -0700 |
commit | 144f0997689f5b927ed5a966dd075ec15364641b (patch) | |
tree | cc16617cd3b41fb11fb181b0a094826d6dcc9be0 /src/main | |
parent | be9b77ee1319d3597d7d83cd858367803845c46e (diff) | |
download | mill-144f0997689f5b927ed5a966dd075ec15364641b.tar.gz mill-144f0997689f5b927ed5a966dd075ec15364641b.tar.bz2 mill-144f0997689f5b927ed5a966dd075ec15364641b.zip |
First set of `javac` integration tests all pass now, using folder-hashing instead of mtimes because mtimes are flaky and unprecise (1 *second* resolution on OS-X!)
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/scala/forge/Evaluator.scala | 2 | ||||
-rw-r--r-- | src/main/scala/forge/Target.scala | 2 | ||||
-rw-r--r-- | src/main/scala/forge/util/PathRef.scala | 49 |
3 files changed, 42 insertions, 11 deletions
diff --git a/src/main/scala/forge/Evaluator.scala b/src/main/scala/forge/Evaluator.scala index 38cd856b..af3e4106 100644 --- a/src/main/scala/forge/Evaluator.scala +++ b/src/main/scala/forge/Evaluator.scala @@ -22,6 +22,7 @@ class Evaluator(workspacePath: Path, for (groupIndex <- sortedGroups.keys()){ val group = sortedGroups.lookupKey(groupIndex) + val (newResults, newEvaluated) = evaluateGroupCached( group, results, @@ -58,7 +59,6 @@ class Evaluator(workspacePath: Path, if cachedHash == inputsHash } yield terminalResults - cached match{ case Some(terminalResults) => val newResults = mutable.LinkedHashMap.empty[Target[_], Any] diff --git a/src/main/scala/forge/Target.scala b/src/main/scala/forge/Target.scala index e96a8bf5..9dd3f8ab 100644 --- a/src/main/scala/forge/Target.scala +++ b/src/main/scala/forge/Target.scala @@ -81,7 +81,7 @@ object Target{ def path(path: ammonite.ops.Path) = new Path(path) class Path(path: ammonite.ops.Path) extends Target[PathRef]{ - val handle = PathRef(path) + def handle = PathRef(path) def evaluate(args: Args) = handle override def sideHash = handle.hashCode() val inputs = Nil diff --git a/src/main/scala/forge/util/PathRef.scala b/src/main/scala/forge/util/PathRef.scala index 3621d0b6..dbe1ebbd 100644 --- a/src/main/scala/forge/util/PathRef.scala +++ b/src/main/scala/forge/util/PathRef.scala @@ -1,7 +1,11 @@ package forge package util -import ammonite.ops.ls +import java.io.IOException +import java.nio.file.{FileVisitResult, FileVisitor} +import java.nio.file.attribute.BasicFileAttributes +import java.security.MessageDigest +import java.nio.{file => jnio} import play.api.libs.json.{Format, Json} @@ -11,16 +15,43 @@ import play.api.libs.json.{Format, Json} * changes can bust caches which are keyed off hashcodes. */ case class PathRef(path: ammonite.ops.Path){ - override def hashCode() = { - if (!path.isDir) path.hashCode() + path.mtime.toMillis.toInt - else ls.rec.iter(path) - .filter(_.isFile) - .map(x => x.toString.hashCode + x.mtime.toMillis) - .sum - .toInt + val md5Hash = { + val digest = MessageDigest.getInstance("MD5") + + val buffer = new Array[Byte](16 * 1024) + jnio.Files.walkFileTree( + path.toNIO, + new FileVisitor[jnio.Path] { + def preVisitDirectory(dir: jnio.Path, attrs: BasicFileAttributes) = { + digest.update(dir.toAbsolutePath.toString.getBytes) + FileVisitResult.CONTINUE + } + + def visitFile(file: jnio.Path, attrs: BasicFileAttributes) = { + digest.update(file.toAbsolutePath.toString.getBytes) + val is = jnio.Files.newInputStream(file) + def rec(): Unit = { + val length = is.read(buffer) + if (length != -1){ + digest.update(buffer, 0, length) + rec() + } + } + rec() + FileVisitResult.CONTINUE + } + + def visitFileFailed(file: jnio.Path, exc: IOException) = FileVisitResult.CONTINUE + def postVisitDirectory(dir: jnio.Path, exc: IOException) = FileVisitResult.CONTINUE + } + ) + + java.util.Arrays.hashCode(digest.digest()) + } + override def hashCode() = md5Hash } object PathRef{ implicit def jsonFormatter: Format[PathRef] = Json.format -}
\ No newline at end of file +} |