summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-10-29 16:49:44 -0700
committerLi Haoyi <haoyi.sg@gmail.com>2017-10-29 16:49:44 -0700
commit144f0997689f5b927ed5a966dd075ec15364641b (patch)
treecc16617cd3b41fb11fb181b0a094826d6dcc9be0 /src/main
parentbe9b77ee1319d3597d7d83cd858367803845c46e (diff)
downloadmill-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.scala2
-rw-r--r--src/main/scala/forge/Target.scala2
-rw-r--r--src/main/scala/forge/util/PathRef.scala49
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
+}