mirror of https://github.com/sbt/sbt.git
initial version
This commit is contained in:
commit
da69fd823d
|
|
@ -0,0 +1,7 @@
|
||||||
|
.idea
|
||||||
|
project/boot/
|
||||||
|
target/
|
||||||
|
lib_managed/
|
||||||
|
src_managed/
|
||||||
|
test-output/
|
||||||
|
*.iml
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
sbtPlugin := true
|
||||||
|
|
||||||
|
name := "sbt-dependency-graph"
|
||||||
|
|
||||||
|
organization := "net.virtualvoid"
|
||||||
|
|
||||||
|
version := "0.5"
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue