Skip to content

Commit 7979e36

Browse files
authored
Enable to force using jvm signing launcher for native launcher of scala-cli (#1597)
1 parent 1be0e6d commit 7979e36

File tree

21 files changed

+271
-92
lines changed

21 files changed

+271
-92
lines changed

modules/cli/src/main/scala/scala/cli/commands/config/Config.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import java.util.Base64
88
import scala.build.Logger
99
import scala.build.Ops.*
1010
import scala.build.errors.{BuildException, CompositeBuildException, MalformedCliInputError}
11+
import scala.cli.commands.pgp.PgpScalaSigningOptions
1112
import scala.cli.commands.publish.ConfigUtil.*
1213
import scala.cli.commands.util.JvmUtils
1314
import scala.cli.commands.{ScalaCommand, SpecificationLevel}
@@ -75,7 +76,8 @@ object Config extends ScalaCommand[ConfigOptions] {
7576
ArchiveCache().withCache(coursierCache),
7677
coursierCache,
7778
logger.verbosity
78-
).value.javaCommand
79+
).value.javaCommand,
80+
options.scalaSigning.cliOptions()
7981
).orExit(logger)
8082
val pgpSecretBase64 = pgpSecret0.map(Base64.getEncoder.encodeToString)
8183

modules/cli/src/main/scala/scala/cli/commands/config/ConfigOptions.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package scala.cli.commands.config
22

33
import caseapp.*
44

5+
import scala.cli.commands.pgp.PgpScalaSigningOptions
56
import scala.cli.commands.shared.{
67
CoursierOptions,
78
HasLoggingOptions,
@@ -20,7 +21,8 @@ final case class ConfigOptions(
2021
coursier: CoursierOptions = CoursierOptions(),
2122
@Recurse
2223
jvm: SharedJvmOptions = SharedJvmOptions(),
23-
24+
@Recurse
25+
scalaSigning: PgpScalaSigningOptions = PgpScalaSigningOptions(),
2426
@Group("Config")
2527
@HelpMessage("Dump config DB as JSON")
2628
@Hidden

modules/cli/src/main/scala/scala/cli/commands/config/ThrowawayPgpSecret.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package scala.cli.commands.config
22

3-
import coursier.cache.Cache
3+
import coursier.cache.{Cache, FileCache}
44
import coursier.util.Task
55

66
import java.security.SecureRandom
77

88
import scala.build.EitherCps.{either, value}
9-
import scala.build.Logger
109
import scala.build.errors.BuildException
11-
import scala.cli.commands.pgp.PgpProxyMaker
10+
import scala.build.{Logger, options => bo}
11+
import scala.cli.commands.pgp.{PgpProxyMaker, PgpScalaSigningOptions}
1212
import scala.cli.errors.PgpError
1313
import scala.cli.signing.shared.Secret
1414
import scala.util.Properties
@@ -32,8 +32,9 @@ object ThrowawayPgpSecret {
3232
mail: String,
3333
password: Secret[String],
3434
logger: Logger,
35-
cache: Cache[Task],
36-
javaCommand: () => String
35+
cache: FileCache[Task],
36+
javaCommand: () => String,
37+
signingCliOptions: bo.ScalaSigningCliOptions
3738
): Either[BuildException, (Secret[String], Secret[Array[Byte]])] = either {
3839

3940
val dir = os.temp.dir(perms = if (Properties.isWin) null else "rwx------")
@@ -48,7 +49,8 @@ object ThrowawayPgpSecret {
4849
password.value,
4950
cache,
5051
logger,
51-
javaCommand
52+
javaCommand,
53+
signingCliOptions
5254
)
5355
}
5456

Lines changed: 97 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
package scala.cli.commands.pgp
22

3-
import coursier.cache.{ArchiveCache, Cache}
3+
import coursier.Repositories
4+
import coursier.cache.{ArchiveCache, Cache, FileCache}
5+
import coursier.core.Version
46
import coursier.util.Task
57
import dependency._
68

9+
import java.io.File
10+
711
import scala.build.EitherCps.{either, value}
8-
import scala.build.Logger
9-
import scala.build.errors.BuildException
12+
import scala.build.errors.{BuildException, ScalaJsLinkingError}
13+
import scala.build.internal.Util.{DependencyOps, ModuleOps}
1014
import scala.build.internal.{
1115
Constants,
1216
ExternalBinary,
1317
ExternalBinaryParams,
1418
FetchExternalBinary,
15-
Runner
19+
Runner,
20+
ScalaJsLinkerConfig
1621
}
22+
import scala.build.options.scalajs.ScalaJsLinkerOptions
23+
import scala.build.{Logger, Positioned, options => bo}
1724
import scala.cli.ScalaCli
1825
import scala.cli.commands.util.JvmUtils
1926
import scala.util.Properties
@@ -23,20 +30,26 @@ abstract class PgpExternalCommand extends ExternalCommand {
2330
def externalCommand: Seq[String]
2431

2532
def tryRun(
26-
cache: Cache[Task],
27-
versionOpt: Option[String],
33+
cache: FileCache[Task],
2834
args: Seq[String],
2935
extraEnv: Map[String, String],
3036
logger: Logger,
3137
allowExecve: Boolean,
32-
javaCommand: () => String
38+
javaCommand: () => String,
39+
signingCliOptions: bo.ScalaSigningCliOptions
3340
): Either[BuildException, Int] = either {
3441

3542
val archiveCache = ArchiveCache().withCache(cache)
3643

37-
val binary = value(PgpExternalCommand.launcher(archiveCache, versionOpt, logger, javaCommand))
44+
val binary = value(PgpExternalCommand.launcher(
45+
cache,
46+
archiveCache,
47+
logger,
48+
javaCommand,
49+
signingCliOptions
50+
))
3851

39-
val command = binary.command ++ externalCommand ++ args
52+
val command = binary ++ externalCommand ++ args
4053

4154
Runner.run0(
4255
progName,
@@ -49,19 +62,25 @@ abstract class PgpExternalCommand extends ExternalCommand {
4962
}
5063

5164
def output(
52-
cache: Cache[Task],
53-
versionOpt: Option[String],
65+
cache: FileCache[Task],
5466
args: Seq[String],
5567
extraEnv: Map[String, String],
5668
logger: Logger,
57-
javaCommand: () => String
69+
javaCommand: () => String,
70+
signingCliOptions: bo.ScalaSigningCliOptions
5871
): Either[BuildException, String] = either {
5972

6073
val archiveCache = ArchiveCache().withCache(cache)
6174

62-
val binary = value(PgpExternalCommand.launcher(archiveCache, versionOpt, logger, javaCommand))
75+
val binary = value(PgpExternalCommand.launcher(
76+
cache,
77+
archiveCache,
78+
logger,
79+
javaCommand,
80+
signingCliOptions
81+
))
6382

64-
val command = binary.command ++ externalCommand ++ args
83+
val command = binary ++ externalCommand ++ args
6584

6685
os.proc(command).call(stdin = os.Inherit, env = extraEnv)
6786
.out.text()
@@ -82,7 +101,6 @@ abstract class PgpExternalCommand extends ExternalCommand {
82101
val cache = options.coursier.coursierCache(logger.coursierLogger(""))
83102
val retCode = tryRun(
84103
cache,
85-
options.signingCliVersion.map(_.trim).filter(_.nonEmpty),
86104
remainingArgs,
87105
Map(),
88106
logger,
@@ -92,7 +110,8 @@ abstract class PgpExternalCommand extends ExternalCommand {
92110
ArchiveCache().withCache(cache),
93111
cache,
94112
logger.verbosity
95-
).value.javaCommand
113+
).value.javaCommand,
114+
options.scalaSigning.cliOptions()
96115
).orExit(logger)
97116

98117
if (retCode != 0)
@@ -102,33 +121,69 @@ abstract class PgpExternalCommand extends ExternalCommand {
102121

103122
object PgpExternalCommand {
104123
def launcher(
124+
cache: FileCache[Task],
105125
archiveCache: ArchiveCache[Task],
106-
versionOpt: Option[String],
107126
logger: Logger,
108-
javaCommand: () => String
109-
): Either[BuildException, ExternalBinary] = {
110-
111-
val platformSuffix = FetchExternalBinary.platformSuffix()
112-
val version = versionOpt
113-
.getOrElse(Constants.scalaCliSigningVersion)
114-
val (tag, changing) =
115-
if (version == "latest") ("launchers", true)
116-
else ("v" + version, false)
117-
val ext = if (Properties.isWin) ".zip" else ".gz"
118-
val url =
119-
s"https://github.com/scala-cli/scala-cli-signing/releases/download/$tag/scala-cli-signing-$platformSuffix$ext"
120-
121-
val ver = if (version.startsWith("latest")) "latest.release" else version
122-
val params = ExternalBinaryParams(
123-
url,
124-
changing,
125-
"scala-cli-signing",
126-
Seq(
127-
dep"${Constants.scalaCliSigningOrganization}:${Constants.scalaCliSigningName}:$ver"
128-
),
129-
"scala.cli.signing.ScalaCliSigning"
130-
)
131-
132-
FetchExternalBinary.fetch(params, archiveCache, logger, javaCommand)
127+
javaCommand: () => String,
128+
signingCliOptions: bo.ScalaSigningCliOptions
129+
): Either[BuildException, Seq[String]] = either {
130+
131+
val version =
132+
signingCliOptions.signingCliVersion
133+
.getOrElse(Constants.scalaCliSigningVersion)
134+
val ver = if (version.startsWith("latest")) "latest.release" else version
135+
val signingMainClass = "scala.cli.signing.ScalaCliSigning"
136+
val jvmSigningDep =
137+
dep"${Constants.scalaCliSigningOrganization}:${Constants.scalaCliSigningName}_3:$ver"
138+
139+
if (signingCliOptions.useJvm.getOrElse(false)) {
140+
val extraRepos =
141+
if (version.endsWith("SNAPSHOT"))
142+
Seq(Repositories.sonatype("snapshots").root)
143+
else
144+
Nil
145+
146+
val signingClassPath = value {
147+
scala.build.Artifacts.fetch0(
148+
Positioned.none(Seq(jvmSigningDep.toCs)),
149+
extraRepos,
150+
None,
151+
Nil,
152+
logger,
153+
cache,
154+
None
155+
)
156+
}.files
157+
158+
val command = Seq[os.Shellable](
159+
javaCommand(),
160+
signingCliOptions.javaArgs,
161+
"-cp",
162+
signingClassPath.map(_.getAbsolutePath).mkString(File.pathSeparator),
163+
signingMainClass
164+
)
165+
166+
command.flatMap(_.value)
167+
}
168+
else {
169+
val platformSuffix = FetchExternalBinary.platformSuffix()
170+
val (tag, changing) =
171+
if (version == "latest") ("launchers", true)
172+
else ("v" + version, false)
173+
val ext = if (Properties.isWin) ".zip" else ".gz"
174+
val url =
175+
s"https://github.com/scala-cli/scala-cli-signing/releases/download/$tag/scala-cli-signing-$platformSuffix$ext"
176+
val params = ExternalBinaryParams(
177+
url,
178+
changing,
179+
"scala-cli-signing",
180+
Seq(jvmSigningDep),
181+
signingMainClass
182+
)
183+
val binary = value {
184+
FetchExternalBinary.fetch(params, archiveCache, logger, javaCommand)
185+
}
186+
binary.command
187+
}
133188
}
134189
}

modules/cli/src/main/scala/scala/cli/commands/pgp/PgpExternalOptions.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ final case class PgpExternalOptions(
1717
jvm: SharedJvmOptions = SharedJvmOptions(),
1818
@Recurse
1919
coursier: CoursierOptions = CoursierOptions(),
20-
@Hidden
21-
signingCliVersion: Option[String] = None
20+
@Recurse
21+
scalaSigning: PgpScalaSigningOptions = PgpScalaSigningOptions()
2222
) extends HasLoggingOptions
2323
// format: on
2424

modules/cli/src/main/scala/scala/cli/commands/pgp/PgpProxy.scala

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package scala.cli.commands.pgp
22

3-
import coursier.cache.Cache
3+
import coursier.cache.{Cache, FileCache}
44
import coursier.util.Task
55

6-
import scala.build.Logger
76
import scala.build.errors.BuildException
7+
import scala.build.{Logger, options => bo}
88
import scala.cli.commands.pgp.{PgpCreateExternal, PgpKeyIdExternal}
99
import scala.cli.errors.PgpError
1010
import scala.util.Properties
@@ -16,14 +16,14 @@ class PgpProxy {
1616
mail: String,
1717
quiet: Boolean,
1818
password: String,
19-
cache: Cache[Task],
19+
cache: FileCache[Task],
2020
logger: Logger,
21-
javaCommand: () => String
21+
javaCommand: () => String,
22+
signingCliOptions: bo.ScalaSigningCliOptions
2223
): Either[BuildException, Int] = {
2324
val quietOptions = Nil
2425
(new PgpCreateExternal).tryRun(
2526
cache,
26-
None,
2727
Seq(
2828
"pgp",
2929
"create",
@@ -39,16 +39,18 @@ class PgpProxy {
3939
Map("SCALA_CLI_RANDOM_KEY_PASSWORD" -> password),
4040
logger,
4141
allowExecve = false,
42-
javaCommand
42+
javaCommand,
43+
signingCliOptions
4344
)
4445
}
4546

4647
def keyId(
4748
key: String,
4849
keyPrintablePath: String,
49-
cache: Cache[Task],
50+
cache: FileCache[Task],
5051
logger: Logger,
51-
javaCommand: () => String
52+
javaCommand: () => String,
53+
signingCliOptions: bo.ScalaSigningCliOptions
5254
): Either[BuildException, String] = {
5355
val keyPath =
5456
if (Properties.isWin)
@@ -59,11 +61,11 @@ class PgpProxy {
5961
try {
6062
(new PgpKeyIdExternal).output(
6163
cache,
62-
None,
6364
Seq(keyPath.toString),
6465
Map(),
6566
logger,
66-
javaCommand
67+
javaCommand,
68+
signingCliOptions
6769
).map(_.trim)
6870
}
6971
finally os.remove(keyPath)

0 commit comments

Comments
 (0)