Protect against missing edges in graph by using map get vs apply

This commit is contained in:
frosforever 2022-07-19 09:55:45 -04:00 committed by Eugene Yokota
parent a451178719
commit d366b77b23
4 changed files with 12 additions and 14 deletions

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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)

View File

@ -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