From 41273307af76fae732c844fd3a7632d6e2c43ea8 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Fri, 18 Sep 2026 13:18:00 +0200 Subject: [PATCH 1/2] Bump `coursier` to 2.1.25 (was 2.1.25-M26) --- .github/scripts/get-latest-cs.sh | 2 +- build.mill | 3 +-- mill | 2 +- project/deps/package.mill | 8 ++++---- project/settings/package.mill | 8 ++++++++ 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.github/scripts/get-latest-cs.sh b/.github/scripts/get-latest-cs.sh index 57ad346205..4a098ae22d 100644 --- a/.github/scripts/get-latest-cs.sh +++ b/.github/scripts/get-latest-cs.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -e -CS_VERSION="2.1.25-M26" +CS_VERSION="2.1.25" DIR="$(cs get --archive "https://github.com/coursier/coursier/releases/download/v$CS_VERSION/cs-x86_64-pc-win32.zip")" diff --git a/build.mill b/build.mill index a6c80a5d2a..63b8387abc 100644 --- a/build.mill +++ b/build.mill @@ -5,7 +5,7 @@ //| - com.goyeau::mill-scalafix::0.6.2 //| - ch.epfl.scala:scalafix-interfaces:0.14.9 //| - com.lumidion::sonatype-central-client-requests:0.6.0 -//| - io.get-coursier:coursier-launcher_2.13:2.1.25-M26 +//| - io.get-coursier:coursier-launcher_2.13:2.1.25 //| - org.eclipse.jgit:org.eclipse.jgit:7.5.0.202512021534-r package build @@ -950,7 +950,6 @@ trait Cli extends CrossSbtModule with ProtoBuildModule with CliLaunchers override def mvnDeps: T[Seq[Dep]] = super.mvnDeps() ++ Seq( Deps.caseApp, Deps.coursierLauncher, - Deps.coursierProxySetup, Deps.coursierPublish.exclude((organization, "config_2.13")).exclude((organization, "config_3")), Deps.jimfs, // scalaJsEnvNodeJs pulls jimfs:1.1, whose class path seems borked (bin compat issue with the guava version it depends on) Deps.jniUtils, diff --git a/mill b/mill index fc5735f2e4..444a823a19 100755 --- a/mill +++ b/mill @@ -2,7 +2,7 @@ # Adapted from -coursier_version="2.1.25-M26" +coursier_version="2.1.25" COMMAND=$@ # necessary for Windows various shell environments diff --git a/project/deps/package.mill b/project/deps/package.mill index b78ffe258e..1438a364d6 100644 --- a/project/deps/package.mill +++ b/project/deps/package.mill @@ -123,7 +123,7 @@ object Deps { object Versions { def argonautShapeless = "1.3.1" // jni-utils version may need to be sync-ed when bumping the coursier version - def coursierDefault = "2.1.25-M26" + def coursierDefault = "2.1.25" def coursier = coursierDefault def coursierCli = coursierDefault def coursierPublish = "0.4.4" @@ -187,8 +187,8 @@ object Deps { def coursierLauncher = mvn"io.get-coursier:coursier-launcher_2.13:${Versions.coursier}" .exclude(("ai.kien", "python-native-libs_2.13")) .exclude(("org.scala-lang.modules", "scala-collection-compat_2.13")) - def coursierProxySetup = mvn"io.get-coursier:coursier-proxy-setup:${Versions.coursier}" - def coursierPublish = mvn"io.get-coursier.publish::publish:${Versions.coursierPublish}" + // NOTE: coursier-proxy-setup was merged into the main coursier artifact in coursier 2.1.25 + def coursierPublish = mvn"io.get-coursier.publish::publish:${Versions.coursierPublish}" .exclude(("org.scala-lang.modules", "scala-collection-compat_2.13")) .exclude(("com.github.plokhotnyuk.jsoniter-scala", "jsoniter-scala-core_2.13")) def dependency = mvn"io.get-coursier::dependency:0.3.2" @@ -213,7 +213,7 @@ object Deps { def jimfs = mvn"com.google.jimfs:jimfs:1.3.2" def jmhGeneratorBytecode = mvn"org.openjdk.jmh:jmh-generator-bytecode:${Versions.jmh}" def jmhCore = mvn"org.openjdk.jmh:jmh-core:${Versions.jmh}" - def jniUtils = mvn"io.get-coursier.jniutils:windows-jni-utils:0.3.4" + def jniUtils = mvn"io.get-coursier.jniutils:windows-jni-utils:0.4.0" def jsoniterCore = mvn"com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-core:${Versions.jsoniterScala}" def jsoniterMacros = diff --git a/project/settings/package.mill b/project/settings/package.mill index 907cbe94c9..be20ee3b46 100644 --- a/project/settings/package.mill +++ b/project/settings/package.mill @@ -851,6 +851,14 @@ trait ScalaCliModule extends ScalaModule { "--release", "16" ) + // Since coursier 2.1.25, the `coursier` package object extends a trait whose members refer to + // `scala.reflect.macros` types. scala-reflect is a `provided` dependency of coursier, so it has + // to be added to the compile class path explicitly for Scala 3 to be able to read that signature. + override def compileMvnDeps: T[Seq[Dep]] = Task { + if scalaVersion().startsWith("3") then + super.compileMvnDeps() ++ Seq(Deps.scalaReflect(deps.Scala.scala213)) + else super.compileMvnDeps() + } override def scalacOptions: T[Seq[String]] = Task { val sv = scalaVersion() val isScala213 = sv.startsWith("2.13.") From d63989a3f895cd9bbc00b8a166fc973597f3dca8 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Fri, 18 Sep 2026 14:05:05 +0200 Subject: [PATCH 2/2] Migrate from deprecated coursier APIs --- .../scala/build/tests/ExcludeTests.scala | 2 +- .../scala/build/tests/OfflineTests.scala | 2 +- .../build/tests/PreprocessingTests.scala | 2 +- .../scala/build/tests/SourcesTests.scala | 2 +- .../markdown/MarkdownPreprocessorTests.scala | 2 +- .../scala/cli/commands/ScalaCommand.scala | 2 +- .../scala/cli/commands/export0/Export.scala | 2 +- .../cli/commands/github/SecretCreate.scala | 2 +- .../scala/cli/commands/package0/Package.scala | 24 +++++++++++-------- .../cli/commands/pgp/PgpExternalCommand.scala | 4 ++-- .../cli/commands/publish/PublishSetup.scala | 2 +- .../publish/checks/PgpSecretKeyCheck.scala | 2 +- .../cli/commands/shared/CoursierOptions.scala | 6 ++--- .../scala/cli/launcher/LauncherCli.scala | 2 +- .../src/test/scala/cli/tests/TestUtil.scala | 2 +- .../scala/build/internals/CsLoggerUtil.scala | 6 ++--- .../main/scala/scala/build/Artifacts.scala | 16 +++++++------ .../build/TemporaryInMemoryRepository.scala | 20 +++++++++------- .../ActionableDependencyHandler.scala | 2 +- .../build/internal/FetchExternalBinary.scala | 2 +- .../scala/scala/build/internals/Util.scala | 14 ++++++----- .../scala/build/options/BuildOptions.scala | 6 ++--- .../scala/build/options/JavaOptions.scala | 10 ++++---- .../build/options/ScalaVersionUtil.scala | 4 ++-- project/settings/package.mill | 6 ++--- 25 files changed, 76 insertions(+), 68 deletions(-) diff --git a/modules/build/src/test/scala/scala/build/tests/ExcludeTests.scala b/modules/build/src/test/scala/scala/build/tests/ExcludeTests.scala index 98ef170af6..858504fdcd 100644 --- a/modules/build/src/test/scala/scala/build/tests/ExcludeTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/ExcludeTests.scala @@ -17,7 +17,7 @@ import scala.concurrent.ExecutionContext class ExcludeTests extends TestUtil.ScalaCliBuildSuite { val preprocessors: Seq[Preprocessor] = Sources.defaultPreprocessors( - archiveCache = ArchiveCache().withCache( + archiveCache = ArchiveCache().copy(cache = new Cache[Task] { def fetch: Fetch[Task] = _ => sys.error("shouldn't be used") def file(artifact: Artifact): EitherT[Task, ArtifactError, File] = diff --git a/modules/build/src/test/scala/scala/build/tests/OfflineTests.scala b/modules/build/src/test/scala/scala/build/tests/OfflineTests.scala index 8aafc497bc..b500b4c274 100644 --- a/modules/build/src/test/scala/scala/build/tests/OfflineTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/OfflineTests.scala @@ -13,7 +13,7 @@ class OfflineTests extends TestUtil.ScalaCliBuildSuite { internal = InternalOptions( cache = Some(FileCache() .withLocation(directories.cacheDir.toString) - .withCachePolicies(Seq(coursier.cache.CachePolicy.LocalOnly))) + .copy(cachePolicies = Seq(coursier.cache.CachePolicy.LocalOnly))) ) ) diff --git a/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala b/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala index fdcf0f2723..c7537ab714 100644 --- a/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala @@ -16,7 +16,7 @@ import scala.concurrent.ExecutionContext class PreprocessingTests extends TestUtil.ScalaCliBuildSuite { private val markdownPreprocessor: MarkdownPreprocessor = Sources.defaultPreprocessors( - ArchiveCache().withCache( + ArchiveCache().copy(cache = new Cache[Task] { def fetch: Fetch[Task] = _ => sys.error("shouldn't be used") def file(artifact: Artifact): EitherT[Task, ArtifactError, File] = diff --git a/modules/build/src/test/scala/scala/build/tests/SourcesTests.scala b/modules/build/src/test/scala/scala/build/tests/SourcesTests.scala index 15e025a7c9..7c4a184847 100644 --- a/modules/build/src/test/scala/scala/build/tests/SourcesTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/SourcesTests.scala @@ -26,7 +26,7 @@ class SourcesTests extends TestUtil.ScalaCliBuildSuite { given ScalaCliInvokeData = ScalaCliInvokeData.dummy val preprocessors: Seq[Preprocessor] = Sources.defaultPreprocessors( - ArchiveCache().withCache( + ArchiveCache().copy(cache = new Cache[Task] { def fetch: Fetch[Task] = _ => sys.error("shouldn't be used") def file(artifact: Artifact): EitherT[Task, ArtifactError, File] = diff --git a/modules/build/src/test/scala/scala/build/tests/markdown/MarkdownPreprocessorTests.scala b/modules/build/src/test/scala/scala/build/tests/markdown/MarkdownPreprocessorTests.scala index 2cc094281c..107f212971 100644 --- a/modules/build/src/test/scala/scala/build/tests/markdown/MarkdownPreprocessorTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/markdown/MarkdownPreprocessorTests.scala @@ -20,7 +20,7 @@ class MarkdownPreprocessorTests extends TestUtil.ScalaCliBuildSuite { given ScalaCliInvokeData = ScalaCliInvokeData.dummy private val preprocessors: Seq[Preprocessor] = Sources.defaultPreprocessors( - ArchiveCache().withCache( + ArchiveCache().copy(cache = new Cache[Task] { def fetch: Fetch[Task] = _ => sys.error("shouldn't be used") def file(artifact: Artifact): EitherT[Task, ArtifactError, File] = diff --git a/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala b/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala index bbbd084eea..81aa690872 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala @@ -141,7 +141,7 @@ abstract class ScalaCommand[T <: HasGlobalOptions](implicit myParser: Parser[T], .getOrElse(defaultScalaVersion) val (fromIndex, completions) = cache.logger.use { coursier.complete.Complete(cache) - .withInput(prefix) + .copy(input = prefix) .withScalaVersion(sv) .complete() .unsafeRun()(using cache.ec) diff --git a/modules/cli/src/main/scala/scala/cli/commands/export0/Export.scala b/modules/cli/src/main/scala/scala/cli/commands/export0/Export.scala index 70d778cc8f..d5240428eb 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/export0/Export.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/export0/Export.scala @@ -107,7 +107,7 @@ object Export extends ScalaCommand[ExportOptions] { ) val launcherTasks = launcherArtifacts.map { case (path, url) => - val art = Artifact(url).withChanging(true) + val art = Artifact(url).copy(changing = true) cache.file(art).run.flatMap { case Left(e) => Task.fail(e) case Right(f) => Task.delay { diff --git a/modules/cli/src/main/scala/scala/cli/commands/github/SecretCreate.scala b/modules/cli/src/main/scala/scala/cli/commands/github/SecretCreate.scala index 60b26cde78..f1b296e3bd 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/github/SecretCreate.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/github/SecretCreate.scala @@ -158,7 +158,7 @@ object SecretCreate extends ScalaCommand[SecretCreateOptions] { } val cache = options.coursier.coursierCache(logger) - val archiveCache = ArchiveCache().withCache(cache) + val archiveCache = ArchiveCache().copy(cache = cache) LibSodiumJni.init(cache, archiveCache, logger) diff --git a/modules/cli/src/main/scala/scala/cli/commands/package0/Package.scala b/modules/cli/src/main/scala/scala/cli/commands/package0/Package.scala index c29df25aaf..b69749238d 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/package0/Package.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/package0/Package.scala @@ -909,8 +909,10 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers { // TODO Generate that in memory val tmpJar = os.temp(prefix = destPath.last.stripSuffix(".jar"), suffix = ".jar") val tmpJarParams = Parameters.Assembly() - .withExtraZipEntries(patchedByteCodeZipEntries) - .withBaseManifest(baseManifestOpt) + .copy( + extraZipEntries = patchedByteCodeZipEntries, + baseManifest = baseManifestOpt + ) .withMainClass(mainClass) AssemblyGenerator.generate(tmpJarParams, tmpJar.toNIO) val tmpJarContent = os.read.bytes(tmpJar) @@ -948,9 +950,9 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers { val preamble = Preamble() .withOsKind(Properties.isWin) .callsItself(Properties.isWin) - .withJavaOpts(builds.head.options.javaOptions.javaOpts.toSeq.map(_.value.value)) + .copy(javaOpts = builds.head.options.javaOptions.javaOpts.toSeq.map(_.value.value)) val baseParams = Parameters.Bootstrap(Seq(loaderContent), mainClass) - .withDeterministic(true) + .copy(deterministic = true) .withPreamble(preamble) val params: Parameters.Bootstrap = @@ -976,7 +978,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers { else ClassPathEntry.Url(a.url) } val pythonContent = Seq(ClassLoaderContent(entries)) - baseParams.addExtraContent("python", pythonContent).withPython(true) + baseParams.addExtraContent("python", pythonContent).copy(python = true) } else baseParams @@ -1114,11 +1116,13 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers { } else None val params = Parameters.Assembly() - .withExtraZipEntries(nonManifestEntries) - .withBaseManifest(baseManifestOpt) - .withFiles(jars.map(_.toIO)) - .withMainClass(mainClassOpt) - .withPreambleOpt(preambleOpt) + .copy( + extraZipEntries = nonManifestEntries, + baseManifest = baseManifestOpt, + files = jars.map(_.toIO), + mainClass = mainClassOpt, + preambleOpt = preambleOpt + ) value(alreadyExistsCheck()) AssemblyGenerator.generate(params, destPath.toNIO) val patchedDest = value(SlothPatcher.patchJarFile(destPath, options, logger)) diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpExternalCommand.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpExternalCommand.scala index 3af2cd7f03..8d122cdf1b 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpExternalCommand.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpExternalCommand.scala @@ -37,7 +37,7 @@ abstract class PgpExternalCommand extends ExternalCommand { signingCliOptions: bo.ScalaSigningCliOptions ): Either[BuildException, Int] = either { - val archiveCache = ArchiveCache().withCache(cache) + val archiveCache = ArchiveCache().copy(cache = cache) val binary = value(PgpExternalCommand.launcher( cache, @@ -71,7 +71,7 @@ abstract class PgpExternalCommand extends ExternalCommand { signingCliOptions: bo.ScalaSigningCliOptions ): Either[BuildException, String] = either { - val archiveCache = ArchiveCache().withCache(cache) + val archiveCache = ArchiveCache().copy(cache = cache) val binary = value(PgpExternalCommand.launcher( cache, diff --git a/modules/cli/src/main/scala/scala/cli/commands/publish/PublishSetup.scala b/modules/cli/src/main/scala/scala/cli/commands/publish/PublishSetup.scala index a586a23594..36087af95d 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/publish/PublishSetup.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/publish/PublishSetup.scala @@ -207,7 +207,7 @@ object PublishSetup extends ScalaCommand[PublishSetupOptions] { s"Uploading ${missingSetSecrets.length} GitHub repository $name" } - LibSodiumJni.init(coursierCache, ArchiveCache().withCache(coursierCache), logger) + LibSodiumJni.init(coursierCache, ArchiveCache().copy(cache = coursierCache), logger) lazy val pubKey = SecretCreate.publicKey( ghRepoOrg, diff --git a/modules/cli/src/main/scala/scala/cli/commands/publish/checks/PgpSecretKeyCheck.scala b/modules/cli/src/main/scala/scala/cli/commands/publish/checks/PgpSecretKeyCheck.scala index 7dd71b1b87..d3646de126 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/publish/checks/PgpSecretKeyCheck.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/publish/checks/PgpSecretKeyCheck.scala @@ -69,7 +69,7 @@ final case class PgpSecretKeyCheck( def javaCommand: Either[BuildException, () => String] = either { () => value(JvmUtils.javaOptions(options.sharedJvm)).javaHome( - ArchiveCache().withCache(coursierCache), + ArchiveCache().copy(cache = coursierCache), coursierCache, logger.verbosity ).value.javaCommand diff --git a/modules/cli/src/main/scala/scala/cli/commands/shared/CoursierOptions.scala b/modules/cli/src/main/scala/scala/cli/commands/shared/CoursierOptions.scala index 9b91dd5709..fb7da33a3c 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/shared/CoursierOptions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/shared/CoursierOptions.scala @@ -44,16 +44,16 @@ final case class CoursierOptions( coursierValidateChecksums.getOrElse(true) def coursierCache(logger: Logger, cacheLogger: CacheLogger): FileCache[Task] = { - var baseCache = FileCache().withLogger(cacheLogger) + var baseCache = FileCache().copy(logger = cacheLogger) if (!validateChecksums) - baseCache = baseCache.withChecksums(Nil) + baseCache = baseCache.copy(checksums = Nil) val ttlOpt = ttl.map(_.trim).filter(_.nonEmpty).map(Duration(_)) for (ttl0 <- ttlOpt) baseCache = baseCache.withTtl(ttl0) for (loc <- cache.filter(_.trim.nonEmpty)) baseCache = baseCache.withLocation(loc) for (isOffline <- getOffline(logger) if isOffline) - baseCache = baseCache.withCachePolicies(Seq(CachePolicy.LocalOnly)) + baseCache = baseCache.copy(cachePolicies = Seq(CachePolicy.LocalOnly)) baseCache } diff --git a/modules/cli/src/main/scala/scala/cli/launcher/LauncherCli.scala b/modules/cli/src/main/scala/scala/cli/launcher/LauncherCli.scala index fd077c2051..80e06b91a1 100644 --- a/modules/cli/src/main/scala/scala/cli/launcher/LauncherCli.scala +++ b/modules/cli/src/main/scala/scala/cli/launcher/LauncherCli.scala @@ -93,7 +93,7 @@ object LauncherCli { val cliSubPath = s"org/virtuslab/scala-cli/cli_$scalaBinaryVersion" val mavenMetadataUrl = s"${RepositoryUtils.snapshotsRepositoryUrl}/$cliSubPath/maven-metadata.xml" - val artifact = Artifact(mavenMetadataUrl).withChanging(true) + val artifact = Artifact(mavenMetadataUrl).copy(changing = true) cache.fileWithTtl0(artifact) match { case Left(_) => System.err.println(s"Unable to find nightly ${ScalaCli.fullRunnerName} version") diff --git a/modules/cli/src/test/scala/cli/tests/TestUtil.scala b/modules/cli/src/test/scala/cli/tests/TestUtil.scala index 0fbf8a8b91..62c9d3e998 100644 --- a/modules/cli/src/test/scala/cli/tests/TestUtil.scala +++ b/modules/cli/src/test/scala/cli/tests/TestUtil.scala @@ -46,7 +46,7 @@ object TestUtil { } def downloadFile(url: String): Either[ArtifactError, Array[Byte]] = { - val artifact = Artifact(url).withChanging(true) + val artifact = Artifact(url).copy(changing = true) val cache = FileCache() val file: Either[ArtifactError, File] = cache.logger.use { diff --git a/modules/core/src/main/scala/scala/build/internals/CsLoggerUtil.scala b/modules/core/src/main/scala/scala/build/internals/CsLoggerUtil.scala index c9c1029c3b..74460407ab 100644 --- a/modules/core/src/main/scala/scala/build/internals/CsLoggerUtil.scala +++ b/modules/core/src/main/scala/scala/build/internals/CsLoggerUtil.scala @@ -37,7 +37,7 @@ object CsLoggerUtil { ) ) updatedLogger.init() - cache.withLogger(updatedLogger) + cache.copy(logger = updatedLogger) } else cache case _ => cache @@ -48,8 +48,8 @@ object CsLoggerUtil { 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))) + javaHome.copy(cache = + javaHome.cache.map(c => c.copy(archiveCache = c.archiveCache.copy(cache = cache0))) ) case _ => javaHome } diff --git a/modules/options/src/main/scala/scala/build/Artifacts.scala b/modules/options/src/main/scala/scala/build/Artifacts.scala index 54bf116496..cdcbb75f98 100644 --- a/modules/options/src/main/scala/scala/build/Artifacts.scala +++ b/modules/options/src/main/scala/scala/build/Artifacts.scala @@ -486,13 +486,15 @@ object Artifacts { } // this is actually fetcher.artifacts, which is a private field… val artifacts = coursier.Artifacts() - .withCache(fetcher.cache) - .withClassifiers(fetcher.classifiers) - .withMainArtifactsOpt(fetcher.mainArtifactsOpt) - .withArtifactTypesOpt(fetcher.artifactTypesOpt) - .withExtraArtifactsSeq(fetcher.extraArtifactsSeq) - .withClasspathOrder(fetcher.classpathOrder) - .withTransformArtifacts(fetcher.transformArtifacts) + .copy( + cache = fetcher.cache, + classifiers = fetcher.classifiers, + mainArtifactsOpt = fetcher.mainArtifactsOpt, + artifactTypesOpt = fetcher.artifactTypesOpt, + extraArtifactsSeq = fetcher.extraArtifactsSeq, + classpathOrder = fetcher.classpathOrder, + transformArtifacts = fetcher.transformArtifacts + ) artifacts .withResolution(resolution) .runResult() diff --git a/modules/options/src/main/scala/scala/build/TemporaryInMemoryRepository.scala b/modules/options/src/main/scala/scala/build/TemporaryInMemoryRepository.scala index a30420e96c..fb7dbad38d 100644 --- a/modules/options/src/main/scala/scala/build/TemporaryInMemoryRepository.scala +++ b/modules/options/src/main/scala/scala/build/TemporaryInMemoryRepository.scala @@ -62,16 +62,18 @@ object TemporaryInMemoryRepository { var conn: URLConnection = null try { conn = ConnectionBuilder(url.toURI.toASCIIString) - .withFollowHttpToHttpsRedirections( - cacheOpt.fold(false)(_.followHttpToHttpsRedirections) + .copy( + followHttpToHttpsRedirections = cacheOpt.fold(false)( + _.followHttpToHttpsRedirections + ), + followHttpsToHttpRedirections = cacheOpt.fold(false)( + _.followHttpsToHttpRedirections + ), + sslSocketFactoryOpt = cacheOpt.flatMap(_.sslSocketFactoryOpt), + hostnameVerifierOpt = cacheOpt.flatMap(_.hostnameVerifierOpt), + method = "HEAD", + maxRedirectionsOpt = cacheOpt.flatMap(_.maxRedirections) ) - .withFollowHttpsToHttpRedirections( - cacheOpt.fold(false)(_.followHttpsToHttpRedirections) - ) - .withSslSocketFactoryOpt(cacheOpt.flatMap(_.sslSocketFactoryOpt)) - .withHostnameVerifierOpt(cacheOpt.flatMap(_.hostnameVerifierOpt)) - .withMethod("HEAD") - .withMaxRedirectionsOpt(cacheOpt.flatMap(_.maxRedirections)) .connection() // Even though the finally clause handles this too, this has to be run here, so that we return Some(true) // iff this doesn't throw. diff --git a/modules/options/src/main/scala/scala/build/actionable/ActionableDependencyHandler.scala b/modules/options/src/main/scala/scala/build/actionable/ActionableDependencyHandler.scala index a38f3e4da2..7da23c0dc9 100644 --- a/modules/options/src/main/scala/scala/build/actionable/ActionableDependencyHandler.scala +++ b/modules/options/src/main/scala/scala/build/actionable/ActionableDependencyHandler.scala @@ -76,7 +76,7 @@ case object ActionableDependencyHandler private def mergeCoreVersions(parts: Seq[CoreVersions]): CoreVersions = val mergedAvailable = parts.flatMap(_.available0).distinctBy(_.asString).toList - CoreVersions.empty.withAvailable0(mergedAvailable) + CoreVersions.empty.copy(available0 = mergedAvailable) private def findLatestVersion( buildOptions: BuildOptions, diff --git a/modules/options/src/main/scala/scala/build/internal/FetchExternalBinary.scala b/modules/options/src/main/scala/scala/build/internal/FetchExternalBinary.scala index 8bfae5161b..f177e10eb0 100644 --- a/modules/options/src/main/scala/scala/build/internal/FetchExternalBinary.scala +++ b/modules/options/src/main/scala/scala/build/internal/FetchExternalBinary.scala @@ -67,7 +67,7 @@ object FetchExternalBinary { makeExecutable: Boolean = true ): Either[BuildException, Option[os.Path]] = either { - val artifact = Artifact(url).withChanging(changing) + val artifact = Artifact(url).copy(changing = changing) val res = archiveCache.cache.loggerOpt.getOrElse(CacheLogger.nop).use { logger.log(s"Getting $url") archiveCache.get(artifact) diff --git a/modules/options/src/main/scala/scala/build/internals/Util.scala b/modules/options/src/main/scala/scala/build/internals/Util.scala index 3d27700bc3..f1a7835c01 100644 --- a/modules/options/src/main/scala/scala/build/internals/Util.scala +++ b/modules/options/src/main/scala/scala/build/internals/Util.scala @@ -75,21 +75,23 @@ object Util { val mod = dep.module.toCs var dep0 = coursier.Dependency(mod, VersionConstraint(dep.version)) if (dep.exclude.nonEmpty) - dep0 = dep0.withMinimizedExclusions { + dep0 = dep0.copy(minimizedExclusions = MinimizedExclusions { dep.exclude.toSet[dependency.Module].map { mod => (coursier.Organization(mod.organization), coursier.ModuleName(mod.name)) } } - } + ) for (clOpt <- dep.userParams.find(_._1 == "classifier").map(_._2); cl <- clOpt) - dep0 = dep0.withPublication(dep0.publication.withClassifier(coursier.core.Classifier(cl))) + dep0 = dep0.copy(publication = + dep0.publication.copy(classifier = coursier.core.Classifier(cl)) + ) for (tpeOpt <- dep.userParams.find(_._1 == "type").map(_._2); tpe <- tpeOpt) - dep0 = dep0.withPublication(dep0.publication.withType(coursier.core.Type(tpe))) + dep0 = dep0.copy(publication = dep0.publication.copy(`type` = coursier.core.Type(tpe))) for (extOpt <- dep.userParams.find(_._1 == "ext").map(_._2); ext <- extOpt) - dep0 = dep0.withPublication(dep0.publication.withExt(coursier.core.Extension(ext))) + dep0 = dep0.copy(publication = dep0.publication.copy(ext = coursier.core.Extension(ext))) for (_ <- dep.userParams.find(_._1 == "intransitive")) - dep0 = dep0.withTransitive(false) + dep0 = dep0.copy(transitive = false) dep0 } } diff --git a/modules/options/src/main/scala/scala/build/options/BuildOptions.scala b/modules/options/src/main/scala/scala/build/options/BuildOptions.scala index 23dfdcb8fe..24a10fe9f0 100644 --- a/modules/options/src/main/scala/scala/build/options/BuildOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/BuildOptions.scala @@ -177,7 +177,7 @@ final case class BuildOptions( coursier.complete.Complete(finalCache) .withScalaVersion(scalaVersion) .withScalaBinaryVersion(scalaVersion.split('.').take(2).mkString(".")) - .withInput(s"org.scalameta:semanticdb-scalac_$scalaVersion:") + .copy(input = s"org.scalameta:semanticdb-scalac_$scalaVersion:") .complete() .future()(using finalCache.ec) } @@ -258,7 +258,7 @@ final case class BuildOptions( lazy val finalCache: FileCache[Task] = internal.cache.getOrElse(FileCache()) // This might download a JVM if --jvm … is passed or no system JVM is installed - lazy val archiveCache: ArchiveCache[Task] = ArchiveCache().withCache(finalCache) + lazy val archiveCache: ArchiveCache[Task] = ArchiveCache().copy(cache = finalCache) private lazy val javaCommand0: Positioned[JavaHomeInfo] = javaHomeLocation().map(JavaHomeInfo(_)) @@ -710,7 +710,7 @@ object BuildOptions { .map(_.describe) .map(f => os.read.bytes(os.Path(f, Os.pwd))) } - def changing(cache: FileCache[Task]): Download = apply(cache, Artifact(_).withChanging(true)) + def changing(cache: FileCache[Task]): Download = apply(cache, Artifact(_).copy(changing = true)) val notSupported: Download = _ => Left("URL not supported") } diff --git a/modules/options/src/main/scala/scala/build/options/JavaOptions.scala b/modules/options/src/main/scala/scala/build/options/JavaOptions.scala index 8051494903..b8800f23fd 100644 --- a/modules/options/src/main/scala/scala/build/options/JavaOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/JavaOptions.scala @@ -48,13 +48,11 @@ final case class JavaOptions( } val jvmCache = JvmCache() .withIndex(indexTask) - .withArchiveCache( - archiveCache.withCache( - cache.withMessage("Downloading JVM") - ) + .copy( + archiveCache = archiveCache.copy(cache = cache.withMessage("Downloading JVM")), + os = finalJvmIndexOs, + architecture = jvmIndexArch.getOrElse(JvmChannel.defaultArchitecture()) ) - .withOs(finalJvmIndexOs) - .withArchitecture(jvmIndexArch.getOrElse(JvmChannel.defaultArchitecture())) JavaHome().withCache(jvmCache) } diff --git a/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala b/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala index cc6c9c6a03..da2a2b30e9 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala @@ -111,7 +111,7 @@ object ScalaVersionUtil { val branch = s"$versionPrefix.x" val url = s"https://api.github.com/repos/scala/scala/commits?sha=$branch&per_page=20" - val artifact = Artifact(url).withChanging(true) + val artifact = Artifact(url).copy(changing = true) val file = value { cache.fileWithTtl0(artifact).left.map { err => new ScalaVersionError( @@ -135,7 +135,7 @@ object ScalaVersionUtil { either { val scala2NightlyRepo = "https://scala-ci.typesafe.com/ui/api/v1/ui/nativeBrowser/scala-integration/org/scala-lang/scala-compiler" - val artifact = Artifact(scala2NightlyRepo).withChanging(true) + val artifact = Artifact(scala2NightlyRepo).copy(changing = true) val res = cache.fileWithTtl0(artifact) .left.map { err => val msg = diff --git a/project/settings/package.mill b/project/settings/package.mill index be20ee3b46..725bf7a16f 100644 --- a/project/settings/package.mill +++ b/project/settings/package.mill @@ -478,7 +478,7 @@ trait CliLaunchers extends SbtModule { self => val entries = cp.map(path => ClassPathEntry.Url(path.toNIO.toUri.toASCIIString)) val loaderContent = coursier.launcher.ClassLoaderContent(entries) val params = Parameters.Bootstrap(Seq(loaderContent), mainClass0) - .withDeterministic(true) + .copy(deterministic = true) .withPreamble(preamble) BootstrapGenerator.generate(params, dest.toNIO) @@ -518,9 +518,9 @@ trait CliLaunchers extends SbtModule { self => } val loaderContent = coursier.launcher.ClassLoaderContent(entries) val params = Parameters.Bootstrap(Seq(loaderContent), mainClass0) - .withDeterministic(true) + .copy(deterministic = true) .withPreamble(preamble) - .withJavaProperties(Seq("scala-cli.kind" -> "jvm.standaloneLauncher")) + .copy(javaProperties = Seq("scala-cli.kind" -> "jvm.standaloneLauncher")) BootstrapGenerator.generate(params, dest.toNIO)