mirror of https://github.com/sbt/sbt.git
Protect against missing edges in graph by using map get vs apply
This commit is contained in:
parent
a451178719
commit
d366b77b23
|
|
@ -32,7 +32,7 @@ object GraphTransformations {
|
|||
val nodes =
|
||||
edges
|
||||
.foldLeft(Set.empty[GraphModuleId])((set, edge) => set + edge._1 + edge._2)
|
||||
.map(graph.module)
|
||||
.flatMap(graph.module)
|
||||
ModuleGraph(nodes.toSeq, edges)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ private[sbt] case class ModuleGraph(nodes: Seq[Module], edges: Seq[Edge]) {
|
|||
lazy val modules: Map[GraphModuleId, Module] =
|
||||
nodes.map(n => (n.id, n)).toMap
|
||||
|
||||
def module(id: GraphModuleId): Module = modules(id)
|
||||
def module(id: GraphModuleId): Option[Module] = modules.get(id)
|
||||
|
||||
lazy val dependencyMap: Map[GraphModuleId, Seq[Module]] =
|
||||
createMap(identity)
|
||||
|
|
@ -81,7 +81,7 @@ private[sbt] case class ModuleGraph(nodes: Seq[Module], edges: Seq[Edge]) {
|
|||
val m = new HashMap[GraphModuleId, Set[Module]] with MultiMap[GraphModuleId, Module]
|
||||
edges.foreach { entry =>
|
||||
val (f, t) = bindingFor(entry)
|
||||
m.addBinding(f, module(t))
|
||||
module(t).foreach(m.addBinding(f, _))
|
||||
}
|
||||
m.toMap.mapValues(_.toSeq.sortBy(_.id.idString)).toMap.withDefaultValue(Nil)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ object DOT {
|
|||
}
|
||||
}.sorted.mkString("\n")
|
||||
|
||||
def originWasEvicted(edge: Edge): Boolean = graph.module(edge._1).isEvicted
|
||||
def targetWasEvicted(edge: Edge): Boolean = graph.module(edge._2).isEvicted
|
||||
def originWasEvicted(edge: Edge): Boolean = graph.module(edge._1).exists(_.isEvicted)
|
||||
def targetWasEvicted(edge: Edge): Boolean = graph.module(edge._2).exists(_.isEvicted)
|
||||
|
||||
// add extra edges from evicted to evicted-by module
|
||||
val evictedByEdges: Seq[Edge] =
|
||||
|
|
@ -43,13 +43,11 @@ object DOT {
|
|||
// remove edges to new evicted-by module which is now replaced by a chain
|
||||
// dependend -> [evicted] -> dependee
|
||||
val evictionTargetEdges =
|
||||
graph.edges
|
||||
.filter(targetWasEvicted)
|
||||
.map {
|
||||
case (from, evicted) =>
|
||||
(from, evicted.copy(version = graph.module(evicted).evictedByVersion.get))
|
||||
}
|
||||
.toSet
|
||||
graph.edges.collect {
|
||||
case edge @ (from, evicted) if targetWasEvicted(edge) =>
|
||||
// Can safely call `get` as `targetWasEvicted` already proves evicted exists in the graph
|
||||
(from, evicted.copy(version = graph.module(evicted).flatMap(_.evictedByVersion).get))
|
||||
}.toSet
|
||||
|
||||
val filteredEdges =
|
||||
graph.edges
|
||||
|
|
@ -58,7 +56,7 @@ object DOT {
|
|||
val edges = {
|
||||
for (e <- filteredEdges) yield {
|
||||
val extra =
|
||||
if (graph.module(e._1).isEvicted)
|
||||
if (graph.module(e._1).exists(_.isEvicted))
|
||||
s""" [label="Evicted By" style="$EvictedStyle"]"""
|
||||
else ""
|
||||
""" "%s" -> "%s"%s""".format(e._1.idString, e._2.idString, extra)
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ object Statistics {
|
|||
val directDependencies = graph.dependencyMap(moduleId).filterNot(_.isEvicted).map(_.id)
|
||||
val dependencyStats =
|
||||
directDependencies.map(statsFor).flatMap(_.transitiveStatsWithSelf).toMap
|
||||
val selfSize = graph.module(moduleId).jarFile.filter(_.exists).map(_.length)
|
||||
val selfSize = graph.module(moduleId).flatMap(_.jarFile).filter(_.exists).map(_.length)
|
||||
val numDirectDependencies = directDependencies.size
|
||||
val numTransitiveDependencies = dependencyStats.size
|
||||
val transitiveSize = selfSize.getOrElse(0L) + dependencyStats
|
||||
|
|
|
|||
Loading…
Reference in New Issue