mirror of https://github.com/sbt/sbt.git
Bump to sbt 0.13.16, drop support for sbt 0.12.x
This commit is contained in:
parent
7a92c224d8
commit
8591a5adae
23
README.md
23
README.md
|
|
@ -4,10 +4,6 @@
|
|||
|
||||
Visualize your project's dependencies.
|
||||
|
||||
## Preliminaries
|
||||
|
||||
The plugin works best with sbt >= 0.13.6. See the [compatibility notes](#compatibility-notes) to use this plugin with an older version of sbt.
|
||||
|
||||
## Usage Instructions
|
||||
|
||||
Since sbt-dependency-graph is an informational tool rather than one that changes your build, you will more than likely wish to
|
||||
|
|
@ -20,8 +16,6 @@ addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.2")
|
|||
|
||||
To add the plugin only to a single project, put this line into `project/plugins.sbt` of your project, instead.
|
||||
|
||||
This plugin is an auto-plugin which will be automatically enabled starting from sbt 0.13.5.
|
||||
|
||||
## Main Tasks
|
||||
|
||||
* `dependencyTree`: Shows an ASCII tree representation of the project's dependencies
|
||||
|
|
@ -66,20 +60,6 @@ dependencyDotFile := file("dependencies.dot") //render dot file to `./dependenci
|
|||
|
||||
* [#19]: There's an unfixed bug with graph generation for particular layouts. Workaround:
|
||||
Use `dependency-tree` instead of `dependency-graph`.
|
||||
* [#39]: When using sbt-dependency-graph with sbt < 0.13.6.
|
||||
|
||||
## Compatibility notes
|
||||
|
||||
* sbt < 0.13.6: The plugin will fall back on the old ivy report XML backend which suffers from [#39].
|
||||
* sbt < 0.13.5: Old versions of sbt have no `AutoPlugin` support, you need to add
|
||||
|
||||
```scala
|
||||
net.virtualvoid.sbt.graph.DependencyGraphSettings.graphSettings
|
||||
```
|
||||
|
||||
to your `build.sbt` or (`~/.sbt/0.13/user.sbt` for global configuration) to enable the plugin.
|
||||
* sbt <= 0.12.x: Old versions of sbt are not actively supported any more. Please use the old version from the [0.7 branch](https://github.com/jrudolph/sbt-dependency-graph/tree/0.7).
|
||||
|
||||
|
||||
## License
|
||||
|
||||
|
|
@ -87,5 +67,4 @@ Published under the [Apache License 2.0](http://en.wikipedia.org/wiki/Apache_lic
|
|||
|
||||
[global plugin]: http://www.scala-sbt.org/0.13/tutorial/Using-Plugins.html#Global+plugins
|
||||
[global build configuration]: http://www.scala-sbt.org/0.13/docs/Global-Settings.html
|
||||
[#19]: https://github.com/jrudolph/sbt-dependency-graph/issues/19
|
||||
[#39]: https://github.com/jrudolph/sbt-dependency-graph/issues/39
|
||||
[#19]: https://github.com/jrudolph/sbt-dependency-graph/issues/19
|
||||
15
build.sbt
15
build.sbt
|
|
@ -1,9 +1,16 @@
|
|||
ScriptedPlugin.scriptedSettings
|
||||
|
||||
libraryDependencies += "com.github.mdr" %% "ascii-graphs" % "0.0.3"
|
||||
libraryDependencies ++= Seq(
|
||||
"com.github.mdr" %% "ascii-graphs" % "0.0.3",
|
||||
"org.specs2" %% "specs2" % "2.3.11" % Test
|
||||
)
|
||||
|
||||
libraryDependencies += "org.specs2" %% "specs2" % "2.3.11" % "test"
|
||||
|
||||
scalacOptions ++= Seq("-deprecation", "-unchecked")
|
||||
scalacOptions ++= Seq(
|
||||
"-deprecation",
|
||||
"-encoding",
|
||||
"UTF-8",
|
||||
"-feature",
|
||||
"-unchecked"
|
||||
)
|
||||
|
||||
ScalariformSupport.formatSettings
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
import java.net.URL
|
||||
|
||||
object Helpers {
|
||||
def generatePomExtra(scmUrl: String, scmConnection: String,
|
||||
developerId: String, developerName: String): xml.NodeSeq =
|
||||
<scm>
|
||||
<url>{ scmUrl }</url>
|
||||
<connection>{ scmConnection }</connection>
|
||||
</scm>
|
||||
<developers>
|
||||
<developer>
|
||||
<id>{ developerId }</id>
|
||||
<name>{ developerName }</name>
|
||||
</developer>
|
||||
</developers>
|
||||
}
|
||||
|
|
@ -1 +1 @@
|
|||
sbt.version=0.13.8
|
||||
sbt.version=0.13.16
|
||||
|
|
@ -1 +1 @@
|
|||
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")
|
||||
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.0")
|
||||
|
|
|
|||
29
publish.sbt
29
publish.sbt
|
|
@ -1,7 +1,11 @@
|
|||
publishTo <<= version { v: String =>
|
||||
publishTo := {
|
||||
val nexus = "https://oss.sonatype.org/"
|
||||
if (v.trim.endsWith("SNAPSHOT")) Some("snapshots" at nexus + "content/repositories/snapshots")
|
||||
else Some("releases" at nexus + "service/local/staging/deploy/maven2")
|
||||
if (version.value.trim.endsWith("SNAPSHOT")) {
|
||||
Some("snapshots" at nexus + "content/repositories/snapshots")
|
||||
}
|
||||
else {
|
||||
Some("releases" at nexus + "service/local/staging/deploy/maven2")
|
||||
}
|
||||
}
|
||||
|
||||
publishMavenStyle := true
|
||||
|
|
@ -10,9 +14,20 @@ publishArtifact in Test := false
|
|||
|
||||
pomIncludeRepository := { _ => false }
|
||||
|
||||
pomExtra :=
|
||||
Helpers.generatePomExtra("git@github.com:jrudolph/sbt-dependency-graph.git",
|
||||
"scm:git:git@github.com:jrudolph/sbt-dependency-graph.git",
|
||||
"jrudolph", "Johannes Rudolph")
|
||||
scmInfo := Some(
|
||||
ScmInfo(
|
||||
browseUrl = url("https://github.com/jrudolph/sbt-dependency-graph"),
|
||||
connection = "scm:git:git@github.com:jrudolph/sbt-dependency-graph.git"
|
||||
)
|
||||
)
|
||||
|
||||
developers := List(
|
||||
Developer(
|
||||
"jrudolph",
|
||||
"Johannes Rudolph",
|
||||
"johannes.rudolph@gmail.com",
|
||||
url("http://virtual-void.net")
|
||||
)
|
||||
)
|
||||
|
||||
useGpg := true
|
||||
|
|
|
|||
|
|
@ -29,139 +29,154 @@ import net.virtualvoid.sbt.graph.backend.{ IvyReport, SbtUpdateReport }
|
|||
import net.virtualvoid.sbt.graph.rendering.DagreHTML
|
||||
import net.virtualvoid.sbt.graph.util.IOUtil
|
||||
|
||||
import scala.language.reflectiveCalls
|
||||
|
||||
object DependencyGraphSettings {
|
||||
import DependencyGraphKeys._
|
||||
import ModuleGraphProtocol._
|
||||
|
||||
def graphSettings = Seq(
|
||||
ivyReportFunction <<= ivyReportFunctionTask,
|
||||
updateConfiguration in ignoreMissingUpdate <<= updateConfiguration(config ⇒ new UpdateConfiguration(config.retrieve, true, config.logging)),
|
||||
ivyReportFunction := ivyReportFunctionTask.value,
|
||||
updateConfiguration in ignoreMissingUpdate := {
|
||||
val config = updateConfiguration.value
|
||||
new UpdateConfiguration(config.retrieve, true, config.logging)
|
||||
},
|
||||
ignoreMissingUpdateT,
|
||||
filterScalaLibrary in Global := true) ++ Seq(Compile, Test, IntegrationTest, Runtime, Provided, Optional).flatMap(ivyReportForConfig)
|
||||
|
||||
def ivyReportForConfig(config: Configuration) = inConfig(config)(Seq(
|
||||
ivyReport <<= ivyReportFunction map (_(config.toString)) dependsOn (ignoreMissingUpdate),
|
||||
crossProjectId <<= (scalaVersion, scalaBinaryVersion, projectID)((sV, sBV, id) ⇒ CrossVersion(sV, sBV)(id)),
|
||||
moduleGraphSbt <<= moduleGraphSbtTask,
|
||||
moduleGraphIvyReport <<= moduleGraphIvyReportTask,
|
||||
moduleGraph <<= (sbtVersion, moduleGraphSbt, moduleGraphIvyReport) { (version, graphSbt, graphIvy) ⇒
|
||||
version match {
|
||||
case Version(0, 13, x, _) if x >= 6 ⇒ graphSbt
|
||||
case _ ⇒ graphIvy
|
||||
}
|
||||
ivyReport := {
|
||||
Def.task {
|
||||
ivyReportFunction.value.apply(config.toString)
|
||||
}.dependsOn(ignoreMissingUpdate)
|
||||
}.value,
|
||||
crossProjectId := sbt.CrossVersion(
|
||||
scalaVersion.value,
|
||||
scalaBinaryVersion.value)(projectID.value),
|
||||
moduleGraphSbt := {
|
||||
val update = ignoreMissingUpdate.value
|
||||
val root = crossProjectId.value
|
||||
val config = configuration.value
|
||||
|
||||
update.configuration(config.name).map(report ⇒
|
||||
SbtUpdateReport.fromConfigurationReport(report, root)).getOrElse(ModuleGraph.empty)
|
||||
},
|
||||
moduleGraph <<= (scalaVersion, moduleGraph, filterScalaLibrary) map { (scalaV, graph, filter) ⇒
|
||||
moduleGraphIvyReport := {
|
||||
IvyReport.fromReportFile(absoluteReportPath(ivyReport.value))
|
||||
},
|
||||
moduleGraph := {
|
||||
val graphSbt = moduleGraphSbt.value
|
||||
val graphIvy = moduleGraphIvyReport.value
|
||||
val filter = filterScalaLibrary.value
|
||||
val scalaV = scalaVersion.value
|
||||
|
||||
val graph =
|
||||
sbtVersion.value match {
|
||||
case Version(0, 13, x, _) if x >= 6 ⇒ graphSbt
|
||||
case Version(1, _, _, _) ⇒ graphSbt
|
||||
case _ ⇒ graphIvy
|
||||
}
|
||||
|
||||
if (filter) GraphTransformations.ignoreScalaLibrary(scalaV, graph)
|
||||
else graph
|
||||
},
|
||||
moduleGraphStore <<= moduleGraph storeAs moduleGraphStore triggeredBy moduleGraph,
|
||||
asciiGraph <<= moduleGraph map rendering.AsciiGraph.asciiGraph,
|
||||
dependencyGraph <<= InputTask(shouldForceParser) { force ⇒
|
||||
(force, moduleGraph, streams) map { (force, graph, streams) ⇒
|
||||
if (force || graph.nodes.size < 15) {
|
||||
streams.log.info(rendering.AsciiGraph.asciiGraph(graph))
|
||||
streams.log.info("\n\n")
|
||||
streams.log.info("Note: The old tree layout is still available by using `dependency-tree`")
|
||||
} else {
|
||||
streams.log.info(rendering.AsciiTree.asciiTree(graph))
|
||||
moduleGraphStore := (moduleGraph storeAs moduleGraphStore triggeredBy moduleGraph).value,
|
||||
asciiGraph := rendering.AsciiGraph.asciiGraph(moduleGraph.value),
|
||||
dependencyGraph := {
|
||||
val force = shouldForceParser.parsed
|
||||
val log = streams.value.log
|
||||
val graph = moduleGraph.value
|
||||
|
||||
if (!force) {
|
||||
streams.log.info("\n")
|
||||
streams.log.info("Note: The graph was estimated to be too big to display (> 15 nodes). Use `sbt 'dependency-graph --force'` (with the single quotes) to force graph display.")
|
||||
}
|
||||
}
|
||||
if (force || graph.nodes.size < 15) {
|
||||
log.info(rendering.AsciiGraph.asciiGraph(graph))
|
||||
log.info("\n\n")
|
||||
log.info("Note: The old tree layout is still available by using `dependency-tree`")
|
||||
}
|
||||
|
||||
log.info(rendering.AsciiTree.asciiTree(graph))
|
||||
|
||||
if (!force) {
|
||||
log.info("\n")
|
||||
log.info("Note: The graph was estimated to be too big to display (> 15 nodes). Use `sbt 'dependency-graph --force'` (with the single quotes) to force graph display.")
|
||||
}
|
||||
},
|
||||
asciiTree <<= moduleGraph map rendering.AsciiTree.asciiTree,
|
||||
dependencyTree <<= print(asciiTree),
|
||||
dependencyGraphMLFile <<= target / "dependencies-%s.graphml".format(config.toString),
|
||||
dependencyGraphML <<= dependencyGraphMLTask,
|
||||
dependencyDotFile <<= target / "dependencies-%s.dot".format(config.toString),
|
||||
dependencyDotString <<= dependencyDotStringTask,
|
||||
dependencyDot <<= writeToFile(dependencyDotString, dependencyDotFile),
|
||||
dependencyBrowseGraphTarget <<= target / "browse-dependency-graph",
|
||||
dependencyBrowseGraphHTML <<= browseGraphHTMLTask,
|
||||
dependencyBrowseGraph <<= (dependencyBrowseGraphHTML, streams).map { (uri, streams) ⇒
|
||||
streams.log.info("Opening in browser...")
|
||||
asciiTree := rendering.AsciiTree.asciiTree(moduleGraph.value),
|
||||
dependencyTree := print(asciiTree).value,
|
||||
dependencyGraphMLFile := { target.value / "dependencies-%s.graphml".format(config.toString) },
|
||||
dependencyGraphML := dependencyGraphMLTask.value,
|
||||
dependencyDotFile := { target.value / "dependencies-%s.dot".format(config.toString) },
|
||||
dependencyDotString := rendering.DOT.dotGraph(moduleGraph.value, dependencyDotHeader.value, dependencyDotNodeLabel.value, rendering.DOT.AngleBrackets),
|
||||
dependencyDot := writeToFile(dependencyDotString, dependencyDotFile).value,
|
||||
dependencyBrowseGraphTarget := { target.value / "browse-dependency-graph" },
|
||||
dependencyBrowseGraphHTML := browseGraphHTMLTask.value,
|
||||
dependencyBrowseGraph := {
|
||||
val uri = dependencyBrowseGraphHTML.value
|
||||
streams.value.log.info("Opening in browser...")
|
||||
java.awt.Desktop.getDesktop.browse(uri)
|
||||
uri
|
||||
},
|
||||
dependencyList <<= printFromGraph(rendering.FlatList.render(_, _.id.idString)),
|
||||
dependencyStats <<= printFromGraph(rendering.Statistics.renderModuleStatsList),
|
||||
dependencyDotHeader := """digraph "dependency-graph" {
|
||||
| graph[rankdir="LR"]
|
||||
| edge [
|
||||
| arrowtail="none"
|
||||
| ]""".stripMargin,
|
||||
dependencyList := printFromGraph(rendering.FlatList.render(_, _.id.idString)).value,
|
||||
dependencyStats := printFromGraph(rendering.Statistics.renderModuleStatsList).value,
|
||||
dependencyDotHeader := {
|
||||
"""|digraph "dependency-graph" {
|
||||
| graph[rankdir="LR"]
|
||||
| edge [
|
||||
| arrowtail="none"
|
||||
| ]""".stripMargin
|
||||
},
|
||||
dependencyDotNodeLabel := { (organisation: String, name: String, version: String) ⇒
|
||||
"""%s<BR/><B>%s</B><BR/>%s""".format(organisation, name, version)
|
||||
},
|
||||
whatDependsOn <<= InputTask(artifactIdParser) { module ⇒
|
||||
(module, streams, moduleGraph) map { (module, streams, graph) ⇒
|
||||
streams.log.info(rendering.AsciiTree.asciiTree(GraphTransformations.reverseGraphStartingAt(graph, module)))
|
||||
}
|
||||
whatDependsOn := {
|
||||
val module = artifactIdParser.parsed
|
||||
streams.value.log.info(rendering.AsciiTree.asciiTree(GraphTransformations.reverseGraphStartingAt(moduleGraph.value, module)))
|
||||
},
|
||||
licenseInfo <<= (moduleGraph, streams) map showLicenseInfo))
|
||||
licenseInfo := showLicenseInfo(moduleGraph.value, streams.value)))
|
||||
|
||||
def ivyReportFunctionTask =
|
||||
(sbtVersion, target, projectID, ivyModule, appConfiguration, streams) map { (sbtV, target, projectID, ivyModule, config, streams) ⇒
|
||||
sbtV match {
|
||||
case Version(0, min, fix, _) if min > 12 || (min == 12 && fix >= 3) ⇒
|
||||
(c: String) ⇒ file("%s/resolution-cache/reports/%s-%s-%s.xml".format(target, projectID.organization, crossName(ivyModule), c))
|
||||
case Version(0, min, fix, _) if min == 12 && fix >= 1 && fix < 3 ⇒
|
||||
ivyModule.withModule(streams.log) { (i, moduleDesc, _) ⇒
|
||||
val id = ResolveOptions.getDefaultResolveId(moduleDesc)
|
||||
(c: String) ⇒ file("%s/resolution-cache/reports/%s/%s-resolved.xml" format (target, id, c))
|
||||
}
|
||||
case _ ⇒
|
||||
val home = config.provider.scalaProvider.launcher.ivyHome
|
||||
(c: String) ⇒ file("%s/cache/%s-%s-%s.xml" format (home, projectID.organization, crossName(ivyModule), c))
|
||||
}
|
||||
def ivyReportFunctionTask = Def.task {
|
||||
val crossTarget = Keys.crossTarget.value
|
||||
val projectID = Keys.projectID.value
|
||||
val ivyModule = Keys.ivyModule.value
|
||||
|
||||
(config: String) ⇒ {
|
||||
val org = projectID.organization
|
||||
val name = crossName(ivyModule)
|
||||
file(s"${crossTarget}/resolution-cache/reports/$org-$name-$config.xml")
|
||||
}
|
||||
|
||||
def moduleGraphIvyReportTask = ivyReport map (absoluteReportPath.andThen(IvyReport.fromReportFile))
|
||||
def moduleGraphSbtTask =
|
||||
(ignoreMissingUpdate, crossProjectId, configuration) map { (update, root, config) ⇒
|
||||
update.configuration(config.name).map(report ⇒ SbtUpdateReport.fromConfigurationReport(report, root)).getOrElse(ModuleGraph.empty)
|
||||
}
|
||||
|
||||
def printAsciiGraphTask =
|
||||
(streams, asciiGraph) map (_.log.info(_))
|
||||
}
|
||||
|
||||
def dependencyGraphMLTask =
|
||||
(moduleGraph, dependencyGraphMLFile, streams) map { (graph, resultFile, streams) ⇒
|
||||
rendering.GraphML.saveAsGraphML(graph, resultFile.getAbsolutePath)
|
||||
streams.log.info("Wrote dependency graph to '%s'" format resultFile)
|
||||
Def.task {
|
||||
val resultFile = dependencyGraphMLFile.value
|
||||
rendering.GraphML.saveAsGraphML(moduleGraph.value, resultFile.getAbsolutePath)
|
||||
streams.value.log.info("Wrote dependency graph to '%s'" format resultFile)
|
||||
resultFile
|
||||
}
|
||||
def dependencyDotStringTask =
|
||||
(moduleGraph, dependencyDotHeader, dependencyDotNodeLabel).map {
|
||||
(graph, dotHead, nodeLabel) ⇒ rendering.DOT.dotGraph(graph, dotHead, nodeLabel, rendering.DOT.AngleBrackets)
|
||||
}
|
||||
|
||||
def browseGraphHTMLTask =
|
||||
(moduleGraph, dependencyDotHeader, dependencyDotNodeLabel, dependencyBrowseGraphTarget, streams).map { (graph, dotHead, nodeLabel, target, streams) ⇒
|
||||
val dotGraph = rendering.DOT.dotGraph(graph, dotHead, nodeLabel, rendering.DOT.LabelTypeHtml)
|
||||
val link = DagreHTML.createLink(dotGraph, target)
|
||||
streams.log.info(s"HTML graph written to $link")
|
||||
Def.task {
|
||||
val dotGraph = rendering.DOT.dotGraph(moduleGraph.value, dependencyDotHeader.value, dependencyDotNodeLabel.value, rendering.DOT.LabelTypeHtml)
|
||||
val link = DagreHTML.createLink(dotGraph, target.value)
|
||||
streams.value.log.info(s"HTML graph written to $link")
|
||||
link
|
||||
}
|
||||
|
||||
def writeToFile(dataTask: TaskKey[String], fileTask: SettingKey[File]) =
|
||||
(dataTask, fileTask, streams).map { (data, outFile, streams) ⇒
|
||||
IOUtil.writeToFile(data, outFile)
|
||||
Def.task {
|
||||
val outFile = fileTask.value
|
||||
IOUtil.writeToFile(dataTask.value, outFile)
|
||||
|
||||
streams.log.info("Wrote dependency graph to '%s'" format outFile)
|
||||
streams.value.log.info("Wrote dependency graph to '%s'" format outFile)
|
||||
outFile
|
||||
}
|
||||
|
||||
def absoluteReportPath = (file: File) ⇒ file.getAbsolutePath
|
||||
|
||||
def print(key: TaskKey[String]) =
|
||||
(streams, key) map (_.log.info(_))
|
||||
Def.task { streams.value.log.info(key.value) }
|
||||
|
||||
def printFromGraph(f: ModuleGraph ⇒ String) =
|
||||
(streams, moduleGraph) map ((streams, graph) ⇒ streams.log.info(f(graph)))
|
||||
Def.task { streams.value.log.info(f(moduleGraph.value)) }
|
||||
|
||||
def showLicenseInfo(graph: ModuleGraph, streams: TaskStreams) {
|
||||
val output =
|
||||
|
|
@ -180,7 +195,7 @@ object DependencyGraphSettings {
|
|||
(Space ~> token("--force")).?.map(_.isDefined)
|
||||
}
|
||||
|
||||
val artifactIdParser: Initialize[State ⇒ Parser[ModuleId]] =
|
||||
val artifactIdParser: Def.Initialize[State ⇒ Parser[ModuleId]] =
|
||||
resolvedScoped { ctx ⇒
|
||||
(state: State) ⇒
|
||||
val graph = loadFromContext(moduleGraphStore, ctx, state) getOrElse ModuleGraph(Nil, Nil)
|
||||
|
|
@ -222,7 +237,7 @@ object DependencyGraphSettings {
|
|||
* to ignore missing artifacts.
|
||||
*/
|
||||
def ignoreMissingUpdateT =
|
||||
ignoreMissingUpdate <<= Def.task {
|
||||
ignoreMissingUpdate := Def.task {
|
||||
val depsUpdated = transitiveUpdate.value.exists(!_.stats.cached)
|
||||
val isRoot = executionRoots.value contains resolvedScoped.value
|
||||
val s = streams.value
|
||||
|
|
@ -237,13 +252,26 @@ object DependencyGraphSettings {
|
|||
case (Some(res), _, Some(decl)) if res == decl ⇒ jars
|
||||
case _ ⇒ Nil
|
||||
}
|
||||
|
||||
val subScalaJars: String ⇒ Seq[File] = SbtAccess.unmanagedScalaInstanceOnly.value match {
|
||||
case Some(si) ⇒ subUnmanaged(si.version, si.jars)
|
||||
case None ⇒ sv ⇒ if (scalaProvider.version == sv) scalaProvider.jars else Nil
|
||||
}
|
||||
val transform: UpdateReport ⇒ UpdateReport = r ⇒ Classpaths.substituteScalaFiles(scalaOrganization.value, r)(subScalaJars)
|
||||
|
||||
val transform: UpdateReport ⇒ UpdateReport =
|
||||
r ⇒ Classpaths.substituteScalaFiles(scalaOrganization.value, r)(subScalaJars)
|
||||
|
||||
val show = Reference.display(thisProjectRef.value)
|
||||
Classpaths.cachedUpdate(s.cacheDirectory, show, ivyModule.value, (updateConfiguration in ignoreMissingUpdate).value, transform, skip = (skip in update).value, force = isRoot, depsUpdated = depsUpdated, log = s.log)
|
||||
}
|
||||
}
|
||||
|
||||
Classpaths.cachedUpdate(
|
||||
cacheFile = s.cacheDirectory,
|
||||
label = show,
|
||||
module = ivyModule.value,
|
||||
config = (updateConfiguration in ignoreMissingUpdate).value,
|
||||
transform = transform,
|
||||
skip = (skip in update).value,
|
||||
force = isRoot,
|
||||
depsUpdated = depsUpdated,
|
||||
log = s.log)
|
||||
}.value
|
||||
}
|
||||
|
|
@ -19,6 +19,9 @@ package backend
|
|||
|
||||
import sbt._
|
||||
|
||||
import scala.language.implicitConversions
|
||||
import scala.language.reflectiveCalls
|
||||
|
||||
object SbtUpdateReport {
|
||||
type OrganizationArtifactReport = {
|
||||
def modules: Seq[ModuleReport]
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
sbt.version=0.13.6
|
||||
sbt.version=0.13.16
|
||||
|
|
@ -1,21 +1,27 @@
|
|||
scalaVersion := "2.9.2"
|
||||
scalaVersion := "2.12.3"
|
||||
|
||||
libraryDependencies ++= Seq(
|
||||
"org.slf4j" % "slf4j-api" % "1.7.2",
|
||||
"ch.qos.logback" % "logback-classic" % "1.0.7"
|
||||
)
|
||||
|
||||
TaskKey[Unit]("check") <<= (ivyReport in Test, asciiTree in Test) map { (report, graph) =>
|
||||
TaskKey[Unit]("check") := {
|
||||
val report = (ivyReport in Test).value
|
||||
val graph = (asciiTree in Test).value
|
||||
val scalaV = scalaVersion.value
|
||||
|
||||
def sanitize(str: String): String = str.split('\n').drop(1).map(_.trim).mkString("\n")
|
||||
|
||||
val expectedGraph =
|
||||
"""default:default-e95e05_2.9.2:0.1-SNAPSHOT [S]
|
||||
| +-ch.qos.logback:logback-classic:1.0.7
|
||||
| | +-ch.qos.logback:logback-core:1.0.7
|
||||
| | +-org.slf4j:slf4j-api:1.6.6 (evicted by: 1.7.2)
|
||||
| | +-org.slf4j:slf4j-api:1.7.2
|
||||
| |
|
||||
| +-org.slf4j:slf4j-api:1.7.2
|
||||
| """.stripMargin
|
||||
s"""|default:default-e95e05_${scalaV}:0.1-SNAPSHOT [S]
|
||||
| +-ch.qos.logback:logback-classic:1.0.7
|
||||
| | +-ch.qos.logback:logback-core:1.0.7
|
||||
| | +-org.slf4j:slf4j-api:1.6.6 (evicted by: 1.7.2)
|
||||
| | +-org.slf4j:slf4j-api:1.7.2
|
||||
| |
|
||||
| +-org.slf4j:slf4j-api:1.7.2
|
||||
| """.stripMargin
|
||||
|
||||
IO.writeLines(file("/tmp/blib"), sanitize(graph).split("\n"))
|
||||
IO.writeLines(file("/tmp/blub"), sanitize(expectedGraph).split("\n"))
|
||||
require(sanitize(graph) == sanitize(expectedGraph), "Graph for report %s was '\n%s' but should have been '\n%s'" format (report, sanitize(graph), sanitize(expectedGraph)))
|
||||
|
|
|
|||
|
|
@ -6,17 +6,24 @@ libraryDependencies ++= Seq(
|
|||
"com.codahale" % "jerkson_2.9.1" % "0.5.0"
|
||||
)
|
||||
|
||||
TaskKey[Unit]("check") <<= (ivyReport in Test, asciiTree in Test) map { (report, graph) =>
|
||||
TaskKey[Unit]("check") := {
|
||||
val report = (ivyReport in Test).value
|
||||
val graph = (asciiTree in Test).value
|
||||
|
||||
def sanitize(str: String): String = str.split('\n').drop(1).map(_.trim).mkString("\n")
|
||||
|
||||
// latest: 1.9.13
|
||||
// http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.codehaus.jackson%22%20AND%20a%3A%22jackson-core-asl%22
|
||||
|
||||
val expectedGraph =
|
||||
"""default:default-dbc48d_2.9.2:0.1-SNAPSHOT [S]
|
||||
| +-com.codahale:jerkson_2.9.1:0.5.0 [S]
|
||||
| +-org.codehaus.jackson:jackson-core-asl:1.9.13
|
||||
| +-org.codehaus.jackson:jackson-mapper-asl:1.9.13
|
||||
| +-org.codehaus.jackson:jackson-core-asl:1.9.13
|
||||
| +-org.codehaus.jackson:jackson-core-asl:1.9.11
|
||||
| +-org.codehaus.jackson:jackson-mapper-asl:1.9.11
|
||||
| +-org.codehaus.jackson:jackson-core-asl:1.9.11
|
||||
| """.stripMargin
|
||||
IO.writeLines(file("/tmp/blib"), sanitize(graph).split("\n"))
|
||||
IO.writeLines(file("/tmp/blub"), sanitize(expectedGraph).split("\n"))
|
||||
require(sanitize(graph) == sanitize(expectedGraph), "Graph for report %s was '\n%s' but should have been '\n%s'" format (report, sanitize(graph), sanitize(expectedGraph)))
|
||||
()
|
||||
}
|
||||
}
|
||||
|
|
@ -3,8 +3,12 @@ scalaVersion := "2.9.2"
|
|||
libraryDependencies +=
|
||||
"at.blub" % "blib" % "1.2.3" % "test"
|
||||
|
||||
TaskKey[Unit]("check") <<= (ivyReport in Test, asciiTree in Test) map { (report, graph) =>
|
||||
def sanitize(str: String): String = str.split('\n').drop(1).mkString("\n")
|
||||
TaskKey[Unit]("check") := {
|
||||
val report = (ivyReport in Test).value
|
||||
val graph = (asciiTree in Test).value
|
||||
|
||||
def sanitize(str: String): String = str.split('\n').drop(1).map(_.trim).mkString("\n")
|
||||
|
||||
val expectedGraph =
|
||||
"""default:default-91180e_2.9.2:0.1-SNAPSHOT
|
||||
| +-%sat.blub:blib:1.2.3 (error: not found)%s
|
||||
|
|
|
|||
|
|
@ -0,0 +1,65 @@
|
|||
import collection.mutable.ListBuffer
|
||||
|
||||
def defaultSettings = Seq(scalaVersion := "2.12.3")
|
||||
|
||||
lazy val `just-a-transitive-dependency-endpoint` =
|
||||
project
|
||||
.in(file("a"))
|
||||
.settings(defaultSettings)
|
||||
|
||||
lazy val `just-a-transitive-dependency` =
|
||||
project
|
||||
.in(file("b"))
|
||||
.settings(defaultSettings)
|
||||
.dependsOn(`just-a-transitive-dependency-endpoint`)
|
||||
|
||||
lazy val `just-a-dependency` =
|
||||
project
|
||||
.in(file("c"))
|
||||
.settings(defaultSettings)
|
||||
|
||||
lazy val `test-dot-file-generation` =
|
||||
project
|
||||
.in(file("d"))
|
||||
.settings(defaultSettings)
|
||||
.settings(
|
||||
TaskKey[Unit]("check") := {
|
||||
val dotFile = (dependencyDot in Compile).value
|
||||
val scalaV = scalaBinaryVersion.value
|
||||
|
||||
val expectedGraph =
|
||||
s"""|digraph "dependency-graph" {
|
||||
| graph[rankdir="LR"]
|
||||
| edge [
|
||||
| arrowtail="none"
|
||||
| ]
|
||||
| "test-dot-file-generation:test-dot-file-generation_${scalaV}:0.1-SNAPSHOT"[label=<test-dot-file-generation<BR/><B>test-dot-file-generation_${scalaV}</B><BR/>0.1-SNAPSHOT> style=""]
|
||||
| "just-a-transitive-dependency:just-a-transitive-dependency_${scalaV}:0.1-SNAPSHOT"[label=<just-a-transitive-dependency<BR/><B>just-a-transitive-dependency_${scalaV}</B><BR/>0.1-SNAPSHOT> style=""]
|
||||
| "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_${scalaV}:0.1-SNAPSHOT"[label=<just-a-transitive-dependency-endpoint<BR/><B>just-a-transitive-dependency-endpoint_${scalaV}</B><BR/>0.1-SNAPSHOT> style=""]
|
||||
| "just-a-dependency:just-a-dependency_${scalaV}:0.1-SNAPSHOT"[label=<just-a-dependency<BR/><B>just-a-dependency_${scalaV}</B><BR/>0.1-SNAPSHOT> style=""]
|
||||
| "test-dot-file-generation:test-dot-file-generation_${scalaV}:0.1-SNAPSHOT" -> "just-a-transitive-dependency:just-a-transitive-dependency_${scalaV}:0.1-SNAPSHOT"
|
||||
| "just-a-transitive-dependency:just-a-transitive-dependency_${scalaV}:0.1-SNAPSHOT" -> "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_${scalaV}:0.1-SNAPSHOT"
|
||||
| "test-dot-file-generation:test-dot-file-generation_${scalaV}:0.1-SNAPSHOT" -> "just-a-dependency:just-a-dependency_${scalaV}: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(`just-a-dependency`, `just-a-transitive-dependency`)
|
||||
|
||||
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
|
||||
}
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
import collection.mutable.ListBuffer
|
||||
|
||||
import sbt._
|
||||
import sbt.Keys._
|
||||
|
||||
import net.virtualvoid.sbt.graph.DependencyGraphKeys._
|
||||
|
||||
object Build extends sbt.Build {
|
||||
|
||||
def defaultSettings =
|
||||
Seq(scalaVersion := "2.9.2")
|
||||
|
||||
lazy val justATransiviteDependencyEndpointProject =
|
||||
Project("just-a-transitive-dependency-endpoint", file("a"))
|
||||
.settings(defaultSettings: _*)
|
||||
|
||||
lazy val justATransitiveDependencyProject =
|
||||
Project("just-a-transitive-dependency", file("b"))
|
||||
.settings(defaultSettings: _*)
|
||||
.dependsOn(justATransiviteDependencyEndpointProject)
|
||||
|
||||
lazy val justADependencyProject =
|
||||
Project("just-a-dependency", file("c"))
|
||||
.settings(defaultSettings: _*)
|
||||
|
||||
lazy val test_project =
|
||||
Project("test-dot-file-generation", file("d"))
|
||||
.settings(defaultSettings: _*)
|
||||
.settings(
|
||||
TaskKey[Unit]("check") <<= (dependencyDot in Compile) map { (dotFile) =>
|
||||
val expectedGraph =
|
||||
"""digraph "dependency-graph" {
|
||||
| graph[rankdir="LR"]
|
||||
| edge [
|
||||
| arrowtail="none"
|
||||
| ]
|
||||
| "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT"[label=<test-dot-file-generation<BR/><B>test-dot-file-generation_2.9.2</B><BR/>0.1-SNAPSHOT> style=""]
|
||||
| "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT"[label=<just-a-transitive-dependency<BR/><B>just-a-transitive-dependency_2.9.2</B><BR/>0.1-SNAPSHOT> style=""]
|
||||
| "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_2.9.2:0.1-SNAPSHOT"[label=<just-a-transitive-dependency-endpoint<BR/><B>just-a-transitive-dependency-endpoint_2.9.2</B><BR/>0.1-SNAPSHOT> style=""]
|
||||
| "just-a-dependency:just-a-dependency_2.9.2:0.1-SNAPSHOT"[label=<just-a-dependency<BR/><B>just-a-dependency_2.9.2</B><BR/>0.1-SNAPSHOT> style=""]
|
||||
| "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
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue