Skip to content

Commit

Permalink
Merge pull request #667 from alexarchambault/more-lightweight-cs-logging
Browse files Browse the repository at this point in the history
More lightweight coursier logging
  • Loading branch information
alexarchambault authored Feb 21, 2022
2 parents 64cfe21 + cf59606 commit 77eb68c
Show file tree
Hide file tree
Showing 22 changed files with 460 additions and 53 deletions.
59 changes: 51 additions & 8 deletions modules/build/src/main/scala/scala/build/Artifacts.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package scala.build
import coursier.cache.FileCache
import coursier.core.Classifier
import coursier.parse.RepositoryParser
import coursier.util.Task
import coursier.{Dependency => CsDependency, Fetch, core => csCore, util => csUtil}
import dependency._

Expand All @@ -18,6 +19,7 @@ import scala.build.errors.{
}
import scala.build.internal.Constants
import scala.build.internal.Constants._
import scala.build.internal.CsLoggerUtil._
import scala.build.internal.Util.ScalaDependencyOps

final case class Artifacts(
Expand Down Expand Up @@ -80,6 +82,7 @@ object Artifacts {
addJmhDependencies: Option[String],
scalaNativeCliVersion: Option[String],
extraRepositories: Seq[String],
cache: FileCache[Task],
logger: Logger
): Either[BuildException, Artifacts] = either {

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

val jvmRunnerDependencies =
if (addJvmRunner.getOrElse(true))
Expand Down Expand Up @@ -144,8 +149,36 @@ object Artifacts {
nativeTestInterfaceDependencies.map(Positioned.none(_)) ++
jmhDependencies.map(Positioned.none(_))

val updatedDependenciesMessage = {
val b = new StringBuilder("Downloading ")
val depLen = dependencies.length
val extraDepLen = updatedDependencies.length - depLen
depLen match {
case 1 => b.append("one dependency")
case n if n > 1 => b.append(s"$n dependencies")
case _ =>
}

if (depLen > 0 && extraDepLen > 0)
b.append(" and ")

extraDepLen match {
case 1 => b.append("one internal dependency")
case n if n > 1 => b.append(s"$n internal dependencies")
case _ =>
}

b.result()
}

val compilerArtifacts = value {
artifacts(Positioned.none(compilerDependencies), allExtraRepositories, params, logger)
artifacts(
Positioned.none(compilerDependencies),
allExtraRepositories,
params,
logger,
cache.withMessage(compilerDependenciesMessage)
)
}

val fetchRes = value {
Expand All @@ -154,6 +187,7 @@ object Artifacts {
allExtraRepositories,
params,
logger,
cache.withMessage(updatedDependenciesMessage),
classifiersOpt = Some(Set("_") ++ (if (fetchSources) Set("sources") else Set.empty))
)
}
Expand All @@ -167,6 +201,7 @@ object Artifacts {
allExtraRepositories,
params,
logger,
cache.withMessage("Downloading Scala Native CLI"),
None
)
}
Expand All @@ -188,7 +223,8 @@ object Artifacts {
Positioned.none(Seq(dep"$stubsOrganization:$stubsModuleName:$stubsVersion")),
allExtraRepositories,
params,
logger
logger,
cache.withMessage("Downloading internal stub dependency")
).map(_.map(_._2))
}
else
Expand All @@ -199,8 +235,13 @@ object Artifacts {
.map { posDep =>
val posDep0 =
posDep.map(dep => dep.copy(userParams = dep.userParams + ("intransitive" -> None)))
artifacts(posDep0.map(Seq(_)), allExtraRepositories, params, logger)
.map(_.map { case (url, path) => (posDep0.value, url, path) })
artifacts(
posDep0.map(Seq(_)),
allExtraRepositories,
params,
logger,
cache.withMessage(s"Downloading compiler plugin ${posDep.value.render}")
).map(_.map { case (url, path) => (posDep0.value, url, path) })
}
.sequence
.left.map(CompositeBuildException(_))
Expand All @@ -210,7 +251,8 @@ object Artifacts {
val javacPlugins0 = value {
javacPluginDependencies
.map { posDep =>
artifacts(posDep.map(Seq(_)), allExtraRepositories, params, logger)
val cache0 = cache.withMessage(s"Downloading javac plugin ${posDep.value.render}")
artifacts(posDep.map(Seq(_)), allExtraRepositories, params, logger, cache0)
.map(_.map { case (url, path) => (posDep.value, url, path) })
}
.sequence
Expand Down Expand Up @@ -239,9 +281,11 @@ object Artifacts {
extraRepositories: Seq[String],
params: ScalaParameters,
logger: Logger,
cache: FileCache[Task],
classifiersOpt: Option[Set[String]] = None
): Either[BuildException, Seq[(String, Path)]] = either {
val result = value(fetch(dependencies, extraRepositories, params, logger, classifiersOpt))
val res = value(fetch(dependencies, extraRepositories, params, logger, cache, classifiersOpt))
val result = res
.artifacts
.iterator
.map { case (a, f) => (a.url, f.toPath) }
Expand All @@ -260,6 +304,7 @@ object Artifacts {
extraRepositories: Seq[String],
params: ScalaParameters,
logger: Logger,
cache: FileCache[Task],
classifiersOpt: Option[Set[String]]
): Either[BuildException, Fetch.Result] = either {
logger.debug {
Expand All @@ -273,8 +318,6 @@ object Artifacts {
.left.map(errors => new RepositoryFormatError(errors))
}

val cache = FileCache().withLogger(logger.coursierLogger)

// FIXME Many parameters that we could allow to customize here
var fetcher = coursier.Fetch()
.withCache(cache)
Expand Down
25 changes: 19 additions & 6 deletions modules/build/src/main/scala/scala/build/Bloop.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package scala.build

import ch.epfl.scala.bsp4j
import coursier.cache.FileCache
import coursier.util.Task
import dependency.parser.ModuleParser
import dependency.{AnyDependency, DependencyLike, ScalaParameters, ScalaVersion}

Expand All @@ -9,6 +11,7 @@ import java.io.File
import scala.build.EitherCps.{either, value}
import scala.build.blooprifle.BloopRifleConfig
import scala.build.errors.{BuildException, ModuleFormatError}
import scala.build.internal.CsLoggerUtil._
import scala.concurrent.duration.FiniteDuration
import scala.jdk.CollectionConverters._

Expand Down Expand Up @@ -45,18 +48,28 @@ object Bloop {
def bloopClassPath(
dep: AnyDependency,
params: ScalaParameters,
logger: Logger
logger: Logger,
cache: FileCache[Task]
): Either[BuildException, Seq[File]] =
either {
value(Artifacts.artifacts(Positioned.none(Seq(dep)), Nil, params, logger))
.map(_._2.toFile)
val res = value {
Artifacts.artifacts(
Positioned.none(Seq(dep)),
Nil,
params,
logger,
cache.withMessage(s"Downloading compilation server ${dep.version}")
)
}
res.map(_._2.toFile)
}

def bloopClassPath(logger: Logger): Either[BuildException, Seq[File]] =
bloopClassPath(logger, BloopRifleConfig.defaultVersion)
def bloopClassPath(logger: Logger, cache: FileCache[Task]): Either[BuildException, Seq[File]] =
bloopClassPath(logger, cache, BloopRifleConfig.defaultVersion)

def bloopClassPath(
logger: Logger,
cache: FileCache[Task],
bloopVersion: String
): Either[BuildException, Seq[File]] = either {
val moduleStr = BloopRifleConfig.defaultModule
Expand All @@ -68,6 +81,6 @@ object Bloop {
val sv = BloopRifleConfig.defaultScalaVersion
val sbv = ScalaVersion.binary(sv)
val params = ScalaParameters(sv, sbv)
value(bloopClassPath(dep, params, logger))
value(bloopClassPath(dep, params, logger, cache))
}
}
4 changes: 2 additions & 2 deletions modules/build/src/main/scala/scala/build/Logger.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ trait Logger {
def log(ex: BuildException): Unit
def exit(ex: BuildException): Nothing

def coursierLogger: coursier.cache.CacheLogger
def coursierLogger(printBefore: String): coursier.cache.CacheLogger
def bloopRifleLogger: BloopRifleLogger
def scalaJsLogger: ScalaJsLogger
def scalaNativeTestLogger: sn.Logger
Expand All @@ -47,7 +47,7 @@ object Logger {
def exit(ex: BuildException): Nothing =
throw new Exception(ex)

def coursierLogger: coursier.cache.CacheLogger =
def coursierLogger(printBefore: String): coursier.cache.CacheLogger =
coursier.cache.CacheLogger.nop
def bloopRifleLogger: BloopRifleLogger =
BloopRifleLogger.nop
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ class PersistentDiagnosticLogger(parent: Logger) extends Logger {
def log(ex: BuildException): Unit = parent.log(ex)
def exit(ex: BuildException): Nothing = parent.exit(ex)

def coursierLogger: coursier.cache.CacheLogger = parent.coursierLogger
def coursierLogger(printBefore: String): coursier.cache.CacheLogger =
parent.coursierLogger(printBefore)
def bloopRifleLogger: BloopRifleLogger = parent.bloopRifleLogger
def scalaJsLogger: ScalaJsLogger = parent.scalaJsLogger
def scalaNativeTestLogger: sn.Logger = parent.scalaNativeTestLogger
Expand Down
18 changes: 15 additions & 3 deletions modules/build/src/main/scala/scala/build/ReplArtifacts.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package scala.build

import coursier.cache.FileCache
import coursier.util.Task
import dependency._

import java.nio.file.Path

import scala.build.EitherCps.{either, value}
import scala.build.errors.BuildException
import scala.build.internal.CsLoggerUtil._

final case class ReplArtifacts(
replArtifacts: Seq[(String, Path)],
Expand Down Expand Up @@ -39,17 +42,24 @@ object ReplArtifacts {
extraClassPath: Seq[Path],
extraSourceJars: Seq[Path],
logger: Logger,
cache: FileCache[Task],
directories: Directories
): Either[BuildException, ReplArtifacts] = either {
val localRepoOpt = LocalRepo.localRepo(directories.localRepoDir)
val allDeps = dependencies ++ Seq(dep"com.lihaoyi:::ammonite:$ammoniteVersion")
val replArtifacts =
Artifacts.artifacts(Positioned.none(allDeps), localRepoOpt.toSeq, scalaParams, logger)
val replArtifacts = Artifacts.artifacts(
Positioned.none(allDeps),
localRepoOpt.toSeq,
scalaParams,
logger,
cache.withMessage(s"Downloading Ammonite $ammoniteVersion")
)
val replSourceArtifacts = Artifacts.artifacts(
Positioned.none(allDeps),
localRepoOpt.toSeq,
scalaParams,
logger,
cache.withMessage(s"Downloading Ammonite $ammoniteVersion sources"),
classifiersOpt = Some(Set("sources"))
)
ReplArtifacts(
Expand All @@ -67,6 +77,7 @@ object ReplArtifacts {
dependencies: Seq[AnyDependency],
extraClassPath: Seq[Path],
logger: Logger,
cache: FileCache[Task],
repositories: Seq[String]
): Either[BuildException, ReplArtifacts] = either {
val isScala2 = scalaParams.scalaVersion.startsWith("2.")
Expand All @@ -79,7 +90,8 @@ object ReplArtifacts {
Positioned.none(allDeps),
repositories,
scalaParams,
logger
logger,
cache.withMessage(s"Downloading Scala compiler ${scalaParams.scalaVersion}")
)
val mainClass =
if (isScala2) "scala.tools.nsc.MainGenericRunner"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package scala.build.internal

import coursier.cache.FileCache
import coursier.cache.loggers.RefreshLogger
import coursier.jvm.JavaHome
import coursier.util.Task

object CsLoggerUtil {

// All of these methods are a bit flaky…

implicit class CsCacheExtensions(private val cache: FileCache[Task]) extends AnyVal {
def withMessage(message: String): FileCache[Task] =
cache.logger match {
case _: RefreshLogger =>
var displayed = false
val logger = RefreshLogger.create(
CustomProgressBarRefreshDisplay.create(
keepOnScreen = false,
if (!displayed) {
System.err.println(message)
displayed = true
},
()
)
)
cache.withLogger(logger)
case _ => cache
}
}
implicit class CsJavaHomeExtensions(private val javaHome: JavaHome) extends AnyVal {
def withMessage(message: String): JavaHome =
javaHome.cache.map(_.archiveCache.cache) match {
case Some(f: FileCache[Task]) =>
val cache0 = f.withMessage(message)
javaHome.withCache(
javaHome.cache.map(c => c.withArchiveCache(c.archiveCache.withCache(cache0)))
)
case _ => javaHome
}
}
}
Loading

0 comments on commit 77eb68c

Please sign in to comment.