-
Notifications
You must be signed in to change notification settings - Fork 118
/
Bloop.scala
109 lines (96 loc) · 3.66 KB
/
Bloop.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package scala.cli.commands.bloop
import caseapp.core.RemainingArgs
import scala.build.Logger
import scala.build.bloop.BloopThreads
import scala.build.blooprifle.internal.{Constants, Operations}
import scala.build.blooprifle.{BloopRifle, BloopRifleConfig}
import scala.build.internal.OsLibc
import scala.cli.CurrentParams
import scala.cli.commands.util.CommonOps._
import scala.cli.commands.util.SharedCompilationServerOptionsUtil._
import scala.cli.commands.util.SharedOptionsUtil._
import scala.cli.commands.{ScalaCommand, SharedOptions, SpecificationLevel}
import scala.concurrent.Await
import scala.concurrent.duration.Duration
object Bloop extends ScalaCommand[BloopOptions] {
override def hidden = true
override def scalaSpecificationLevel = SpecificationLevel.RESTRICTED
override def stopAtFirstUnrecognized = true
private def bloopRifleConfig0(opts: BloopOptions): BloopRifleConfig = {
// FIXME Basically a tweaked copy of SharedOptionsUtil.bloopRifleConfig
// Some in progress BuildOptions / JavaOptions refactoring of mine should allow
// to stop using SharedOptions and BuildOptions here, and deal with JavaOptions
// directly.
val sharedOptions = SharedOptions(
logging = opts.logging,
compilationServer = opts.compilationServer,
directories = opts.directories,
jvm = opts.jvm,
coursier = opts.coursier
)
val options = sharedOptions.buildOptions(false, None).orExit(opts.logging.logger)
lazy val defaultJvmCmd =
sharedOptions.downloadJvm(OsLibc.baseDefaultJvm(OsLibc.jvmIndexOs, "17"), options)
val javaCmd = opts.compilationServer.bloopJvm
.map(sharedOptions.downloadJvm(_, options))
.orElse {
for (javaHome <- options.javaHomeLocationOpt()) yield {
val (javaHomeVersion, javaHomeCmd) = OsLibc.javaHomeVersion(javaHome.value)
if (javaHomeVersion >= 17) javaHomeCmd
else defaultJvmCmd
}
}
.getOrElse(defaultJvmCmd)
opts.compilationServer.bloopRifleConfig(
opts.logging.logger,
sharedOptions.coursierCache,
opts.logging.verbosity,
javaCmd,
opts.directories.directories,
Some(17)
)
}
def run(options: BloopOptions, args: RemainingArgs): Unit = {
CurrentParams.verbosity = options.logging.verbosity
val threads = BloopThreads.create()
val logger = options.logging.logger
val bloopRifleConfig = bloopRifleConfig0(options)
val isRunning = BloopRifle.check(bloopRifleConfig, logger.bloopRifleLogger)
if (isRunning)
logger.debug("Found running Bloop server")
else {
logger.debug("No running Bloop server found, starting one")
val f = BloopRifle.startServer(
bloopRifleConfig,
threads.startServerChecks,
logger.bloopRifleLogger,
bloopRifleConfig.retainedBloopVersion.version.raw,
bloopRifleConfig.javaPath
)
Await.result(f, Duration.Inf)
logger.message("Bloop server started.")
}
val args0 = args.all
args0 match {
case Seq() =>
// FIXME Give more details?
logger.message("Bloop server is running.")
case Seq(cmd, args @ _*) =>
val assumeTty = System.console() != null
val workingDir = options.workDirOpt.getOrElse(os.pwd).toNIO
Operations.run(
command = cmd,
args = args.toArray,
workingDir = workingDir,
address = bloopRifleConfig.address,
inOpt = Some(System.in),
out = System.out,
err = System.err,
logger = logger.bloopRifleLogger,
assumeInTty = assumeTty,
assumeOutTty = assumeTty,
assumeErrTty = assumeTty
)
}
}
}