initial version

This commit is contained in:
Johannes Rudolph 2011-11-15 16:06:02 +01:00
commit da69fd823d
4 changed files with 97 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.idea
project/boot/
target/
lib_managed/
src_managed/
test-output/
*.iml

7
build.sbt Normal file
View File

@ -0,0 +1,7 @@
sbtPlugin := true
name := "sbt-dependency-graph"
organization := "net.virtualvoid"
version := "0.5"

View File

@ -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
<node id={n.id}><data key="d0">
<y:ShapeNode>
<y:NodeLabel>{n.id}</y:NodeLabel>
</y:ShapeNode>
</data></node>
val edgesXml =
for (e <- edges)
yield <edge source={e._1.id} target={e._2.id} />
val xml =
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:y="http://www.yworks.com/xml/graphml"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key for="node" id="d0" yfiles.type="nodegraphics"/>
<graph id="Graph" edgedefault="undirected">
{nodesXml}
{edgesXml}
</graph>
</graphml>
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: <ivy-report-file> <output-file>"
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)
}

View File

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