Use -Dsbt.script to start sbt server

In order to start the sbt server we must use the sbt script because
it is the only way to load the .sbtopts and the .jvmopts file properly.

To do so the sbt script can pass a -Dsbt.script prop to the java server.
It is used in the NetworkClient to start the server, and it is replicated
in the BuildServerConnection file (.bsp/sbt.json).
This commit is contained in:
Adrien Piquerez
2021-07-12 14:20:17 +02:00
parent 5f4798fa76
commit c9ca2d4afa
3 changed files with 61 additions and 25 deletions
@@ -1045,7 +1045,8 @@ object NetworkClient {
private[client] val noStdErr = "--no-stderr"
private[client] val sbtBase = "--sbt-base-directory"
private[client] def parseArgs(args: Array[String]): Arguments = {
var sbtScript = if (Properties.isWin) "sbt.bat" else "sbt"
val defaultSbtScript = if (Properties.isWin) "sbt.bat" else "sbt"
var sbtScript = Properties.propOrNone("sbt.script")
var launchJar: Option[String] = None
var bsp = false
val commandArgs = new mutable.ArrayBuffer[String]
@@ -1067,11 +1068,10 @@ object NetworkClient {
sbtScript = a
.split("--sbt-script=")
.lastOption
.map(_.replaceAllLiterally("%20", " "))
.getOrElse(sbtScript)
.orElse(sbtScript)
case "--sbt-script" if i + 1 < sanitized.length =>
i += 1
sbtScript = sanitized(i).replaceAllLiterally("%20", " ")
sbtScript = Some(sanitized(i))
case a if a.startsWith("--sbt-launch-jar=") =>
launchJar = a
.split("--sbt-launch-jar=")
@@ -1091,12 +1091,17 @@ object NetworkClient {
}
val base = new File("").getCanonicalFile
if (!sbtArguments.contains("-Dsbt.io.virtual=true")) sbtArguments += "-Dsbt.io.virtual=true"
if (!sbtArguments.exists(_.startsWith("-Dsbt.script"))) {
sbtScript.foreach { sbtScript =>
sbtArguments += s"-Dsbt.script=$sbtScript"
}
}
new Arguments(
base,
sbtArguments.toSeq,
commandArgs.toSeq,
completionArguments.toSeq,
sbtScript,
sbtScript.getOrElse(defaultSbtScript).replaceAllLiterally("%20", " "),
bsp,
launchJar
)