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`.
This commit is contained in:
Ethan Atkins 2020-06-23 12:52:20 -07:00
parent 95221ed837
commit 3c51f01872
1 changed files with 16 additions and 5 deletions

View File

@ -33,6 +33,7 @@ import xsbti.compile.CompilerCache
import scala.annotation.tailrec import scala.annotation.tailrec
import scala.concurrent.ExecutionContext import scala.concurrent.ExecutionContext
import scala.util.control.NonFatal import scala.util.control.NonFatal
import xsbti.AppProvider
/** This class is the entry point for sbt. */ /** This class is the entry point for sbt. */
final class xMain extends xsbti.AppMain { final class xMain extends xsbti.AppMain {
@ -40,6 +41,16 @@ final class xMain extends xsbti.AppMain {
new XMainConfiguration().run("xMain", configuration) new XMainConfiguration().run("xMain", configuration)
} }
private[sbt] object xMain { 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 = private[sbt] def run(configuration: xsbti.AppConfiguration): xsbti.MainResult =
try { try {
import BasicCommandStrings.{ DashClient, DashDashClient, runEarly } import BasicCommandStrings.{ DashClient, DashDashClient, runEarly }
@ -54,16 +65,16 @@ private[sbt] object xMain {
val isClient: String => Boolean = cmd => (cmd == DashClient) || (cmd == DashDashClient) val isClient: String => Boolean = cmd => (cmd == DashClient) || (cmd == DashDashClient)
val isBsp: String => Boolean = cmd => (cmd == "-bsp") || (cmd == "--bsp") val isBsp: String => Boolean = cmd => (cmd == "-bsp") || (cmd == "--bsp")
if (userCommands.exists(isBsp)) { if (userCommands.exists(isBsp)) {
BspClient.run(configuration) BspClient.run(dealiasBaseDirectory(configuration))
} else { } else {
Terminal.withStreams { Terminal.withStreams {
if (clientModByEnv || userCommands.exists(isClient)) { if (clientModByEnv || userCommands.exists(isClient)) {
val args = userCommands.toList.filterNot(isClient) val args = userCommands.toList.filterNot(isClient)
NetworkClient.run(configuration, args) NetworkClient.run(dealiasBaseDirectory(configuration), args)
Exit(0) Exit(0)
} else { } else {
val state = StandardMain.initialState( val state = StandardMain.initialState(
configuration, dealiasBaseDirectory(configuration),
Seq(defaults, early), Seq(defaults, early),
runEarly(DefaultsCommand) :: runEarly(InitCommand) :: BootCommand :: Nil runEarly(DefaultsCommand) :: runEarly(InitCommand) :: BootCommand :: Nil
) )
@ -84,7 +95,7 @@ private[sbt] object ScriptMain {
private[sbt] def run(configuration: xsbti.AppConfiguration): xsbti.MainResult = { private[sbt] def run(configuration: xsbti.AppConfiguration): xsbti.MainResult = {
import BasicCommandStrings.runEarly import BasicCommandStrings.runEarly
val state = StandardMain.initialState( val state = StandardMain.initialState(
configuration, xMain.dealiasBaseDirectory(configuration),
BuiltinCommands.ScriptCommands, BuiltinCommands.ScriptCommands,
runEarly(Level.Error.toString) :: Script.Name :: Nil runEarly(Level.Error.toString) :: Script.Name :: Nil
) )
@ -99,7 +110,7 @@ final class ConsoleMain extends xsbti.AppMain {
private[sbt] object ConsoleMain { private[sbt] object ConsoleMain {
private[sbt] def run(configuration: xsbti.AppConfiguration): xsbti.MainResult = { private[sbt] def run(configuration: xsbti.AppConfiguration): xsbti.MainResult = {
val state = StandardMain.initialState( val state = StandardMain.initialState(
configuration, xMain.dealiasBaseDirectory(configuration),
BuiltinCommands.ConsoleCommands, BuiltinCommands.ConsoleCommands,
IvyConsole.Name :: Nil IvyConsole.Name :: Nil
) )