From 4bc9e3f7dfc88d988a424e20ae38e9b9455edf2a Mon Sep 17 00:00:00 2001 From: berleon Date: Tue, 18 Dec 2012 17:41:49 +0100 Subject: [PATCH 1/9] fixed Version unapply method --- src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala index 77c63c973..caca307c4 100755 --- a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala @@ -177,7 +177,7 @@ object Plugin extends sbt.Plugin { val VersionPattern = """(\d+)\.(\d+)\.(\d+)(?:-(.*))?""".r object Version { - def unapplySeq(str: String): Option[(Int, Int, Int, Seq[String])] = str match { + def unapply(str: String): Option[(Int, Int, Int, Seq[String])] = str match { case VersionPattern(major, minor, fix, appendix) => Some((major.toInt, minor.toInt, fix.toInt, Option(appendix).toSeq)) case _ => None } From b7ae7234238ca1eab31bde1fc71bb0a533537d24 Mon Sep 17 00:00:00 2001 From: berleon Date: Tue, 18 Dec 2012 17:43:57 +0100 Subject: [PATCH 2/9] added saveAsDot method to IvyGraphMLDependencies that generates a simple dot file --- .../sbt/graph/IvyGraphMLDependencies.scala | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala index 8408d03be..b709d25ce 100644 --- a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala @@ -195,6 +195,20 @@ object IvyGraphMLDependencies extends App { XML.save(outputFile, xml) } + def saveAsDot(graph : ModuleGraph, outputFile: File) : File = { + + val edges = { + for ( e <- graph.edges) + yield + "\t\"" + e._1.idString + "\" -> \"" + e._2.idString + "\"" + }.mkString("\n") + + val dot = "digraph \"dependency-graph\" {\n" + edges + "\n}" + + sbt.IO.write(outputFile, dot) + outputFile + } + def moduleIdFromElement(element: Node, version: String): ModuleId = ModuleId(element.attribute("organisation").get.text, element.attribute("name").get.text, version) From 2c771d58e66939f6a40f38f272389950ea391e30 Mon Sep 17 00:00:00 2001 From: berleon Date: Tue, 18 Dec 2012 17:45:24 +0100 Subject: [PATCH 3/9] added dependencyDotFile Setting and dependencyDotTask --- .../scala/net/virtualvoid/sbt/graph/Plugin.scala | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala index caca307c4..500ba99d5 100755 --- a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala @@ -28,6 +28,10 @@ object Plugin extends sbt.Plugin { "The location the graphml file should be generated at") val dependencyGraphML = TaskKey[File]("dependency-graph-ml", "Creates a graphml file containing the dependency-graph for a project") + val dependencyDotFile = SettingKey[File]("dependency-dot-file", + "The location the dot file should be generated at") + val dependencyDot = TaskKey[File]("dependency-dot", + "Creates a dot file containing the dpendency-graph for a project") val moduleGraph = TaskKey[IvyGraphMLDependencies.ModuleGraph]("module-graph", "The dependency graph for a project") val asciiGraph = TaskKey[String]("dependency-graph-string", @@ -104,6 +108,8 @@ object Plugin extends sbt.Plugin { dependencyTree <<= print(asciiTree), dependencyGraphMLFile <<= target / "dependencies-%s.graphml".format(config.toString), dependencyGraphML <<= dependencyGraphMLTask, + dependencyDotFile <<= target / "dependencies-%s.dot".format(config.toString), + dependencyDot <<= dependencyDotTask, whatDependsOn <<= InputTask(artifactIdParser) { module => (module, streams, moduleGraph) map { (module, streams, graph) => streams.log.info(IvyGraphMLDependencies.asciiTree(IvyGraphMLDependencies.reverseGraphStartingAt(graph, module))) @@ -121,7 +127,12 @@ object Plugin extends sbt.Plugin { streams.log.info("Wrote dependency graph to '%s'" format resultFile) resultFile } - + def dependencyDotTask = + (moduleGraph, dependencyDotFile, streams) map { (graph, outFile, streams) => + val resultFile = IvyGraphMLDependencies.saveAsDot(graph, outFile) + streams.log.info("Wrote dependency graph to '%s'" format resultFile) + resultFile + } def absoluteReportPath = (file: File) => file.getAbsolutePath def print(key: TaskKey[String]) = From 18e76737ecb8829e01d55240fa96619cd8a2b4a0 Mon Sep 17 00:00:00 2001 From: berleon Date: Fri, 21 Dec 2012 15:06:23 +0100 Subject: [PATCH 4/9] updatet to 0.7.1-SNAPSHOT --- src/sbt-test/sbt-dependency-graph/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sbt-test/sbt-dependency-graph/plugins.sbt b/src/sbt-test/sbt-dependency-graph/plugins.sbt index e25ce12a6..33a40a085 100644 --- a/src/sbt-test/sbt-dependency-graph/plugins.sbt +++ b/src/sbt-test/sbt-dependency-graph/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.0-RC3") \ No newline at end of file +addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.1-SNAPSHOT") \ No newline at end of file From 25a996752c15950004970dfa290c7114dc93836a Mon Sep 17 00:00:00 2001 From: berleon Date: Fri, 21 Dec 2012 15:13:06 +0100 Subject: [PATCH 5/9] removed com.typesafe.akka:akka-actor from libaryDependencies there was a resolving problems so the test failed. --- .../sbt-dependency-graph/ignoreScalaLibrary/build.sbt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/sbt-test/sbt-dependency-graph/ignoreScalaLibrary/build.sbt b/src/sbt-test/sbt-dependency-graph/ignoreScalaLibrary/build.sbt index 283f1ba13..709304b44 100644 --- a/src/sbt-test/sbt-dependency-graph/ignoreScalaLibrary/build.sbt +++ b/src/sbt-test/sbt-dependency-graph/ignoreScalaLibrary/build.sbt @@ -6,8 +6,8 @@ scalaVersion := "2.9.2" libraryDependencies ++= Seq( "org.slf4j" % "slf4j-api" % "1.7.2", - "ch.qos.logback" % "logback-classic" % "1.0.7", - "com.typesafe.akka" % "akka-actor" % "2.0.3") + "ch.qos.logback" % "logback-classic" % "1.0.7" + ) TaskKey[Unit]("check") <<= (ivyReport in Test, asciiTree in Test) map { (report, graph) => def sanitize(str: String): String = str.split('\n').drop(1).map(_.trim).mkString("\n") @@ -17,9 +17,6 @@ TaskKey[Unit]("check") <<= (ivyReport in Test, asciiTree in Test) map { (report, | | +-ch.qos.logback:logback-core:1.0.7 | | +-org.slf4j:slf4j-api:1.6.6 (evicted by: 1.7.2) | | - | +-com.typesafe.akka:akka-actor:2.0.3 [S] - | | +-com.typesafe:config:0.3.1 - | | | +-org.slf4j:slf4j-api:1.7.2 | """.stripMargin IO.writeLines(file("/tmp/blib"), sanitize(graph).split("\n")) From fd77497498ee3c73ddca547fed8f741f6e7e6586 Mon Sep 17 00:00:00 2001 From: berleon Date: Fri, 21 Dec 2012 15:14:25 +0100 Subject: [PATCH 6/9] added testDotFileGeneration it is a sbt-scripted project to test the dot generation process. --- .../testDotFileGeneration/project/build.scala | 75 +++++++++++++++++++ .../testDotFileGeneration/project/plugins.sbt | 1 + .../testDotFileGeneration/test | 1 + 3 files changed, 77 insertions(+) create mode 100644 src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala create mode 120000 src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/plugins.sbt create mode 100644 src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test diff --git a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala new file mode 100644 index 000000000..1d7e148ca --- /dev/null +++ b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala @@ -0,0 +1,75 @@ +import collection.mutable.ListBuffer +import net.virtualvoid.sbt.graph.Plugin._ + +import sbt._ +import sbt.Keys._ + +object Build extends sbt.Build { + + + lazy val justATransiviteDependencyEndpointProject = Project( + id = "just-a-transitive-dependency-endpoint", + base = file("."), + settings = Defaults.defaultSettings + ) + lazy val justATransitiveDependencyProject = Project( + id = "just-a-transitive-dependency", + base = file("."), + settings = Defaults.defaultSettings + ).dependsOn(justATransiviteDependencyEndpointProject) + + lazy val justADependencyProject = Project( + id = "just-a-dependency", + base = file("."), + settings = Defaults.defaultSettings + ) + + lazy val test_project = + Project( + id = "test-dot-file-generation", + base = file("."), + settings = Defaults.defaultSettings ++ + graphSettings ++ Seq( + sbtVersion := "0.12.1", + scalaVersion := "2.9.2", + resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/", + + TaskKey[Unit]("check") <<= (dependencyDot in Compile) map { (dotFile) => + def sanitize(str: String): String = str.split('\n').drop(1).mkString("\n") + val expectedGraph = + """digraph "dependency-graph" { + | graph[rankdir="LR"] + | node [ + | shape="record" + | ] + | edge [ + | arrowtail="none" + | ] + | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" + | "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_2.9.2:0.1-SNAPSHOT" + | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-dependency:just-a-dependency_2.9.2:0.1-SNAPSHOT" + |} + """.stripMargin + + val graph : String = scala.io.Source.fromFile(dotFile.getAbsolutePath).mkString + val errors = compareByLine(graph, expectedGraph) + require(errors.isEmpty , errors.mkString("\n")) + () + } + ) + ).dependsOn(justADependencyProject, justATransitiveDependencyProject) + + def compareByLine(got : String, expected : String) : Seq[String] = { + val errors = ListBuffer[String]() + got.split("\n").zip(expected.split("\n").toSeq).zipWithIndex.foreach { case((got_line : String, expected_line : String), i : Int) => + if(got_line != expected_line) { + errors.append( + """not matching lines at line %s + |expected: %s + |got: %s + |""".stripMargin.format(i,expected_line, got_line)) + } + } + errors + } +} \ No newline at end of file diff --git a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/plugins.sbt b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/plugins.sbt new file mode 120000 index 000000000..0caf1de77 --- /dev/null +++ b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/plugins.sbt @@ -0,0 +1 @@ +../../plugins.sbt \ No newline at end of file diff --git a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test new file mode 100644 index 000000000..1461a7105 --- /dev/null +++ b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test @@ -0,0 +1 @@ +> test-dot-file-generation/check \ No newline at end of file From 0097df83789ea5d019deb7f3734a9f68a2b38d9c Mon Sep 17 00:00:00 2001 From: berleon Date: Fri, 21 Dec 2012 15:14:46 +0100 Subject: [PATCH 7/9] improved dot generation --- .../sbt/graph/IvyGraphMLDependencies.scala | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala index b709d25ce..6803696fe 100644 --- a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala @@ -200,10 +200,19 @@ object IvyGraphMLDependencies extends App { val edges = { for ( e <- graph.edges) yield - "\t\"" + e._1.idString + "\" -> \"" + e._2.idString + "\"" + """ "%s" -> "%s"""".format(e._1.idString, e._2.idString) }.mkString("\n") - val dot = "digraph \"dependency-graph\" {\n" + edges + "\n}" + val dot = + """digraph "dependency-graph" { + | graph[rankdir="LR"] + | node [ + | shape="record" + | ] + | edge [ + | arrowtail="none" + | ] + |""".stripMargin + edges + "\n}" sbt.IO.write(outputFile, dot) outputFile From 24c614d568fcf78569666c1d41165ff8cfd0f54b Mon Sep 17 00:00:00 2001 From: berleon Date: Tue, 18 Dec 2012 17:41:49 +0100 Subject: [PATCH 8/9] added dot settings to README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 404d926c2..20eb2a260 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,8 @@ Tasks & Settings * `dependency-graph`: Shows an ASCII graph of the project's dependencies on the sbt console * `dependency-graph-ml`: Generates a .graphml file with the project's dependencies to `target/dependencies-.graphml`. Use e.g. [yEd](http://www.yworks.com/en/products_yed_about.html) to format the graph to your needs. + * `dependency-dot`: Generates a .dot file with the project's dependencies to `target/dependencies-.dot`. + Use [graphviz](http://www.graphviz.org/) to render it to your preferred graphic format. * `dependency-tree`: Shows an ASCII tree representation of the project's dependencies * `what-depends-on `: Find out what depends on an artifact. Shows a reverse dependency tree for the selected module. @@ -52,6 +54,7 @@ Tasks & Settings If `true`, instead of showing the dependency `"[S]"` is appended to the artifact name. Set to `false` if you want the scala-library dependency to appear in the output. (default: true) * `dependency-graph-ml-file`: a setting which allows configuring the output path of `dependency-graph-ml`. + * `dependency-dot-file`: a setting which allows configuring the output path of `dependency-dot`. * `ivy-report`: let's ivy generate the resolution report for you project. Use `show ivy-report` for the filename of the generated report From 2ea4470757a83d2bae2c1435da8357267e92ff77 Mon Sep 17 00:00:00 2001 From: Leon Sixt Date: Fri, 21 Dec 2012 18:48:39 +0100 Subject: [PATCH 9/9] more customisation for dot output with dependency-dot-head you can now define your own dot head. dependency-dot-node-label lets you customise the labels of the nodes --- README.md | 3 ++ .../sbt/graph/IvyGraphMLDependencies.scala | 23 ++++++----- .../net/virtualvoid/sbt/graph/Plugin.scala | 20 ++++++++- .../testDotFileGeneration/project/build.scala | 41 ++++++++++--------- .../testDotFileGeneration/test | 3 +- 5 files changed, 57 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 20eb2a260..76b648a64 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,9 @@ Tasks & Settings you want the scala-library dependency to appear in the output. (default: true) * `dependency-graph-ml-file`: a setting which allows configuring the output path of `dependency-graph-ml`. * `dependency-dot-file`: a setting which allows configuring the output path of `dependency-dot`. + * `dependency-dot-head`: a setting to customize the head of the dot file. (e.g. to set your preferred node shapes) + * `dependency-dot-nodes-label`: defines the formation of a node label + (default set to `[organisation]
[name]
[version]`) * `ivy-report`: let's ivy generate the resolution report for you project. Use `show ivy-report` for the filename of the generated report diff --git a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala index 6803696fe..3d75ac66d 100644 --- a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala @@ -195,7 +195,17 @@ object IvyGraphMLDependencies extends App { XML.save(outputFile, xml) } - def saveAsDot(graph : ModuleGraph, outputFile: File) : File = { + def saveAsDot(graph : ModuleGraph, + dotHead : String, + nodeFormation : Function3[String,String,String,String], + outputFile: File + ) : File = { + val nodes = { + for (n <- graph.nodes) + yield + """ "%s"[label=%s]""".format(n.id.idString, + nodeFormation(n.id.organisation, n.id.name, n.id.version)) + }.mkString("\n") val edges = { for ( e <- graph.edges) @@ -203,16 +213,7 @@ object IvyGraphMLDependencies extends App { """ "%s" -> "%s"""".format(e._1.idString, e._2.idString) }.mkString("\n") - val dot = - """digraph "dependency-graph" { - | graph[rankdir="LR"] - | node [ - | shape="record" - | ] - | edge [ - | arrowtail="none" - | ] - |""".stripMargin + edges + "\n}" + val dot = "%s\n%s\n%s\n}".format(dotHead, nodes, edges) sbt.IO.write(outputFile, dot) outputFile diff --git a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala index 500ba99d5..7707cae99 100755 --- a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala @@ -30,6 +30,10 @@ object Plugin extends sbt.Plugin { "Creates a graphml file containing the dependency-graph for a project") val dependencyDotFile = SettingKey[File]("dependency-dot-file", "The location the dot file should be generated at") + val dependencyDotNodeLabel = SettingKey[(String,String,String) => String]("dependency-dot-node-label", + "Returns a formated string of a dependency. Takes organisation, name and version as parameters") + val dependencyDotHead = SettingKey[String]("dependency-dot-head", + "The head of the dot file. (e.g. to set your preferred node shapes)") val dependencyDot = TaskKey[File]("dependency-dot", "Creates a dot file containing the dpendency-graph for a project") val moduleGraph = TaskKey[IvyGraphMLDependencies.ModuleGraph]("module-graph", @@ -110,6 +114,17 @@ object Plugin extends sbt.Plugin { dependencyGraphML <<= dependencyGraphMLTask, dependencyDotFile <<= target / "dependencies-%s.dot".format(config.toString), dependencyDot <<= dependencyDotTask, + dependencyDotHead := """digraph "dependency-graph" { + | graph[rankdir="LR"] + | node [ + | shape="record" + | ] + | edge [ + | arrowtail="none" + | ]""".stripMargin, + dependencyDotNodeLabel := { (organisation : String, name : String, version : String) => + """<%s
%s
%s>""".format(organisation, name, version) + }, whatDependsOn <<= InputTask(artifactIdParser) { module => (module, streams, moduleGraph) map { (module, streams, graph) => streams.log.info(IvyGraphMLDependencies.asciiTree(IvyGraphMLDependencies.reverseGraphStartingAt(graph, module))) @@ -128,8 +143,9 @@ object Plugin extends sbt.Plugin { resultFile } def dependencyDotTask = - (moduleGraph, dependencyDotFile, streams) map { (graph, outFile, streams) => - val resultFile = IvyGraphMLDependencies.saveAsDot(graph, outFile) + (moduleGraph, dependencyDotHead, dependencyDotNodeLabel, dependencyDotFile, streams). + map { (graph, dotHead, nodeLabelFormation, outFile, streams) => + val resultFile = IvyGraphMLDependencies.saveAsDot(graph, dotHead, nodeLabelFormation, outFile) streams.log.info("Wrote dependency graph to '%s'" format resultFile) resultFile } diff --git a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala index 1d7e148ca..62a50047e 100644 --- a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala +++ b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala @@ -35,26 +35,29 @@ object Build extends sbt.Build { resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/", TaskKey[Unit]("check") <<= (dependencyDot in Compile) map { (dotFile) => - def sanitize(str: String): String = str.split('\n').drop(1).mkString("\n") - val expectedGraph = - """digraph "dependency-graph" { - | graph[rankdir="LR"] - | node [ - | shape="record" - | ] - | edge [ - | arrowtail="none" - | ] - | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" - | "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_2.9.2:0.1-SNAPSHOT" - | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-dependency:just-a-dependency_2.9.2:0.1-SNAPSHOT" - |} - """.stripMargin + val expectedGraph = + """digraph "dependency-graph" { + | graph[rankdir="LR"] + | node [ + | shape="record" + | ] + | edge [ + | arrowtail="none" + | ] + | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT"[label=test-dot-file-generation_2.9.2
0.1-SNAPSHOT>] + | "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT"[label=just-a-transitive-dependency_2.9.2
0.1-SNAPSHOT>] + | "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_2.9.2:0.1-SNAPSHOT"[label=just-a-transitive-dependency-endpoint_2.9.2
0.1-SNAPSHOT>] + | "just-a-dependency:just-a-dependency_2.9.2:0.1-SNAPSHOT"[label=just-a-dependency_2.9.2
0.1-SNAPSHOT>] + | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" + | "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_2.9.2:0.1-SNAPSHOT" + | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-dependency:just-a-dependency_2.9.2:0.1-SNAPSHOT" + |} + """.stripMargin - val graph : String = scala.io.Source.fromFile(dotFile.getAbsolutePath).mkString - val errors = compareByLine(graph, expectedGraph) - require(errors.isEmpty , errors.mkString("\n")) - () + val graph : String = scala.io.Source.fromFile(dotFile.getAbsolutePath).mkString + val errors = compareByLine(graph, expectedGraph) + require(errors.isEmpty , errors.mkString("\n")) + () } ) ).dependsOn(justADependencyProject, justATransitiveDependencyProject) diff --git a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test index 1461a7105..f9fa19e83 100644 --- a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test +++ b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test @@ -1 +1,2 @@ -> test-dot-file-generation/check \ No newline at end of file +> project test-dot-file-generation +> check