From 69ae4f3073f762df53793228492474d43f56cee3 Mon Sep 17 00:00:00 2001 From: Roman Iakovlev Date: Thu, 26 Oct 2017 19:05:04 +0200 Subject: [PATCH] Add a check for a change in SBT version before reload Fixes #1055 --- main/src/main/scala/sbt/Main.scala | 22 ++++++++++++++++++- .../project/sbt-version-change/build.sbt | 8 +++++++ .../changes/build.properties | 1 + .../sbt-test/project/sbt-version-change/test | 4 ++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 sbt/src/sbt-test/project/sbt-version-change/build.sbt create mode 100644 sbt/src/sbt-test/project/sbt-version-change/changes/build.properties create mode 100644 sbt/src/sbt-test/project/sbt-version-change/test diff --git a/main/src/main/scala/sbt/Main.scala b/main/src/main/scala/sbt/Main.scala index f8faddff8..61fe64cd0 100644 --- a/main/src/main/scala/sbt/Main.scala +++ b/main/src/main/scala/sbt/Main.scala @@ -56,7 +56,8 @@ import StandardMain._ import java.io.{ File, IOException } import java.net.URI -import java.util.Locale +import java.util.{ Locale, Properties } + import scala.util.control.NonFatal import BasicCommandStrings.{ Shell, TemplateCommand } import CommandStrings.BootCommand @@ -672,7 +673,26 @@ object BuiltinCommands { def loadProjectImpl: Command = Command(LoadProjectImpl)(_ => Project.loadActionParser)(doLoadProject) + def checkSBTVersionChanged(state: State): Unit = { + import sbt.io.syntax._ + val app = state.configuration.provider + val buildProps = state.baseDir / "project" / "build.properties" + // First try reading the sbt version from build.properties file. + val sbtVersionOpt = if (buildProps.exists) { + val buildProperties = new Properties() + IO.load(buildProperties, buildProps) + Option(buildProperties.getProperty("sbt.version")) + } else None + + sbtVersionOpt.foreach(version => + if (version != app.id.version()) { + state.log.warn(s"""sbt version mismatch, current: ${app.id + .version()}, in build.properties: "$version", use 'reboot' to use the new value.""") + }) + } + def doLoadProject(s0: State, action: LoadAction.Value): State = { + checkSBTVersionChanged(s0) val (s1, base) = Project.loadAction(SessionVar.clear(s0), action) IO.createDirectory(base) val s = if (s1 has Keys.stateCompilerCache) s1 else registerCompilerCache(s1) diff --git a/sbt/src/sbt-test/project/sbt-version-change/build.sbt b/sbt/src/sbt-test/project/sbt-version-change/build.sbt new file mode 100644 index 000000000..8bc0b3ddf --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-version-change/build.sbt @@ -0,0 +1,8 @@ +TaskKey[Unit]("checkSbtVersionWarning") := { + val state = Keys.state.value + val logging = state.globalLogging + val currVersion = state.configuration.provider.id.version() + val contents = IO.read(logging.backing.file) + assert(contents.contains(s"""sbt version mismatch, current: $currVersion, in build.properties: "1.1.1", use 'reboot' to use the new value.""")) + () +} \ No newline at end of file diff --git a/sbt/src/sbt-test/project/sbt-version-change/changes/build.properties b/sbt/src/sbt-test/project/sbt-version-change/changes/build.properties new file mode 100644 index 000000000..9f782f704 --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-version-change/changes/build.properties @@ -0,0 +1 @@ +sbt.version=1.1.1 \ No newline at end of file diff --git a/sbt/src/sbt-test/project/sbt-version-change/test b/sbt/src/sbt-test/project/sbt-version-change/test new file mode 100644 index 000000000..b46c8dd3c --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-version-change/test @@ -0,0 +1,4 @@ +> help +$ copy-file changes/build.properties project/build.properties +> reload +> checkSbtVersionWarning