From 63cd8f53c6a11c16ed9eadfc2e5f3ba76710f559 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Mon, 22 Jun 2020 12:56:14 -0700 Subject: [PATCH 1/3] Use real paths for zinc base path The AppConfiguration.baseDirectory is dealiased during project loading. Not dealiasing the symlink here could cause a discrepancy between the `baseDirectory` key and the value of the base key in the root paths map. --- main/src/main/scala/sbt/Defaults.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index d52fe15c3..79810a9fe 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -191,7 +191,7 @@ object Defaults extends BuildCommon { allowMachinePath :== true, rootPaths := { val app = appConfiguration.value - val base = app.baseDirectory + val base = app.baseDirectory.getCanonicalFile val boot = app.provider.scalaProvider.launcher.bootDirectory val ih = app.provider.scalaProvider.launcher.ivyHome val coursierCache = csrCacheDirectory.value From 95221ed837d062088409145cc4f72673c32546f3 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Mon, 22 Jun 2020 13:03:14 -0700 Subject: [PATCH 2/3] Remove dead external hooks code These settings were only used by the external hooks implementation that was removed. --- main/src/main/scala/sbt/Defaults.scala | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 79810a9fe..1b9308a98 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -72,7 +72,6 @@ import sbt.librarymanagement.CrossVersion.{ binarySbtVersion, binaryScalaVersion import sbt.librarymanagement._ import sbt.librarymanagement.ivy._ import sbt.librarymanagement.syntax._ -import sbt.nio.FileStamp.Formats.seqPathFileStampJsonFormatter import sbt.nio.Keys._ import sbt.nio.file.syntax._ import sbt.nio.file.{ FileTreeView, Glob, RecursiveGlob } @@ -688,27 +687,6 @@ object Defaults extends BuildCommon { }, */ externalHooks := IncOptions.defaultExternal, - compileSourceFileInputs := { - import sjsonnew.BasicJsonProtocol.mapFormat - compile.value // ensures the inputFileStamps previous value is only set if compile succeeds. - val version = scalaVersion.value - val versions = crossScalaVersions.value.toSet + version - val prev: Map[String, Seq[(java.nio.file.Path, sbt.nio.FileStamp)]] = - compileSourceFileInputs.previous.map(_.filterKeys(versions)).getOrElse(Map.empty) - prev + (version -> - ((unmanagedSources / inputFileStamps).value ++ (managedSourcePaths / outputFileStamps).value)) - }, - compileSourceFileInputs := compileSourceFileInputs.triggeredBy(compile).value, - compileBinaryFileInputs := { - import sjsonnew.BasicJsonProtocol.mapFormat - compile.value // ensures the inputFileStamps previous value is only set if compile succeeds. - val version = scalaVersion.value - val versions = crossScalaVersions.value.toSet + version - val prev: Map[String, Seq[(java.nio.file.Path, sbt.nio.FileStamp)]] = - compileBinaryFileInputs.previous.map(_.filterKeys(versions)).getOrElse(Map.empty) - prev + (version -> (dependencyClasspathFiles / outputFileStamps).value) - }, - compileBinaryFileInputs := compileBinaryFileInputs.triggeredBy(compile).value, incOptions := { val old = incOptions.value old From 3c51f0187297377402e699130f141a898c11c1d9 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Tue, 23 Jun 2020 12:52:20 -0700 Subject: [PATCH 3/3] Dealias baseDirectory in AppConfiguration In Load.scala and Defaults.scala, the AppConfiguration.baseDirectory is dealiased when it is a symlink. This commit dealiases the AppConfiguration.baseDirectory if it is a symlink so that sbt `appConfiguration.value.baseDirectory` should be the same as `baseDirectory.value`. --- main/src/main/scala/sbt/Main.scala | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/main/src/main/scala/sbt/Main.scala b/main/src/main/scala/sbt/Main.scala index f796b16af..94d88f3b1 100644 --- a/main/src/main/scala/sbt/Main.scala +++ b/main/src/main/scala/sbt/Main.scala @@ -33,6 +33,7 @@ import xsbti.compile.CompilerCache import scala.annotation.tailrec import scala.concurrent.ExecutionContext import scala.util.control.NonFatal +import xsbti.AppProvider /** This class is the entry point for sbt. */ final class xMain extends xsbti.AppMain { @@ -40,6 +41,16 @@ final class xMain extends xsbti.AppMain { new XMainConfiguration().run("xMain", configuration) } private[sbt] object xMain { + private[sbt] def dealiasBaseDirectory(config: xsbti.AppConfiguration): xsbti.AppConfiguration = { + val dealiasedBase = config.baseDirectory.getCanonicalFile + if (config.baseDirectory == dealiasedBase) config + else + new xsbti.AppConfiguration { + override def arguments: Array[String] = config.arguments() + override val baseDirectory: File = dealiasedBase + override def provider: AppProvider = config.provider() + } + } private[sbt] def run(configuration: xsbti.AppConfiguration): xsbti.MainResult = try { import BasicCommandStrings.{ DashClient, DashDashClient, runEarly } @@ -54,16 +65,16 @@ private[sbt] object xMain { val isClient: String => Boolean = cmd => (cmd == DashClient) || (cmd == DashDashClient) val isBsp: String => Boolean = cmd => (cmd == "-bsp") || (cmd == "--bsp") if (userCommands.exists(isBsp)) { - BspClient.run(configuration) + BspClient.run(dealiasBaseDirectory(configuration)) } else { Terminal.withStreams { if (clientModByEnv || userCommands.exists(isClient)) { val args = userCommands.toList.filterNot(isClient) - NetworkClient.run(configuration, args) + NetworkClient.run(dealiasBaseDirectory(configuration), args) Exit(0) } else { val state = StandardMain.initialState( - configuration, + dealiasBaseDirectory(configuration), Seq(defaults, early), runEarly(DefaultsCommand) :: runEarly(InitCommand) :: BootCommand :: Nil ) @@ -84,7 +95,7 @@ private[sbt] object ScriptMain { private[sbt] def run(configuration: xsbti.AppConfiguration): xsbti.MainResult = { import BasicCommandStrings.runEarly val state = StandardMain.initialState( - configuration, + xMain.dealiasBaseDirectory(configuration), BuiltinCommands.ScriptCommands, runEarly(Level.Error.toString) :: Script.Name :: Nil ) @@ -99,7 +110,7 @@ final class ConsoleMain extends xsbti.AppMain { private[sbt] object ConsoleMain { private[sbt] def run(configuration: xsbti.AppConfiguration): xsbti.MainResult = { val state = StandardMain.initialState( - configuration, + xMain.dealiasBaseDirectory(configuration), BuiltinCommands.ConsoleCommands, IvyConsole.Name :: Nil )