From 982a7c87241af974436e1ee60f6ade6c3bed0255 Mon Sep 17 00:00:00 2001 From: Roman Iakovlev Date: Mon, 30 May 2016 12:11:44 +0200 Subject: [PATCH 1/3] Add new SBT global setting asciiGraphWidth This setting controls the maximum width of the ASCII graphs printed by commands like `inspect tree`. Default value corresponds to the previously hardcoded value of 40 characters. --- .gitignore | 1 + main/src/main/scala/sbt/Defaults.scala | 3 ++- main/src/main/scala/sbt/Keys.scala | 1 + main/src/main/scala/sbt/Project.scala | 4 ++-- main/src/main/scala/sbt/internal/Inspect.scala | 2 +- .../src/main/scala/sbt/internal/SettingGraph.scala | 14 ++++++++------ notes/1.0.0/ascii-graph-width.markdown | 9 +++++++++ 7 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 notes/1.0.0/ascii-graph-width.markdown diff --git a/.gitignore b/.gitignore index e762de7f9..03aec7c81 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ target/ __pycache__ +.idea diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 382acbfbe..09f0cc749 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -362,7 +362,8 @@ object Defaults extends BuildCommon { private[this] lazy val configGlobal = globalDefaults(Seq( initialCommands :== "", - cleanupCommands :== "" + cleanupCommands :== "", + asciiGraphWidth :== 40 )) lazy val projectTasks: Seq[Setting[_]] = Seq( diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index fcf980d93..6fa80a7f8 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -179,6 +179,7 @@ object Keys { val compileOrder = SettingKey[CompileOrder]("compile-order", "Configures the order in which Java and sources within a single compilation are compiled. Valid values are: JavaThenScala, ScalaThenJava, or Mixed.", BPlusSetting) val initialCommands = SettingKey[String]("initial-commands", "Initial commands to execute when starting up the Scala interpreter.", AMinusSetting) val cleanupCommands = SettingKey[String]("cleanup-commands", "Commands to execute before the Scala interpreter exits.", BMinusSetting) + val asciiGraphWidth = SettingKey[Int]("asciiGraphWidth", "Determines maximum width of the settings graph in ASCII mode", AMinusSetting) val compileOptions = TaskKey[CompileOptions]("compile-options", "Collects basic options to configure compilers", DTask) val compileInputs = TaskKey[Inputs]("compile-inputs", "Collects all inputs needed for compilation.", DTask) val scalaHome = SettingKey[Option[File]]("scala-home", "If Some, defines the local Scala installation to use for compilation, running, and testing.", ASetting) diff --git a/main/src/main/scala/sbt/Project.scala b/main/src/main/scala/sbt/Project.scala index d1f54a525..76323ae27 100755 --- a/main/src/main/scala/sbt/Project.scala +++ b/main/src/main/scala/sbt/Project.scala @@ -534,8 +534,8 @@ object Project extends ProjectExtra { printScopes("Delegates", delegates(structure, scope, key)) + printScopes("Related", related, 10) } - def settingGraph(structure: BuildStructure, basedir: File, scoped: ScopedKey[_])(implicit display: Show[ScopedKey[_]]): SettingGraph = - SettingGraph(structure, basedir, scoped, 0) + def settingGraph(structure: BuildStructure, basedir: File, scoped: ScopedKey[_], maxGraphWidth: Int)(implicit display: Show[ScopedKey[_]]): SettingGraph = + SettingGraph(structure, basedir, scoped, 0, maxGraphWidth) def graphSettings(structure: BuildStructure, basedir: File)(implicit display: Show[ScopedKey[_]]): Unit = { def graph(actual: Boolean, name: String) = graphSettings(structure, actual, name, new File(basedir, name + ".dot")) graph(true, "actual_dependencies") diff --git a/main/src/main/scala/sbt/internal/Inspect.scala b/main/src/main/scala/sbt/internal/Inspect.scala index 0d1e9ff6a..98d3759b3 100644 --- a/main/src/main/scala/sbt/internal/Inspect.scala +++ b/main/src/main/scala/sbt/internal/Inspect.scala @@ -47,7 +47,7 @@ object Inspect { Project.details(structure, actual, sk.scope, sk.key) case DependencyTreeMode => val basedir = new File(Project.session(s).current.build) - Project.settingGraph(structure, basedir, sk).dependsAscii + Project.settingGraph(structure, basedir, sk, get(sbt.Keys.asciiGraphWidth)).dependsAscii case UsesMode => Project.showUses(Project.usedBy(structure, true, sk.key)) case DefinitionsMode => diff --git a/main/src/main/scala/sbt/internal/SettingGraph.scala b/main/src/main/scala/sbt/internal/SettingGraph.scala index ec2b62df6..de12baea6 100644 --- a/main/src/main/scala/sbt/internal/SettingGraph.scala +++ b/main/src/main/scala/sbt/internal/SettingGraph.scala @@ -13,7 +13,7 @@ import Predef.{ any2stringadd => _, _ } import sbt.io.IO object SettingGraph { - def apply(structure: BuildStructure, basedir: File, scoped: ScopedKey[_], generation: Int)(implicit display: Show[ScopedKey[_]]): SettingGraph = + def apply(structure: BuildStructure, basedir: File, scoped: ScopedKey[_], generation: Int, graphMaxWidth: Int)(implicit display: Show[ScopedKey[_]]): SettingGraph = { val cMap = flattenLocals(compiled(structure.settings, false)(structure.delegates, structure.scopeLocal, display)) def loop(scoped: ScopedKey[_], generation: Int): SettingGraph = @@ -28,7 +28,8 @@ object SettingGraph { SettingGraph(display(scoped), definedIn, Project.scopedKeyData(structure, scope, key), key.description, basedir, - depends map { (x: ScopedKey[_]) => loop(x, generation + 1) }) + depends map { (x: ScopedKey[_]) => loop(x, generation + 1) }, + graphMaxWidth) } loop(scoped, generation) } @@ -40,7 +41,8 @@ case class SettingGraph( data: Option[ScopedKeyData[_]], description: Option[String], basedir: File, - depends: Set[SettingGraph] + depends: Set[SettingGraph], + graphMaxWidth: Int ) { def dataString: String = data map { d => @@ -53,7 +55,8 @@ case class SettingGraph( def dependsAscii: String = Graph.toAscii( this, (x: SettingGraph) => x.depends.toSeq.sortBy(_.name), - (x: SettingGraph) => "%s = %s" format (x.definedIn getOrElse { "" }, x.dataString) + (x: SettingGraph) => "%s = %s" format (x.definedIn getOrElse { "" }, x.dataString), + graphMaxWidth ) } @@ -63,8 +66,7 @@ object Graph { // [info] | +-baz // [info] | // [info] +-quux - def toAscii[A](top: A, children: A => Seq[A], display: A => String): String = { - val defaultWidth = 40 + def toAscii[A](top: A, children: A => Seq[A], display: A => String, defaultWidth: Int): String = { // TODO: Fix JLine val maxColumn = math.max( /*JLine.usingTerminal(_.getWidth)*/ 0, defaultWidth) - 8 val twoSpaces = " " + " " // prevent accidentally being converted into a tab diff --git a/notes/1.0.0/ascii-graph-width.markdown b/notes/1.0.0/ascii-graph-width.markdown new file mode 100644 index 000000000..341577b3e --- /dev/null +++ b/notes/1.0.0/ascii-graph-width.markdown @@ -0,0 +1,9 @@ +[@RomanIakovlev]: https://github.com/RomanIakovlev + +### Fixes with compatibility implications + +### Improvements + +Add new global setting `asciiGraphWidth` that controls the maximum width of the ASCII graphs printed by commands like `inspect tree`. Default value corresponds to the previously hardcoded value of 40 characters. By [@RomanIakovlev][@RomanIakovlev]. + +### Bug fixes From e8b951c0d1fe2d0aef550173c1be4bd597636246 Mon Sep 17 00:00:00 2001 From: Roman Iakovlev Date: Mon, 30 May 2016 18:33:26 +0200 Subject: [PATCH 2/3] Review comments for https://github.com/sbt/sbt/pull/2633 --- .gitignore | 1 - main/src/main/scala/sbt/Project.scala | 4 ++-- main/src/main/scala/sbt/internal/Inspect.scala | 2 +- main/src/main/scala/sbt/internal/SettingGraph.scala | 12 +++++------- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 03aec7c81..e762de7f9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ target/ __pycache__ -.idea diff --git a/main/src/main/scala/sbt/Project.scala b/main/src/main/scala/sbt/Project.scala index 76323ae27..d1f54a525 100755 --- a/main/src/main/scala/sbt/Project.scala +++ b/main/src/main/scala/sbt/Project.scala @@ -534,8 +534,8 @@ object Project extends ProjectExtra { printScopes("Delegates", delegates(structure, scope, key)) + printScopes("Related", related, 10) } - def settingGraph(structure: BuildStructure, basedir: File, scoped: ScopedKey[_], maxGraphWidth: Int)(implicit display: Show[ScopedKey[_]]): SettingGraph = - SettingGraph(structure, basedir, scoped, 0, maxGraphWidth) + def settingGraph(structure: BuildStructure, basedir: File, scoped: ScopedKey[_])(implicit display: Show[ScopedKey[_]]): SettingGraph = + SettingGraph(structure, basedir, scoped, 0) def graphSettings(structure: BuildStructure, basedir: File)(implicit display: Show[ScopedKey[_]]): Unit = { def graph(actual: Boolean, name: String) = graphSettings(structure, actual, name, new File(basedir, name + ".dot")) graph(true, "actual_dependencies") diff --git a/main/src/main/scala/sbt/internal/Inspect.scala b/main/src/main/scala/sbt/internal/Inspect.scala index 98d3759b3..90cfa5348 100644 --- a/main/src/main/scala/sbt/internal/Inspect.scala +++ b/main/src/main/scala/sbt/internal/Inspect.scala @@ -47,7 +47,7 @@ object Inspect { Project.details(structure, actual, sk.scope, sk.key) case DependencyTreeMode => val basedir = new File(Project.session(s).current.build) - Project.settingGraph(structure, basedir, sk, get(sbt.Keys.asciiGraphWidth)).dependsAscii + Project.settingGraph(structure, basedir, sk).dependsAscii(get(sbt.Keys.asciiGraphWidth)) case UsesMode => Project.showUses(Project.usedBy(structure, true, sk.key)) case DefinitionsMode => diff --git a/main/src/main/scala/sbt/internal/SettingGraph.scala b/main/src/main/scala/sbt/internal/SettingGraph.scala index de12baea6..d181c01d5 100644 --- a/main/src/main/scala/sbt/internal/SettingGraph.scala +++ b/main/src/main/scala/sbt/internal/SettingGraph.scala @@ -13,7 +13,7 @@ import Predef.{ any2stringadd => _, _ } import sbt.io.IO object SettingGraph { - def apply(structure: BuildStructure, basedir: File, scoped: ScopedKey[_], generation: Int, graphMaxWidth: Int)(implicit display: Show[ScopedKey[_]]): SettingGraph = + def apply(structure: BuildStructure, basedir: File, scoped: ScopedKey[_], generation: Int)(implicit display: Show[ScopedKey[_]]): SettingGraph = { val cMap = flattenLocals(compiled(structure.settings, false)(structure.delegates, structure.scopeLocal, display)) def loop(scoped: ScopedKey[_], generation: Int): SettingGraph = @@ -28,8 +28,7 @@ object SettingGraph { SettingGraph(display(scoped), definedIn, Project.scopedKeyData(structure, scope, key), key.description, basedir, - depends map { (x: ScopedKey[_]) => loop(x, generation + 1) }, - graphMaxWidth) + depends map { (x: ScopedKey[_]) => loop(x, generation + 1) }) } loop(scoped, generation) } @@ -41,8 +40,7 @@ case class SettingGraph( data: Option[ScopedKeyData[_]], description: Option[String], basedir: File, - depends: Set[SettingGraph], - graphMaxWidth: Int + depends: Set[SettingGraph] ) { def dataString: String = data map { d => @@ -52,11 +50,11 @@ case class SettingGraph( } getOrElse { d.typeName } } getOrElse { "" } - def dependsAscii: String = Graph.toAscii( + def dependsAscii(defaultWidth: Int): String = Graph.toAscii( this, (x: SettingGraph) => x.depends.toSeq.sortBy(_.name), (x: SettingGraph) => "%s = %s" format (x.definedIn getOrElse { "" }, x.dataString), - graphMaxWidth + defaultWidth ) } From e2c7f58a140fba5f1e55190e10f648e762b70b42 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 22 Jan 2017 13:13:40 -0500 Subject: [PATCH 3/3] Uncomment JLine.usingTerminal --- main/src/main/scala/sbt/internal/SettingGraph.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main/src/main/scala/sbt/internal/SettingGraph.scala b/main/src/main/scala/sbt/internal/SettingGraph.scala index d181c01d5..dfd0e2ec3 100644 --- a/main/src/main/scala/sbt/internal/SettingGraph.scala +++ b/main/src/main/scala/sbt/internal/SettingGraph.scala @@ -4,7 +4,7 @@ package sbt package internal -import sbt.internal.util.Show +import sbt.internal.util.{ Show, JLine } import java.io.File import Def.{ compiled, flattenLocals, ScopedKey } @@ -65,8 +65,7 @@ object Graph { // [info] | // [info] +-quux def toAscii[A](top: A, children: A => Seq[A], display: A => String, defaultWidth: Int): String = { - // TODO: Fix JLine - val maxColumn = math.max( /*JLine.usingTerminal(_.getWidth)*/ 0, defaultWidth) - 8 + val maxColumn = math.max(JLine.usingTerminal(_.getWidth), defaultWidth) - 8 val twoSpaces = " " + " " // prevent accidentally being converted into a tab def limitLine(s: String): String = if (s.length > maxColumn) s.slice(0, maxColumn - 2) + ".."