Skip to content

Commit 04992d3

Browse files
committed
Fix scala runner launcher options not being respected alongside --cli-version
1 parent 4097761 commit 04992d3

File tree

6 files changed

+77
-43
lines changed

6 files changed

+77
-43
lines changed

modules/cli/src/main/scala/scala/cli/ScalaCli.scala

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ object ScalaCli {
5959

6060
def launcherOptions: LauncherOptions = maybeLauncherOptions.getOrElse(LauncherOptions())
6161
def getDefaultScalaVersion: String =
62-
launcherOptions.cliUserScalaVersion.getOrElse(Constants.defaultScalaVersion)
62+
launcherOptions.scalaRunner.cliUserScalaVersion.getOrElse(Constants.defaultScalaVersion)
6363

6464
private def partitionArgs(args: Array[String]): (Array[String], Array[String]) = {
6565
val systemProps = args.takeWhile(_.startsWith("-D"))
@@ -236,19 +236,17 @@ object ScalaCli {
236236
maybeLauncherOptions = Some(launcherOpts)
237237
launcherOpts.cliVersion.map(_.trim).filter(_.nonEmpty) match {
238238
case Some(ver) =>
239-
val powerArgs =
240-
if (launcherOpts.powerOptions.power) Seq("--power")
241-
else Nil
242-
val newArgs = powerArgs ++ args0
239+
val powerArgs = launcherOpts.powerOptions.toCliArgs
240+
val scalaRunnerArgs = launcherOpts.scalaRunner.toCliArgs
241+
val newArgs = powerArgs ++ scalaRunnerArgs ++ args0
243242
LauncherCli.runAndExit(ver, launcherOpts, newArgs)
244243
case _ if
245244
javaMajorVersion < 17
246245
&& sys.props.get("scala-cli.kind").exists(_.startsWith("jvm")) =>
247246
JavaLauncherCli.runAndExit(args)
248247
case None =>
249-
launcherOpts.progName.foreach { pn =>
250-
progName = pn
251-
}
248+
launcherOpts.scalaRunner.progName
249+
.foreach(pn => progName = pn)
252250
if launcherOpts.powerOptions.power then
253251
isSipScala = false
254252
args0.toArray

modules/cli/src/main/scala/scala/cli/commands/bsp/Bsp.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,10 +198,10 @@ object Bsp extends ScalaCommand[BspOptions] {
198198
val withLauncherOptions = withEnvs.copy(
199199
classPathOptions = withEnvs.classPathOptions.copy(
200200
extraRepositories =
201-
(withEnvs.classPathOptions.extraRepositories ++ launcherOptions.cliPredefinedRepository).distinct
201+
(withEnvs.classPathOptions.extraRepositories ++ launcherOptions.scalaRunner.cliPredefinedRepository).distinct
202202
),
203203
scalaOptions = withEnvs.scalaOptions.copy(
204-
defaultScalaVersion = launcherOptions.cliUserScalaVersion
204+
defaultScalaVersion = launcherOptions.scalaRunner.cliUserScalaVersion
205205
)
206206
)
207207
withLauncherOptions

modules/cli/src/main/scala/scala/cli/commands/shared/SharedOptions.scala

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -407,11 +407,9 @@ final case class SharedOptions(
407407
extraCompileOnlyJars = extraCompileOnlyClassPath,
408408
extraSourceJars = extraSourceJars.extractedClassPath ++ assumedSourceJars,
409409
extraRepositories =
410-
(dependencies.repository ++ ScalaCli.launcherOptions.cliPredefinedRepository).map(
411-
_.trim
412-
).filter(
413-
_.nonEmpty
414-
),
410+
(dependencies.repository ++ ScalaCli.launcherOptions.scalaRunner.cliPredefinedRepository)
411+
.map(_.trim)
412+
.filter(_.nonEmpty),
415413
extraDependencies = ShadowingSeq.from(
416414
SharedOptions.parseDependencies(
417415
dependencies.dependency.map(Positioned.none),

modules/cli/src/main/scala/scala/cli/launcher/LauncherOptions.scala

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,40 +21,15 @@ final case class LauncherOptions(
2121
@Hidden
2222
@Tag(tags.implementation)
2323
cliScalaVersion: Option[String] = None,
24-
@Group(HelpGroup.Launcher.toString)
25-
@HelpMessage(
26-
s"The default version of Scala used when processing user inputs (current default: ${Constants.defaultScalaVersion}). Can be overridden with --scala-version. "
27-
)
28-
@ValueDescription("version")
29-
@Hidden
30-
@Tag(tags.implementation)
31-
@Name("cliDefaultScalaVersion")
32-
cliUserScalaVersion: Option[String] = None,
33-
@Group(HelpGroup.Launcher.toString)
34-
@HelpMessage("")
35-
@Hidden
36-
@Tag(tags.implementation)
37-
@Name("r")
38-
@Name("repo")
39-
@Name("repository")
40-
@Name("predefinedRepository")
41-
cliPredefinedRepository: List[String] = Nil,
42-
@Group(HelpGroup.Launcher.toString)
43-
@HelpMessage(
44-
"This allows to override the program name identified by Scala CLI as itself (the default is 'scala-cli')"
45-
)
46-
@Hidden
47-
@Tag(tags.implementation)
48-
progName: Option[String] = None,
24+
@Recurse
25+
scalaRunner: ScalaRunnerLauncherOptions = ScalaRunnerLauncherOptions(),
4926
@Recurse
5027
powerOptions: PowerOptions = PowerOptions()
5128
) {
5229
def toCliArgs: List[String] =
5330
cliVersion.toList.flatMap(v => List("--cli-version", v)) ++
5431
cliScalaVersion.toList.flatMap(v => List("--cli-scala-version", v)) ++
55-
cliUserScalaVersion.toList.flatMap(v => List("--cli-default-scala-version", v)) ++
56-
cliPredefinedRepository.flatMap(v => List("--cli-predefined-repository", v)) ++
57-
progName.toList.flatMap(v => List("--prog-name", v)) ++
32+
scalaRunner.toCliArgs ++
5833
powerOptions.toCliArgs
5934
}
6035

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package scala.cli.launcher
2+
3+
import caseapp.*
4+
import com.github.plokhotnyuk.jsoniter_scala.core.JsonValueCodec
5+
import com.github.plokhotnyuk.jsoniter_scala.macros.JsonCodecMaker
6+
7+
import scala.cli.commands.shared.{HelpGroup, SharedOptions}
8+
import scala.cli.commands.{Constants, tags}
9+
10+
case class ScalaRunnerLauncherOptions(
11+
@Group(HelpGroup.Launcher.toString)
12+
@HelpMessage(
13+
s"The default version of Scala used when processing user inputs (current default: ${Constants.defaultScalaVersion}). Can be overridden with --scala-version. "
14+
)
15+
@ValueDescription("version")
16+
@Hidden
17+
@Tag(tags.implementation)
18+
@Name("cliDefaultScalaVersion")
19+
cliUserScalaVersion: Option[String] = None,
20+
@Group(HelpGroup.Launcher.toString)
21+
@HelpMessage("")
22+
@Hidden
23+
@Tag(tags.implementation)
24+
@Name("r")
25+
@Name("repo")
26+
@Name("repository")
27+
@Name("predefinedRepository")
28+
cliPredefinedRepository: List[String] = Nil,
29+
@Group(HelpGroup.Launcher.toString)
30+
@HelpMessage(
31+
"This allows to override the program name identified by Scala CLI as itself (the default is 'scala-cli')"
32+
)
33+
@Hidden
34+
@Tag(tags.implementation)
35+
progName: Option[String] = None
36+
) {
37+
def toCliArgs: List[String] =
38+
cliUserScalaVersion.toList.flatMap(v => List("--cli-default-scala-version", v)) ++
39+
cliPredefinedRepository.flatMap(v => List("--repository", v)) ++
40+
progName.toList.flatMap(v => List("--prog-name", v))
41+
}
42+
43+
object ScalaRunnerLauncherOptions {
44+
implicit val parser: Parser[ScalaRunnerLauncherOptions] = Parser.derive
45+
implicit val help: Help[ScalaRunnerLauncherOptions] = Help.derive
46+
}

modules/integration/src/test/scala/scala/cli/integration/SipScalaTests.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,4 +808,21 @@ class SipScalaTests extends ScalaCliSuite with SbtTestHelper with MillTestHelper
808808
expect(!res.err.trim().contains("TASTY"))
809809
}
810810
}
811+
812+
test("--cli-version and --cli-default-scala-version can be passed in tandem") {
813+
TestInputs.empty.fromRoot { root =>
814+
val cliVersion = "1.3.1"
815+
val scalaVersion = "3.5.1-RC1-bin-20240522-e0c030c-NIGHTLY"
816+
val res = os.proc(
817+
TestUtil.cli,
818+
"--cli-version",
819+
cliVersion,
820+
"--cli-default-scala-version",
821+
scalaVersion,
822+
"version"
823+
).call(cwd = root)
824+
expect(res.out.trim().contains(cliVersion))
825+
expect(res.out.trim().contains(scalaVersion))
826+
}
827+
}
811828
}

0 commit comments

Comments
 (0)