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