From 387674a45145e9d2a920f777dda7b2246ad6aaa4 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Wed, 6 Jul 2016 13:45:57 +0100 Subject: [PATCH] Remove some heads and tails --- main-command/src/main/scala/sbt/State.scala | 2 +- .../main/scala/sbt/internal/BuildStructure.scala | 6 ++++-- main/src/main/scala/sbt/internal/Load.scala | 7 +++++-- .../main/scala/sbt/internal/SettingGraph.scala | 16 +++++++++------- main/src/test/scala/sbt/internal/TestBuild.scala | 2 +- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/main-command/src/main/scala/sbt/State.scala b/main-command/src/main/scala/sbt/State.scala index 50aa80831..f4b4041cf 100644 --- a/main-command/src/main/scala/sbt/State.scala +++ b/main-command/src/main/scala/sbt/State.scala @@ -166,7 +166,7 @@ object State { /** Changes the maximum number of commands kept, adjusting the current history if necessary.*/ def setMaxSize(size: Int): History = new History(if (size <= 0) executed else executed.take(size), size) - def current: String = executed.head + def currentOption: Option[String] = executed.headOption def previous: Option[String] = executed.drop(1).headOption } /** Constructs an empty command History with a default, finite command limit.*/ diff --git a/main/src/main/scala/sbt/internal/BuildStructure.scala b/main/src/main/scala/sbt/internal/BuildStructure.scala index 1e83322fa..31f89725f 100644 --- a/main/src/main/scala/sbt/internal/BuildStructure.scala +++ b/main/src/main/scala/sbt/internal/BuildStructure.scala @@ -41,12 +41,14 @@ final class StructureIndex( * The first root project is used as the default in several situations where a project is not otherwise selected. */ final class LoadedBuildUnit(val unit: BuildUnit, val defined: Map[String, ResolvedProject], val rootProjects: Seq[String], val buildSettings: Seq[Setting[_]]) extends BuildUnitBase { - assert(rootProjects.nonEmpty, "No root projects defined for build unit " + unit) /** * The project to use as the default when one is not otherwise selected. * [[LocalRootProject]] resolves to this from within the same build. */ - val root = rootProjects.head + val root = rootProjects match { + case Nil => throw new java.lang.AssertionError("assertion failed: No root projects defined for build unit " + unit) + case Seq(root, _*) => root + } /** The base directory of the build unit (not the build definition).*/ def localBase = unit.localBase diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index 99e14e78f..cce1dbf31 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -312,7 +312,10 @@ private[sbt] object Load { def loaded(unit: BuildUnit): (PartBuildUnit, List[ProjectReference]) = { val defined = projects(unit) - if (defined.isEmpty) sys.error("No projects defined in build unit " + unit) + val firstDefined = defined match { + case Nil => sys.error("No projects defined in build unit " + unit) + case Seq(first, _*) => first + } // since base directories are resolved at this point (after 'projects'), // we can compare Files instead of converting to URIs @@ -321,7 +324,7 @@ private[sbt] object Load { val externals = referenced(defined).toList val explicitRoots = unit.definitions.builds.flatMap(_.rootProject) val projectsInRoot = if (explicitRoots.isEmpty) defined.filter(isRoot) else explicitRoots - val rootProjects = if (projectsInRoot.isEmpty) defined.head :: Nil else projectsInRoot + val rootProjects = if (projectsInRoot.isEmpty) firstDefined :: Nil else projectsInRoot (new PartBuildUnit(unit, defined.map(d => (d.id, d)).toMap, rootProjects.map(_.id), buildSettings(unit)), externals) } def buildSettings(unit: BuildUnit): Seq[Setting[_]] = diff --git a/main/src/main/scala/sbt/internal/SettingGraph.scala b/main/src/main/scala/sbt/internal/SettingGraph.scala index bdce207a5..561e60150 100644 --- a/main/src/main/scala/sbt/internal/SettingGraph.scala +++ b/main/src/main/scala/sbt/internal/SettingGraph.scala @@ -77,19 +77,21 @@ object Graph { }) + s.slice(at + 1, s.length) else s - def toAsciiLines(node: A, level: Int): Vector[String] = { + def toAsciiLines(node: A, level: Int): (String, Vector[String]) = { val line = limitLine((twoSpaces * level) + (if (level == 0) "" else "+-") + display(node)) val cs = Vector(children(node): _*) val childLines = cs map { toAsciiLines(_, level + 1) } val withBar = childLines.zipWithIndex flatMap { - case (lines, pos) if pos < (cs.size - 1) => lines map { insertBar(_, 2 * (level + 1)) } - case (lines, pos) => - if (lines.last.trim != "") lines ++ Vector(twoSpaces * (level + 1)) - else lines + case ((line, withBar), pos) if pos < (cs.size - 1) => + (line +: withBar) map { insertBar(_, 2 * (level + 1)) } + case ((line, withBar), pos) if withBar.lastOption.getOrElse(line).trim != "" => + (line +: withBar) ++ Vector(twoSpaces * (level + 1)) + case ((line, withBar), _) => line +: withBar } - line +: withBar + (line, withBar) } - toAsciiLines(top, 0).mkString("\n") + val (line, withBar) = toAsciiLines(top, 0) + (line +: withBar).mkString("\n") } } diff --git a/main/src/test/scala/sbt/internal/TestBuild.scala b/main/src/test/scala/sbt/internal/TestBuild.scala index f7720f873..059a2ad88 100644 --- a/main/src/test/scala/sbt/internal/TestBuild.scala +++ b/main/src/test/scala/sbt/internal/TestBuild.scala @@ -99,7 +99,7 @@ object TestBuild { def inheritConfig(ref: ResolvedReference, config: ConfigKey) = projectFor(ref).confMap(config.name).extended map toConfigKey def inheritTask(task: AttributeKey[_]) = taskMap.get(task) match { case None => Nil; case Some(t) => t.delegates map getKey } def inheritProject(ref: ProjectRef) = project(ref).delegates - def resolve(ref: Reference) = Scope.resolveReference(builds.head.uri, rootProject, ref) + def resolve(ref: Reference) = Scope.resolveReference(root.uri, rootProject, ref) lazy val delegates: Scope => Seq[Scope] = Scope.delegates( allProjects,