From 2adedf37bb42332aa548c47ef29f497a1df91eaa Mon Sep 17 00:00:00 2001 From: Jacob Wang Date: Fri, 27 Dec 2019 15:54:36 +0000 Subject: [PATCH] Fix whatDependsOn to show only original dependencies (not dependency after evictions). Fixes #109 --- .../sbt/graph/GraphTransformations.scala | 2 +- .../net/virtualvoid/sbt/graph/model.scala | 35 ++++++++++++++++--- .../build.sbt | 30 ++++++++++------ .../whatDependsOn/build.sbt | 28 ++++++++++----- 4 files changed, 71 insertions(+), 24 deletions(-) diff --git a/src/main/scala/net/virtualvoid/sbt/graph/GraphTransformations.scala b/src/main/scala/net/virtualvoid/sbt/graph/GraphTransformations.scala index c5c4e8a..24f97ef 100644 --- a/src/main/scala/net/virtualvoid/sbt/graph/GraphTransformations.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/GraphTransformations.scala @@ -18,7 +18,7 @@ package net.virtualvoid.sbt.graph object GraphTransformations { def reverseGraphStartingAt(graph: ModuleGraph, root: ModuleId): ModuleGraph = { - val deps = graph.reverseDependencyMap + val deps = graph.reverseOriginalDependencyMap def visit(module: ModuleId, visited: Set[ModuleId]): Seq[(ModuleId, ModuleId)] = if (visited(module)) diff --git a/src/main/scala/net/virtualvoid/sbt/graph/model.scala b/src/main/scala/net/virtualvoid/sbt/graph/model.scala index cbfc432..ccd5284 100644 --- a/src/main/scala/net/virtualvoid/sbt/graph/model.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/model.scala @@ -51,14 +51,41 @@ case class ModuleGraph(nodes: Seq[Module], edges: Seq[Edge]) { def module(id: ModuleId): Module = modules(id) lazy val dependencyMap: Map[ModuleId, Seq[Module]] = - createMap(identity) + createMap(identity, onlyOriginalDependencies = false) lazy val reverseDependencyMap: Map[ModuleId, Seq[Module]] = - createMap { case (a, b) ⇒ (b, a) } + createMap(_.swap, onlyOriginalDependencies = false) - def createMap(bindingFor: ((ModuleId, ModuleId)) ⇒ (ModuleId, ModuleId)): Map[ModuleId, Seq[Module]] = { + lazy val reverseOriginalDependencyMap: Map[ModuleId, Seq[Module]] = + createMap(_.swap, onlyOriginalDependencies = true) + + /** + * @param onlyOriginalDependencies Keep only dependency edges that are original, + * i.e. dependency relationships established due to evictions are ignored + */ + def createMap( + bindingFor: ((ModuleId, ModuleId)) ⇒ (ModuleId, ModuleId), + onlyOriginalDependencies: Boolean): Map[ModuleId, Seq[Module]] = { val m = new HashMap[ModuleId, Set[Module]] with MultiMap[ModuleId, Module] - edges.foreach { entry ⇒ + val relevantEdges = + if (onlyOriginalDependencies) { + edges + .groupBy { + case (dependant, dependency) ⇒ + ( + dependant.organisation, + dependant.name, + dependency.organisation, + dependency.name) + } + .mapValues { edgeGroup ⇒ + edgeGroup.find { case (_, dependency) ⇒ module(dependency).isEvicted } + .getOrElse(edgeGroup.head) + } + .values + .toSeq + } else edges + relevantEdges.foreach { entry ⇒ val (f, t) = bindingFor(entry) m.addBinding(f, module(t)) } diff --git a/src/sbt-test/sbt-dependency-graph/whatDependsOn-without-previous-initialization/build.sbt b/src/sbt-test/sbt-dependency-graph/whatDependsOn-without-previous-initialization/build.sbt index 92bb3b2..d6d7686 100644 --- a/src/sbt-test/sbt-dependency-graph/whatDependsOn-without-previous-initialization/build.sbt +++ b/src/sbt-test/sbt-dependency-graph/whatDependsOn-without-previous-initialization/build.sbt @@ -16,7 +16,10 @@ libraryDependencies ++= Seq( val check = TaskKey[Unit]("check") check := { - def sanitize(str: String): String = str.split('\n').map(_.trim).mkString("\n") + def sanitize(str: String): String = { + def trimRight(s: String) = s.replaceAll("""\s*$""", "") + str.split('\n').map(trimRight).mkString("\n") + } def checkOutput(output: String, expected: String): Unit = require(sanitize(expected) == sanitize(output), s"Tree should have been [\n${sanitize(expected)}\n] but was [\n${sanitize(output)}\n]") @@ -31,26 +34,33 @@ check := { | | | +-org.codehaus.jackson:jackson-mapper-asl:1.9.11 | +-com.codahale:jerkson_2.9.1:0.5.0 [S] - | | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] - | | - | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] + | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] | """.stripMargin checkOutput(withVersion, expectedGraphWithVersion) + val withEvictedVersion = + (whatDependsOn in Compile) + .toTask(" org.codehaus.jackson jackson-mapper-asl 1.9.10") + .value + val expectedGraphWithEvictedVersion = + """org.codehaus.jackson:jackson-mapper-asl:1.9.10 (evicted by: 1.9.11) + | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] + """.stripMargin + + checkOutput(withEvictedVersion, expectedGraphWithEvictedVersion) + val withoutVersion = (whatDependsOn in Compile) .toTask(" org.codehaus.jackson jackson-mapper-asl") .value val expectedGraphWithoutVersion = """org.codehaus.jackson:jackson-mapper-asl:1.9.11 - | +-com.codahale:jerkson_2.9.1:0.5.0 [S] - | | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] - | | - | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] + | +-com.codahale:jerkson_2.9.1:0.5.0 [S] + | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] | |org.codehaus.jackson:jackson-mapper-asl:1.9.10 (evicted by: 1.9.11) - | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] - | """.stripMargin + | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] + """.stripMargin checkOutput(withoutVersion, expectedGraphWithoutVersion) } diff --git a/src/sbt-test/sbt-dependency-graph/whatDependsOn/build.sbt b/src/sbt-test/sbt-dependency-graph/whatDependsOn/build.sbt index 19c9108..d9c2bfd 100644 --- a/src/sbt-test/sbt-dependency-graph/whatDependsOn/build.sbt +++ b/src/sbt-test/sbt-dependency-graph/whatDependsOn/build.sbt @@ -12,7 +12,10 @@ libraryDependencies ++= Seq( val check = TaskKey[Unit]("check") check := { - def sanitize(str: String): String = str.split('\n').map(_.trim).mkString("\n") + def sanitize(str: String): String = { + def trimRight(s: String) = s.replaceAll("""\s*$""", "") + str.split('\n').map(trimRight).mkString("\n") + } def checkOutput(output: String, expected: String): Unit = require(sanitize(expected) == sanitize(output), s"Tree should have been [\n${sanitize(expected)}\n] but was [\n${sanitize(output)}\n]") @@ -27,26 +30,33 @@ check := { | | | +-org.codehaus.jackson:jackson-mapper-asl:1.9.11 | +-com.codahale:jerkson_2.9.1:0.5.0 [S] - | | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] - | | - | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] + | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] | """.stripMargin checkOutput(withVersion, expectedGraphWithVersion) + val withEvictedVersion = + (whatDependsOn in Compile) + .toTask(" org.codehaus.jackson jackson-mapper-asl 1.9.10") + .value + val expectedGraphWithEvictedVersion = + """org.codehaus.jackson:jackson-mapper-asl:1.9.10 (evicted by: 1.9.11) + | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] + """.stripMargin + + checkOutput(withEvictedVersion, expectedGraphWithEvictedVersion) + val withoutVersion = (whatDependsOn in Compile) .toTask(" org.codehaus.jackson jackson-mapper-asl") .value val expectedGraphWithoutVersion = """org.codehaus.jackson:jackson-mapper-asl:1.9.11 - | +-com.codahale:jerkson_2.9.1:0.5.0 [S] - | | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] - | | - | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] + | +-com.codahale:jerkson_2.9.1:0.5.0 [S] + | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] | |org.codehaus.jackson:jackson-mapper-asl:1.9.10 (evicted by: 1.9.11) - | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] + | +-default:whatdependson_2.9.1:0.1.0-SNAPSHOT [S] | """.stripMargin checkOutput(withoutVersion, expectedGraphWithoutVersion) }