From da69fd823dbe5f3e4d62f3cefb32c440c0f7a23c Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Tue, 15 Nov 2011 16:06:02 +0100 Subject: [PATCH] initial version --- .gitignore | 7 +++ build.sbt | 7 +++ .../sbt/graph/IvyGraphMLDependencies.scala | 63 +++++++++++++++++++ .../net/virtualvoid/sbt/graph/Plugin.scala | 20 ++++++ 4 files changed, 97 insertions(+) create mode 100644 .gitignore create mode 100644 build.sbt create mode 100644 src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala create mode 100644 src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..5b68a8125 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.idea +project/boot/ +target/ +lib_managed/ +src_managed/ +test-output/ +*.iml \ No newline at end of file diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..6cb5398ec --- /dev/null +++ b/build.sbt @@ -0,0 +1,7 @@ +sbtPlugin := true + +name := "sbt-dependency-graph" + +organization := "net.virtualvoid" + +version := "0.5" \ No newline at end of file diff --git a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala new file mode 100644 index 000000000..e0d350b11 --- /dev/null +++ b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala @@ -0,0 +1,63 @@ +package net.virtualvoid.sbt.graph + +import xml.parsing.ConstructingParser +import java.io.File +import xml.{XML, Node} + +object IvyGraphMLDependencies extends App { + case class Module(organisation: String, name: String) { + def id: String = organisation+"."+name + } + def transform(ivyReportFile: String, outputFile: String) { + val doc = ConstructingParser.fromSource(io.Source.fromFile(ivyReportFile), false).document + + val edges = + for (mod <- doc \ "dependencies" \ "module"; + depModule = nodeFromElement(mod); + caller <- mod \ "revision" \ "caller"; + callerModule = nodeFromElement(caller)) + yield (callerModule, depModule) + + val nodes = edges.flatMap(e => Seq(e._1, e._2)).distinct + + val nodesXml = + for (n <- nodes) + yield + + + {n.id} + + + + val edgesXml = + for (e <- edges) + yield + + val xml = + + + + {nodesXml} + {edgesXml} + + + + XML.save(outputFile, xml) + } + def nodeFromElement(element: Node): Module = + Module(element.attribute("organisation").get.text, element.attribute("name").get.text) + + def die(msg: String): Nothing = { + println(msg) + sys.exit(1) + } + def usage: String = + "Usage: " + + val file = args.lift(0).filter(f => new File(f).exists).getOrElse(die(usage)) + val inputFile = args.lift(1).getOrElse(die(usage)) + transform(file, inputFile) +} \ No newline at end of file diff --git a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala new file mode 100644 index 000000000..39a706718 --- /dev/null +++ b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala @@ -0,0 +1,20 @@ +package net.virtualvoid.sbt.graph + +import sbt._ +import Keys._ + +object Plugin extends sbt.Plugin { + val dependencyGraphTask = TaskKey[File]("dependency-graph") + + def graphSettings = Seq( + dependencyGraphTask <<= (projectID, appConfiguration, target, streams) map { (projectID, config, target, streams) => + val home = config.provider.scalaProvider.launcher.ivyHome + val fileName = "%s/cache/%s-%s-compile.xml" format (home, projectID.organization, projectID.name) + + val resultFile = target / "dependencies.graphml" + IvyGraphMLDependencies.transform(fileName, resultFile.getAbsolutePath) + streams.log.info("Wrote dependency graph to '%s'" format resultFile) + resultFile + } dependsOn(deliverLocal) + ) +} \ No newline at end of file