Skip to content

Commit 77eb68c

Browse files
Merge pull request #667 from alexarchambault/more-lightweight-cs-logging
More lightweight coursier logging
2 parents 64cfe21 + cf59606 commit 77eb68c

22 files changed

+460
-53
lines changed

modules/build/src/main/scala/scala/build/Artifacts.scala

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scala.build
33
import coursier.cache.FileCache
44
import coursier.core.Classifier
55
import coursier.parse.RepositoryParser
6+
import coursier.util.Task
67
import coursier.{Dependency => CsDependency, Fetch, core => csCore, util => csUtil}
78
import dependency._
89

@@ -18,6 +19,7 @@ import scala.build.errors.{
1819
}
1920
import scala.build.internal.Constants
2021
import scala.build.internal.Constants._
22+
import scala.build.internal.CsLoggerUtil._
2123
import scala.build.internal.Util.ScalaDependencyOps
2224

2325
final case class Artifacts(
@@ -80,6 +82,7 @@ object Artifacts {
8082
addJmhDependencies: Option[String],
8183
scalaNativeCliVersion: Option[String],
8284
extraRepositories: Seq[String],
85+
cache: FileCache[Task],
8386
logger: Logger
8487
): Either[BuildException, Artifacts] = either {
8588

@@ -92,6 +95,8 @@ object Artifacts {
9295
Seq(
9396
dep"org.scala-lang:scala-compiler:${params.scalaVersion}"
9497
)
98+
val compilerDependenciesMessage =
99+
s"Downloading Scala ${params.scalaVersion} compiler"
95100

96101
val jvmRunnerDependencies =
97102
if (addJvmRunner.getOrElse(true))
@@ -144,8 +149,36 @@ object Artifacts {
144149
nativeTestInterfaceDependencies.map(Positioned.none(_)) ++
145150
jmhDependencies.map(Positioned.none(_))
146151

152+
val updatedDependenciesMessage = {
153+
val b = new StringBuilder("Downloading ")
154+
val depLen = dependencies.length
155+
val extraDepLen = updatedDependencies.length - depLen
156+
depLen match {
157+
case 1 => b.append("one dependency")
158+
case n if n > 1 => b.append(s"$n dependencies")
159+
case _ =>
160+
}
161+
162+
if (depLen > 0 && extraDepLen > 0)
163+
b.append(" and ")
164+
165+
extraDepLen match {
166+
case 1 => b.append("one internal dependency")
167+
case n if n > 1 => b.append(s"$n internal dependencies")
168+
case _ =>
169+
}
170+
171+
b.result()
172+
}
173+
147174
val compilerArtifacts = value {
148-
artifacts(Positioned.none(compilerDependencies), allExtraRepositories, params, logger)
175+
artifacts(
176+
Positioned.none(compilerDependencies),
177+
allExtraRepositories,
178+
params,
179+
logger,
180+
cache.withMessage(compilerDependenciesMessage)
181+
)
149182
}
150183

151184
val fetchRes = value {
@@ -154,6 +187,7 @@ object Artifacts {
154187
allExtraRepositories,
155188
params,
156189
logger,
190+
cache.withMessage(updatedDependenciesMessage),
157191
classifiersOpt = Some(Set("_") ++ (if (fetchSources) Set("sources") else Set.empty))
158192
)
159193
}
@@ -167,6 +201,7 @@ object Artifacts {
167201
allExtraRepositories,
168202
params,
169203
logger,
204+
cache.withMessage("Downloading Scala Native CLI"),
170205
None
171206
)
172207
}
@@ -188,7 +223,8 @@ object Artifacts {
188223
Positioned.none(Seq(dep"$stubsOrganization:$stubsModuleName:$stubsVersion")),
189224
allExtraRepositories,
190225
params,
191-
logger
226+
logger,
227+
cache.withMessage("Downloading internal stub dependency")
192228
).map(_.map(_._2))
193229
}
194230
else
@@ -199,8 +235,13 @@ object Artifacts {
199235
.map { posDep =>
200236
val posDep0 =
201237
posDep.map(dep => dep.copy(userParams = dep.userParams + ("intransitive" -> None)))
202-
artifacts(posDep0.map(Seq(_)), allExtraRepositories, params, logger)
203-
.map(_.map { case (url, path) => (posDep0.value, url, path) })
238+
artifacts(
239+
posDep0.map(Seq(_)),
240+
allExtraRepositories,
241+
params,
242+
logger,
243+
cache.withMessage(s"Downloading compiler plugin ${posDep.value.render}")
244+
).map(_.map { case (url, path) => (posDep0.value, url, path) })
204245
}
205246
.sequence
206247
.left.map(CompositeBuildException(_))
@@ -210,7 +251,8 @@ object Artifacts {
210251
val javacPlugins0 = value {
211252
javacPluginDependencies
212253
.map { posDep =>
213-
artifacts(posDep.map(Seq(_)), allExtraRepositories, params, logger)
254+
val cache0 = cache.withMessage(s"Downloading javac plugin ${posDep.value.render}")
255+
artifacts(posDep.map(Seq(_)), allExtraRepositories, params, logger, cache0)
214256
.map(_.map { case (url, path) => (posDep.value, url, path) })
215257
}
216258
.sequence
@@ -239,9 +281,11 @@ object Artifacts {
239281
extraRepositories: Seq[String],
240282
params: ScalaParameters,
241283
logger: Logger,
284+
cache: FileCache[Task],
242285
classifiersOpt: Option[Set[String]] = None
243286
): Either[BuildException, Seq[(String, Path)]] = either {
244-
val result = value(fetch(dependencies, extraRepositories, params, logger, classifiersOpt))
287+
val res = value(fetch(dependencies, extraRepositories, params, logger, cache, classifiersOpt))
288+
val result = res
245289
.artifacts
246290
.iterator
247291
.map { case (a, f) => (a.url, f.toPath) }
@@ -260,6 +304,7 @@ object Artifacts {
260304
extraRepositories: Seq[String],
261305
params: ScalaParameters,
262306
logger: Logger,
307+
cache: FileCache[Task],
263308
classifiersOpt: Option[Set[String]]
264309
): Either[BuildException, Fetch.Result] = either {
265310
logger.debug {
@@ -273,8 +318,6 @@ object Artifacts {
273318
.left.map(errors => new RepositoryFormatError(errors))
274319
}
275320

276-
val cache = FileCache().withLogger(logger.coursierLogger)
277-
278321
// FIXME Many parameters that we could allow to customize here
279322
var fetcher = coursier.Fetch()
280323
.withCache(cache)

modules/build/src/main/scala/scala/build/Bloop.scala

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package scala.build
22

33
import ch.epfl.scala.bsp4j
4+
import coursier.cache.FileCache
5+
import coursier.util.Task
46
import dependency.parser.ModuleParser
57
import dependency.{AnyDependency, DependencyLike, ScalaParameters, ScalaVersion}
68

@@ -9,6 +11,7 @@ import java.io.File
911
import scala.build.EitherCps.{either, value}
1012
import scala.build.blooprifle.BloopRifleConfig
1113
import scala.build.errors.{BuildException, ModuleFormatError}
14+
import scala.build.internal.CsLoggerUtil._
1215
import scala.concurrent.duration.FiniteDuration
1316
import scala.jdk.CollectionConverters._
1417

@@ -45,18 +48,28 @@ object Bloop {
4548
def bloopClassPath(
4649
dep: AnyDependency,
4750
params: ScalaParameters,
48-
logger: Logger
51+
logger: Logger,
52+
cache: FileCache[Task]
4953
): Either[BuildException, Seq[File]] =
5054
either {
51-
value(Artifacts.artifacts(Positioned.none(Seq(dep)), Nil, params, logger))
52-
.map(_._2.toFile)
55+
val res = value {
56+
Artifacts.artifacts(
57+
Positioned.none(Seq(dep)),
58+
Nil,
59+
params,
60+
logger,
61+
cache.withMessage(s"Downloading compilation server ${dep.version}")
62+
)
63+
}
64+
res.map(_._2.toFile)
5365
}
5466

55-
def bloopClassPath(logger: Logger): Either[BuildException, Seq[File]] =
56-
bloopClassPath(logger, BloopRifleConfig.defaultVersion)
67+
def bloopClassPath(logger: Logger, cache: FileCache[Task]): Either[BuildException, Seq[File]] =
68+
bloopClassPath(logger, cache, BloopRifleConfig.defaultVersion)
5769

5870
def bloopClassPath(
5971
logger: Logger,
72+
cache: FileCache[Task],
6073
bloopVersion: String
6174
): Either[BuildException, Seq[File]] = either {
6275
val moduleStr = BloopRifleConfig.defaultModule
@@ -68,6 +81,6 @@ object Bloop {
6881
val sv = BloopRifleConfig.defaultScalaVersion
6982
val sbv = ScalaVersion.binary(sv)
7083
val params = ScalaParameters(sv, sbv)
71-
value(bloopClassPath(dep, params, logger))
84+
value(bloopClassPath(dep, params, logger, cache))
7285
}
7386
}

modules/build/src/main/scala/scala/build/Logger.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ trait Logger {
2626
def log(ex: BuildException): Unit
2727
def exit(ex: BuildException): Nothing
2828

29-
def coursierLogger: coursier.cache.CacheLogger
29+
def coursierLogger(printBefore: String): coursier.cache.CacheLogger
3030
def bloopRifleLogger: BloopRifleLogger
3131
def scalaJsLogger: ScalaJsLogger
3232
def scalaNativeTestLogger: sn.Logger
@@ -47,7 +47,7 @@ object Logger {
4747
def exit(ex: BuildException): Nothing =
4848
throw new Exception(ex)
4949

50-
def coursierLogger: coursier.cache.CacheLogger =
50+
def coursierLogger(printBefore: String): coursier.cache.CacheLogger =
5151
coursier.cache.CacheLogger.nop
5252
def bloopRifleLogger: BloopRifleLogger =
5353
BloopRifleLogger.nop

modules/build/src/main/scala/scala/build/PersistentDiagnosticLogger.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ class PersistentDiagnosticLogger(parent: Logger) extends Logger {
2727
def log(ex: BuildException): Unit = parent.log(ex)
2828
def exit(ex: BuildException): Nothing = parent.exit(ex)
2929

30-
def coursierLogger: coursier.cache.CacheLogger = parent.coursierLogger
30+
def coursierLogger(printBefore: String): coursier.cache.CacheLogger =
31+
parent.coursierLogger(printBefore)
3132
def bloopRifleLogger: BloopRifleLogger = parent.bloopRifleLogger
3233
def scalaJsLogger: ScalaJsLogger = parent.scalaJsLogger
3334
def scalaNativeTestLogger: sn.Logger = parent.scalaNativeTestLogger

modules/build/src/main/scala/scala/build/ReplArtifacts.scala

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package scala.build
22

3+
import coursier.cache.FileCache
4+
import coursier.util.Task
35
import dependency._
46

57
import java.nio.file.Path
68

79
import scala.build.EitherCps.{either, value}
810
import scala.build.errors.BuildException
11+
import scala.build.internal.CsLoggerUtil._
912

1013
final case class ReplArtifacts(
1114
replArtifacts: Seq[(String, Path)],
@@ -39,17 +42,24 @@ object ReplArtifacts {
3942
extraClassPath: Seq[Path],
4043
extraSourceJars: Seq[Path],
4144
logger: Logger,
45+
cache: FileCache[Task],
4246
directories: Directories
4347
): Either[BuildException, ReplArtifacts] = either {
4448
val localRepoOpt = LocalRepo.localRepo(directories.localRepoDir)
4549
val allDeps = dependencies ++ Seq(dep"com.lihaoyi:::ammonite:$ammoniteVersion")
46-
val replArtifacts =
47-
Artifacts.artifacts(Positioned.none(allDeps), localRepoOpt.toSeq, scalaParams, logger)
50+
val replArtifacts = Artifacts.artifacts(
51+
Positioned.none(allDeps),
52+
localRepoOpt.toSeq,
53+
scalaParams,
54+
logger,
55+
cache.withMessage(s"Downloading Ammonite $ammoniteVersion")
56+
)
4857
val replSourceArtifacts = Artifacts.artifacts(
4958
Positioned.none(allDeps),
5059
localRepoOpt.toSeq,
5160
scalaParams,
5261
logger,
62+
cache.withMessage(s"Downloading Ammonite $ammoniteVersion sources"),
5363
classifiersOpt = Some(Set("sources"))
5464
)
5565
ReplArtifacts(
@@ -67,6 +77,7 @@ object ReplArtifacts {
6777
dependencies: Seq[AnyDependency],
6878
extraClassPath: Seq[Path],
6979
logger: Logger,
80+
cache: FileCache[Task],
7081
repositories: Seq[String]
7182
): Either[BuildException, ReplArtifacts] = either {
7283
val isScala2 = scalaParams.scalaVersion.startsWith("2.")
@@ -79,7 +90,8 @@ object ReplArtifacts {
7990
Positioned.none(allDeps),
8091
repositories,
8192
scalaParams,
82-
logger
93+
logger,
94+
cache.withMessage(s"Downloading Scala compiler ${scalaParams.scalaVersion}")
8395
)
8496
val mainClass =
8597
if (isScala2) "scala.tools.nsc.MainGenericRunner"
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package scala.build.internal
2+
3+
import coursier.cache.FileCache
4+
import coursier.cache.loggers.RefreshLogger
5+
import coursier.jvm.JavaHome
6+
import coursier.util.Task
7+
8+
object CsLoggerUtil {
9+
10+
// All of these methods are a bit flaky…
11+
12+
implicit class CsCacheExtensions(private val cache: FileCache[Task]) extends AnyVal {
13+
def withMessage(message: String): FileCache[Task] =
14+
cache.logger match {
15+
case _: RefreshLogger =>
16+
var displayed = false
17+
val logger = RefreshLogger.create(
18+
CustomProgressBarRefreshDisplay.create(
19+
keepOnScreen = false,
20+
if (!displayed) {
21+
System.err.println(message)
22+
displayed = true
23+
},
24+
()
25+
)
26+
)
27+
cache.withLogger(logger)
28+
case _ => cache
29+
}
30+
}
31+
implicit class CsJavaHomeExtensions(private val javaHome: JavaHome) extends AnyVal {
32+
def withMessage(message: String): JavaHome =
33+
javaHome.cache.map(_.archiveCache.cache) match {
34+
case Some(f: FileCache[Task]) =>
35+
val cache0 = f.withMessage(message)
36+
javaHome.withCache(
37+
javaHome.cache.map(c => c.withArchiveCache(c.archiveCache.withCache(cache0)))
38+
)
39+
case _ => javaHome
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)