diff options
author | Roman Timushev <rtimush@gmail.com> | 2017-12-12 00:13:51 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-12 00:13:51 +0100 |
commit | 908fd43e8de23bd0da7a98710e3146674de624f9 (patch) | |
tree | e9340f7440e1ee483de457aceae75038a75d29ae | |
parent | bb61c05217671e80ba381b2cac869130c306baa8 (diff) | |
parent | ee7c879f078e33eda21f6e967f82f4a582959645 (diff) | |
download | mill-908fd43e8de23bd0da7a98710e3146674de624f9.tar.gz mill-908fd43e8de23bd0da7a98710e3146674de624f9.tar.bz2 mill-908fd43e8de23bd0da7a98710e3146674de624f9.zip |
Merge pull request #55 from lihaoyi/repl-cache
Fix task cache in REPL
-rw-r--r-- | core/src/main/scala/mill/eval/Evaluator.scala | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/core/src/main/scala/mill/eval/Evaluator.scala b/core/src/main/scala/mill/eval/Evaluator.scala index b4f4413f..c45f1744 100644 --- a/core/src/main/scala/mill/eval/Evaluator.scala +++ b/core/src/main/scala/mill/eval/Evaluator.scala @@ -1,5 +1,7 @@ package mill.eval +import java.net.URLClassLoader + import ammonite.ops._ import ammonite.runtime.SpecialClassLoader import mill.define.{Graph, Target, Task} @@ -28,12 +30,14 @@ class Evaluator(workspacePath: Path, val evaluated = new OSet.Mutable[Task[_]] val results = mutable.LinkedHashMap.empty[Task[_], Result[Any]] + val classLoaderSignatureCache = mutable.Map.empty[ClassLoader, Seq[(Path, Long)]] for ((terminal, group)<- sortedGroups.items()){ val (newResults, newEvaluated) = evaluateGroupCached( terminal, group, - results + results, + classLoaderSignatureCache ) for(ev <- newEvaluated){ evaluated.append(ev) @@ -61,15 +65,19 @@ class Evaluator(workspacePath: Path, def evaluateGroupCached(terminal: Either[Task[_], LabelledTarget[_]], group: OSet[Task[_]], - results: collection.Map[Task[_], Result[Any]]): (collection.Map[Task[_], Result[Any]], Seq[Task[_]]) = { + results: collection.Map[Task[_], Result[Any]], + signatureCache: mutable.Map[ClassLoader, Seq[(Path, Long)]]): (collection.Map[Task[_], Result[Any]], Seq[Task[_]]) = { val externalInputs = group.items.flatMap(_.inputs).filter(!group.contains(_)) // check if the build itself has changed - val classLoaderSig = Thread.currentThread().getContextClassLoader match { - case scl: SpecialClassLoader => scl.classpathSignature - case _ => Nil + val classLoaderSig = group.toVector.map(_.getClass.getClassLoader).map { cl => + signatureCache.getOrElseUpdate(cl, cl match { + case scl: SpecialClassLoader => scl.classpathSignature + case ucl: URLClassLoader => SpecialClassLoader.initialClasspathSignature(ucl) + case _ => Nil + }) } val inputsHash = |