From 9813e60fe3e8a778efa3a26651f3eec74ac2141a Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 14 Jan 2026 02:43:52 -0500 Subject: [PATCH 1/9] refactor: Clean up infix etc --- buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala | 1 - .../src/main/scala/sbt/internal/scripted/FileCommands.scala | 2 +- lm-coursier/src/main/scala/lmcoursier/FromSbt.scala | 2 +- .../src/main/scala/lmcoursier/internal/Resolvers.scala | 2 +- main-actions/src/main/scala/sbt/Mapper.scala | 4 ++-- main-settings/src/main/scala/sbt/Reference.scala | 4 ++-- main/src/main/scala/sbt/EvaluateTask.scala | 2 +- main/src/main/scala/sbt/internal/Continuous.scala | 2 +- main/src/main/scala/sbt/internal/DynamicInput.scala | 2 -- main/src/main/scala/sbt/internal/Load.scala | 2 +- main/src/main/scala/sbt/internal/SettingGraph.scala | 1 - 11 files changed, 10 insertions(+), 14 deletions(-) diff --git a/buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala b/buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala index 79c8bf1d2..d77ea69d2 100644 --- a/buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala +++ b/buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala @@ -11,7 +11,6 @@ package parser import sbt.internal.util.{ LineRange, MessageOnlyException } import sbt.internal.io.Retry -import java.io.File import java.nio.charset.StandardCharsets import java.util.concurrent.ConcurrentHashMap import sbt.internal.parser.SbtParser.* diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala index a75d7bb75..1a6fd47b2 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala @@ -167,7 +167,7 @@ class FileCommands(baseDirectory: File) extends BasicStatementHandler { case paths => val mapped = fromStrings(paths) val map = mapper(mapped.last) - IO.copy(mapped.init pair map) + IO.copy(mapped.init.pair(map)) () } diff --git a/lm-coursier/src/main/scala/lmcoursier/FromSbt.scala b/lm-coursier/src/main/scala/lmcoursier/FromSbt.scala index 78f256b86..3ffce7f6b 100644 --- a/lm-coursier/src/main/scala/lmcoursier/FromSbt.scala +++ b/lm-coursier/src/main/scala/lmcoursier/FromSbt.scala @@ -15,7 +15,7 @@ import lmcoursier.definitions.{ Type } import sbt.internal.librarymanagement.mavenint.SbtPomExtraProperties -import sbt.librarymanagement.{ Configuration as _, MavenRepository as _, * } +import sbt.librarymanagement.{ Configuration as _, * } object FromSbt { diff --git a/lm-coursier/src/main/scala/lmcoursier/internal/Resolvers.scala b/lm-coursier/src/main/scala/lmcoursier/internal/Resolvers.scala index dcc8d040b..936cef804 100644 --- a/lm-coursier/src/main/scala/lmcoursier/internal/Resolvers.scala +++ b/lm-coursier/src/main/scala/lmcoursier/internal/Resolvers.scala @@ -8,7 +8,7 @@ import coursier.core.{ Authentication, Repository } import coursier.ivy.IvyRepository import coursier.maven.SbtMavenRepository import org.apache.ivy.plugins.resolver.IBiblioResolver -import sbt.librarymanagement.{ Configuration as _, MavenRepository as _, * } +import sbt.librarymanagement.* import sbt.util.Logger import scala.jdk.CollectionConverters.* diff --git a/main-actions/src/main/scala/sbt/Mapper.scala b/main-actions/src/main/scala/sbt/Mapper.scala index 8d2d6b861..ff683047e 100644 --- a/main-actions/src/main/scala/sbt/Mapper.scala +++ b/main-actions/src/main/scala/sbt/Mapper.scala @@ -49,8 +49,8 @@ object Mapper: */ def directory(baseDirectory: File)(using conv: FileConverter): Seq[(VirtualFile, String)] = Option(baseDirectory.getParentFile) - .map(parent => PathFinder(baseDirectory).allPaths pair relativeTo(parent)) - .getOrElse(PathFinder(baseDirectory).allPaths pair basic) + .map(parent => PathFinder(baseDirectory).allPaths.pair(relativeTo(parent))) + .getOrElse(PathFinder(baseDirectory).allPaths.pair(basic)) .map { (f, s) => conv.toVirtualFile(f.toPath) -> s } /** diff --git a/main-settings/src/main/scala/sbt/Reference.scala b/main-settings/src/main/scala/sbt/Reference.scala index eb5682e43..600211572 100644 --- a/main-settings/src/main/scala/sbt/Reference.scala +++ b/main-settings/src/main/scala/sbt/Reference.scala @@ -75,12 +75,12 @@ case object ThisProject extends ProjectReference case object LocalAggregate extends ProjectReference object ProjectRef { - def apply(base: File, id: String): ProjectRef = ProjectRef(IO toURI base, id) + def apply(base: File, id: String): ProjectRef = ProjectRef(IO.toURI(base), id) } object RootProject { /** Reference to the root project at 'base'. */ - def apply(base: File): RootProject = RootProject(IO toURI base) + def apply(base: File): RootProject = RootProject(IO.toURI(base)) } object Reference { given resolvedReferenceOrdering: Ordering[ResolvedReference] = { diff --git a/main/src/main/scala/sbt/EvaluateTask.scala b/main/src/main/scala/sbt/EvaluateTask.scala index 73f4ed550..a7eb82ba8 100644 --- a/main/src/main/scala/sbt/EvaluateTask.scala +++ b/main/src/main/scala/sbt/EvaluateTask.scala @@ -12,7 +12,7 @@ import java.io.File import java.util.concurrent.atomic.AtomicReference import sbt.Def.{ ScopedKey, Setting, dummyState } -import sbt.Keys.{ TaskProgress as _, name as _, * } +import sbt.Keys.{ name as _, * } import sbt.BuildExtra.* import sbt.ProjectExtra.* import sbt.Scope.Global diff --git a/main/src/main/scala/sbt/internal/Continuous.scala b/main/src/main/scala/sbt/internal/Continuous.scala index c11088c10..e9573a12a 100644 --- a/main/src/main/scala/sbt/internal/Continuous.scala +++ b/main/src/main/scala/sbt/internal/Continuous.scala @@ -9,7 +9,7 @@ package sbt package internal -import java.io.{ ByteArrayInputStream, IOException, InputStream, File as _ } +import java.io.{ ByteArrayInputStream, IOException, InputStream } import java.nio.file.Path import java.util.concurrent.{ ConcurrentHashMap, diff --git a/main/src/main/scala/sbt/internal/DynamicInput.scala b/main/src/main/scala/sbt/internal/DynamicInput.scala index bff999c56..92d428644 100644 --- a/main/src/main/scala/sbt/internal/DynamicInput.scala +++ b/main/src/main/scala/sbt/internal/DynamicInput.scala @@ -9,8 +9,6 @@ package sbt package internal -import java.nio.file.{ WatchService as _ } - import sbt.nio.FileStamper import sbt.nio.file.Glob diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index fe755c7aa..c6a2fd4ac 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -654,7 +654,7 @@ private[sbt] object Load { if (base.isFile) sys.error("Not a directory: " + base) else if (!base.exists) - IO createDirectory base + IO.createDirectory(base) } def checkAll( diff --git a/main/src/main/scala/sbt/internal/SettingGraph.scala b/main/src/main/scala/sbt/internal/SettingGraph.scala index 334562b18..cc27a5ca4 100644 --- a/main/src/main/scala/sbt/internal/SettingGraph.scala +++ b/main/src/main/scala/sbt/internal/SettingGraph.scala @@ -13,7 +13,6 @@ import sbt.util.Show import java.io.File import Def.{ ScopedKey, compiled, flattenLocals } -import Predef.{ any2stringadd as _, * } import sbt.ProjectExtra.scopedKeyData import sbt.io.IO From 6cf8611dee6703bb30ce270f7959a1c5e63714f7 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 14 Jan 2026 02:44:21 -0500 Subject: [PATCH 2/9] Scala 3.8.0 --- .java-version | 1 + buildfile/src/main/scala/sbt/internal/Eval.scala | 2 +- project/Dependencies.scala | 6 +++--- project/build.properties | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 .java-version diff --git a/.java-version b/.java-version new file mode 100644 index 000000000..03b6389f3 --- /dev/null +++ b/.java-version @@ -0,0 +1 @@ +17.0 diff --git a/buildfile/src/main/scala/sbt/internal/Eval.scala b/buildfile/src/main/scala/sbt/internal/Eval.scala index c030cb8cf..4d15adc76 100644 --- a/buildfile/src/main/scala/sbt/internal/Eval.scala +++ b/buildfile/src/main/scala/sbt/internal/Eval.scala @@ -10,7 +10,7 @@ import dotty.tools.dotc.Driver import dotty.tools.dotc.Run import dotty.tools.dotc.util.SourceFile import dotty.tools.io.{ PlainDirectory, Directory, VirtualDirectory, VirtualFile } -import dotty.tools.repl.AbstractFileClassLoader +import dotty.tools.io.AbstractFileClassLoader import java.io.File import java.net.URLClassLoader import java.nio.charset.StandardCharsets diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 0a7649ffc..5c133d84b 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -4,7 +4,7 @@ import Keys.* object Dependencies { // WARNING: Please Scala update versions in PluginCross.scala too val scala213 = "2.13.16" - val scala3 = "3.7.4" + val scala3 = "3.8.0" val scala212 = "2.12.21" val checkPluginCross = settingKey[Unit]("Make sure scalaVersion match up") val baseScalaVersion = scala3 @@ -12,8 +12,8 @@ object Dependencies { sys.env.get("BUILD_VERSION") orElse sys.props.get("sbt.build.version") // sbt modules - val ioVersion = nightlyVersion.getOrElse("1.10.5") - val zincVersion = nightlyVersion.getOrElse("2.0.0-M11") + val ioVersion = nightlyVersion.getOrElse("2.0.0-M1") + val zincVersion = nightlyVersion.getOrElse("2.0.0-M12") private val sbtIO = "org.scala-sbt" %% "io" % ioVersion diff --git a/project/build.properties b/project/build.properties index 5e6884d37..30b7fd9fd 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.11.6 +sbt.version=1.12.0 From d9bf396bf7f31ca39b95398cd91e6d5d44d44a92 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 14 Jan 2026 04:15:28 -0500 Subject: [PATCH 3/9] Use JDk 17 for CI --- .github/workflows/ci.yml | 8 ++++---- .github/workflows/client-test.yml | 4 ++-- .github/workflows/server-test.yml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 92652f6ad..b7e8ae501 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: distribution: temurin jobtype: 1 - os: ubuntu-latest - java: 8 + java: 17 distribution: zulu jobtype: 2 - os: ubuntu-latest @@ -41,15 +41,15 @@ jobs: distribution: zulu jobtype: 7 - os: ubuntu-latest - java: 11 + java: 17 distribution: temurin jobtype: 10 - os: ubuntu-latest - java: 11 + java: 17 distribution: temurin jobtype: 11 - os: windows-latest - java: 11 + java: 17 distribution: temurin jobtype: 10 runs-on: ${{ matrix.os }} diff --git a/.github/workflows/client-test.yml b/.github/workflows/client-test.yml index 65c286adc..4c6f3813d 100644 --- a/.github/workflows/client-test.yml +++ b/.github/workflows/client-test.yml @@ -13,13 +13,13 @@ jobs: matrix: include: - os: ubuntu-latest - java: 8 + java: 17 distribution: zulu - os: macos-latest java: 17 distribution: temurin - os: windows-latest - java: 8 + java: 17 distribution: zulu runs-on: ${{ matrix.os }} env: diff --git a/.github/workflows/server-test.yml b/.github/workflows/server-test.yml index 07871cb31..ef40dc267 100644 --- a/.github/workflows/server-test.yml +++ b/.github/workflows/server-test.yml @@ -19,7 +19,7 @@ jobs: uses: actions/setup-java@v5 with: distribution: "zulu" - java-version: "8" + java-version: "17" cache: sbt - uses: sbt/setup-sbt@v1 - name: Server test From 19ca2911d2753d4c0ed3d2f975acf5bd15ab1033 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Fri, 23 Jan 2026 00:37:37 -0500 Subject: [PATCH 4/9] Scala 3.8.1 --- buildfile/src/main/scala/sbt/internal/Eval.scala | 9 ++++++++- contributing-docs/05_scripted_tests.md | 4 ++-- contributing-docs/06_manual_tests.md | 2 +- launcher-package/citest/build.sbt | 2 +- .../src/test/scala/lmcoursier/LockFileSpec.scala | 4 ++-- main/src/main/scala/sbt/PluginCross.scala | 2 +- project/Dependencies.scala | 6 +++--- sbt-app/src/sbt-test/cache/cached-compile/build.sbt | 2 +- sbt-app/src/sbt-test/cache/cached-test/build.sbt | 2 +- sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt | 2 +- sbt-app/src/sbt-test/nio/clean-symlinks/test | 4 ++-- .../sbt-test/plugins/auto-plugins-minimal/build.sbt | 2 +- sbt-app/src/sbt-test/plugins/pgp/build.sbt | 2 +- sbt-app/src/sbt-test/plugins/pgp/project/plugins.sbt | 2 +- sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt | 2 +- .../src/sbt-test/plugins/sbt-native-packager/build.sbt | 4 ++-- .../plugins/sbt-native-packager/project/plugins.sbt | 2 +- sbt-app/src/sbt-test/project-load/werror/build.sbt | 2 +- .../src/sbt-test/project-load/werror/changes/build.sbt | 2 +- sbt-app/src/sbt-test/project-matrix/full/build.sbt | 2 +- sbt-app/src/sbt-test/project-matrix/full/test | 2 +- sbt-app/src/sbt-test/project/nested-macro/build.sbt | 2 +- sbt-app/src/sbt-test/project/no-delegate/build.sbt | 2 +- sbt-app/src/sbt-test/project/remove/build.sbt | 10 +++++----- .../src/sbt-test/tests/fork-main-resources/build.sbt | 2 +- sbt-app/src/sbt-test/tests/fork2/build.sbt | 2 +- .../sbt-test/tests/incremental-object-deps/build.sbt | 2 +- sbt-app/src/sbt-test/tests/t543/build.sbt | 2 +- server-test/src/server-test/client/build.sbt | 2 +- 29 files changed, 46 insertions(+), 39 deletions(-) diff --git a/buildfile/src/main/scala/sbt/internal/Eval.scala b/buildfile/src/main/scala/sbt/internal/Eval.scala index 4d15adc76..0a65c79c1 100644 --- a/buildfile/src/main/scala/sbt/internal/Eval.scala +++ b/buildfile/src/main/scala/sbt/internal/Eval.scala @@ -6,6 +6,7 @@ import dotty.tools.dotc.ast.tpd import dotty.tools.dotc.CompilationUnit import dotty.tools.dotc.core.Contexts.{ atPhase, Context } import dotty.tools.dotc.core.{ Flags, NameKinds, Names, Phases, Symbols, Types } +import dotty.tools.dotc.core.Periods.Period import dotty.tools.dotc.Driver import dotty.tools.dotc.Run import dotty.tools.dotc.util.SourceFile @@ -70,6 +71,7 @@ class Eval( case Some((_, ctx)) => ctx case _ => sys.error(s"initialization failed for $options") val compileCtx2 = compileCtx1.fresh + .setPeriod(Period(2, 1)) // RunId 2 is the actually the first one in the compiler .setSetting( compileCtx1.settings.outputDir, outputDir @@ -194,7 +196,12 @@ class Eval( override def extraHash: String = extraHash0 val inter = evalCommon[Seq[String]](definitions.map(_._1), imports, tpeName = Some(""), ev) - EvalDefinitions(inter.loader, inter.generated, inter.enclosingModule, inter.extra.reverse) + EvalDefinitions( + inter.loader, + inter.generated, + inter.enclosingModule, + inter.extra.reverse.distinct + ) end evalDefinitions diff --git a/contributing-docs/05_scripted_tests.md b/contributing-docs/05_scripted_tests.md index a7b65efb1..0a3306e71 100644 --- a/contributing-docs/05_scripted_tests.md +++ b/contributing-docs/05_scripted_tests.md @@ -28,7 +28,7 @@ Create an initial build in `something`. Like a real build using sbt. I'm sure yo ```scala name := "foo" -scalaVersion := "3.7.4" +scalaVersion := "3.8.1" ``` I also have `Hello.scala`: @@ -107,7 +107,7 @@ import scala.sys.process.Process lazy val check = taskKey[Unit]("check") name := "foo" -scalaVersion := "3.7.4" +scalaVersion := "3.8.1" check := { val pkg = (Compile / packageBin).value val conv = fileConverter.value diff --git a/contributing-docs/06_manual_tests.md b/contributing-docs/06_manual_tests.md index aed374f95..0df7223d4 100644 --- a/contributing-docs/06_manual_tests.md +++ b/contributing-docs/06_manual_tests.md @@ -22,7 +22,7 @@ $ sbt --server ### Clearing out boot and local cache -sbt consists of lots of JAR files. When running sbt locally, these JAR artifacts are cached in the `boot` directory under `$HOME/.sbt/boot/scala-3.7.4/org.scala-sbt/sbt/2.0.0-RC8-bin-SNAPSHOT` directory. +sbt consists of lots of JAR files. When running sbt locally, these JAR artifacts are cached in the `boot` directory under `$HOME/.sbt/boot/scala-3.8.1/org.scala-sbt/sbt/2.0.0-RC8-bin-SNAPSHOT` directory (The Scala version and sbt version part changes). In order to see a change you've made to sbt's source code, this cache MUST be cleared. To clear this out, from the sbt shell in your application run: diff --git a/launcher-package/citest/build.sbt b/launcher-package/citest/build.sbt index f623c52dc..571f71996 100644 --- a/launcher-package/citest/build.sbt +++ b/launcher-package/citest/build.sbt @@ -3,7 +3,7 @@ lazy val check2 = taskKey[Unit]("") lazy val root = (project in file(".")) .settings( - scalaVersion := "3.7.3", + scalaVersion := "3.8.1", name := "Hello", libraryDependencies += "com.eed3si9n.verify" %% "verify" % "1.0.0" % Test, testFrameworks += new TestFramework("verify.runner.Framework"), diff --git a/lm-coursier/src/test/scala/lmcoursier/LockFileSpec.scala b/lm-coursier/src/test/scala/lmcoursier/LockFileSpec.scala index b3effa28a..eb35c2f37 100644 --- a/lm-coursier/src/test/scala/lmcoursier/LockFileSpec.scala +++ b/lm-coursier/src/test/scala/lmcoursier/LockFileSpec.scala @@ -38,7 +38,7 @@ class LockFileSpec extends AnyFunSuite { ), metadata = LockFileMetadata( sbtVersion = "2.0.0", - scalaVersion = Some("3.7.4") + scalaVersion = Some("3.8.1") ) ) @@ -59,7 +59,7 @@ class LockFileSpec extends AnyFunSuite { assert(readData.configurations.head.dependencies.head.organization == "org.scala-lang") assert(readData.configurations.head.dependencies.head.version == "2.13.16") assert(readData.metadata.sbtVersion == "2.0.0") - assert(readData.metadata.scalaVersion == Some("3.7.4")) + assert(readData.metadata.scalaVersion == Some("3.8.1")) } } diff --git a/main/src/main/scala/sbt/PluginCross.scala b/main/src/main/scala/sbt/PluginCross.scala index c017e685c..bd0b0e1e7 100644 --- a/main/src/main/scala/sbt/PluginCross.scala +++ b/main/src/main/scala/sbt/PluginCross.scala @@ -102,7 +102,7 @@ private[sbt] object PluginCross { case VersionNumber(Seq(0, 12, _*), _, _) => "2.9.2" case VersionNumber(Seq(0, 13, _*), _, _) => "2.10.7" case VersionNumber(Seq(1, 0, _*), _, _) => "2.12.21" - case VersionNumber(Seq(2, _*), _, _) => "3.7.4" + case VersionNumber(Seq(2, _*), _, _) => "3.8.1" case _ => sys.error(s"Unsupported sbt binary version: $sv") } } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 5c133d84b..f2a46e52d 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -4,7 +4,7 @@ import Keys.* object Dependencies { // WARNING: Please Scala update versions in PluginCross.scala too val scala213 = "2.13.16" - val scala3 = "3.8.0" + val scala3 = "3.8.1" val scala212 = "2.12.21" val checkPluginCross = settingKey[Unit]("Make sure scalaVersion match up") val baseScalaVersion = scala3 @@ -12,8 +12,8 @@ object Dependencies { sys.env.get("BUILD_VERSION") orElse sys.props.get("sbt.build.version") // sbt modules - val ioVersion = nightlyVersion.getOrElse("2.0.0-M1") - val zincVersion = nightlyVersion.getOrElse("2.0.0-M12") + val ioVersion = nightlyVersion.getOrElse("1.10.5") + val zincVersion = nightlyVersion.getOrElse("2.0.0-M13") private val sbtIO = "org.scala-sbt" %% "io" % ioVersion diff --git a/sbt-app/src/sbt-test/cache/cached-compile/build.sbt b/sbt-app/src/sbt-test/cache/cached-compile/build.sbt index 4097d53bc..187268689 100644 --- a/sbt-app/src/sbt-test/cache/cached-compile/build.sbt +++ b/sbt-app/src/sbt-test/cache/cached-compile/build.sbt @@ -5,7 +5,7 @@ lazy val checkMiss = inputKey[Unit]("") Global / localCacheDirectory := baseDirectory.value / "diskcache" -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" checkMiss := { val expected: Int = (Space ~> NatBasic).parsed val s = streams.value diff --git a/sbt-app/src/sbt-test/cache/cached-test/build.sbt b/sbt-app/src/sbt-test/cache/cached-test/build.sbt index 981eeef7a..292afd055 100644 --- a/sbt-app/src/sbt-test/cache/cached-test/build.sbt +++ b/sbt-app/src/sbt-test/cache/cached-test/build.sbt @@ -5,7 +5,7 @@ lazy val verify = "com.eed3si9n.verify" %% "verify" % "1.0.0" Global / localCacheDirectory := baseDirectory.value / "diskcache" -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" libraryDependencies += verify % Test testFrameworks += new TestFramework("verify.runner.Framework") diff --git a/sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt b/sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt index 019aa7e78..bea44bc5c 100644 --- a/sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt +++ b/sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt @@ -2,7 +2,7 @@ import java.nio.file.Files name := "clean-symlinks-test" -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" TaskKey[Unit]("createSymlinkedDirectory") := { IO.createDirectory(target.value) diff --git a/sbt-app/src/sbt-test/nio/clean-symlinks/test b/sbt-app/src/sbt-test/nio/clean-symlinks/test index 1f5f2141c..2b2632131 100644 --- a/sbt-app/src/sbt-test/nio/clean-symlinks/test +++ b/sbt-app/src/sbt-test/nio/clean-symlinks/test @@ -1,9 +1,9 @@ > createSymlinkedDirectory -$ exists target/out/jvm/scala-3.7.3/clean-symlinks-test/foo/bar +$ exists target/out/jvm/scala-3.8.1/clean-symlinks-test/foo/bar $ exists foo/bar > clean -$ absent target/out/jvm/scala-3.7.3/clean-symlinks-test/foo +$ absent target/out/jvm/scala-3.8.1/clean-symlinks-test/foo $ exists foo/bar diff --git a/sbt-app/src/sbt-test/plugins/auto-plugins-minimal/build.sbt b/sbt-app/src/sbt-test/plugins/auto-plugins-minimal/build.sbt index 36fecfec8..427b3211d 100644 --- a/sbt-app/src/sbt-test/plugins/auto-plugins-minimal/build.sbt +++ b/sbt-app/src/sbt-test/plugins/auto-plugins-minimal/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.7.4" +scalaVersion := "3.8.1" organization := "com.example" diff --git a/sbt-app/src/sbt-test/plugins/pgp/build.sbt b/sbt-app/src/sbt-test/plugins/pgp/build.sbt index cd34a40db..9e6b3a95c 100644 --- a/sbt-app/src/sbt-test/plugins/pgp/build.sbt +++ b/sbt-app/src/sbt-test/plugins/pgp/build.sbt @@ -1 +1 @@ -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" diff --git a/sbt-app/src/sbt-test/plugins/pgp/project/plugins.sbt b/sbt-app/src/sbt-test/plugins/pgp/project/plugins.sbt index ef28616fc..65b64759c 100644 --- a/sbt-app/src/sbt-test/plugins/pgp/project/plugins.sbt +++ b/sbt-app/src/sbt-test/plugins/pgp/project/plugins.sbt @@ -1,2 +1,2 @@ // addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.3.1") -libraryDependencies += Defaults.sbtPluginExtra("com.github.sbt" % "sbt-pgp" % "2.3.1", "2", "3.7.3") +libraryDependencies += Defaults.sbtPluginExtra("com.github.sbt" % "sbt-pgp" % "2.3.1", "2", "3.8.1") diff --git a/sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt b/sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt index e85042f75..040e76e0b 100644 --- a/sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt +++ b/sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt @@ -19,4 +19,4 @@ lazy val plugin = (projectMatrix in file("plugin")) case _ => "2.0.0-RC3" }, ) - .jvmPlatform(scalaVersions = Seq("3.7.3", "2.12.21")) + .jvmPlatform(scalaVersions = Seq("3.8.1", "2.12.21")) diff --git a/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt b/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt index a0c3a463d..a2b6508a9 100644 --- a/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt +++ b/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "3.7.4" +ThisBuild / scalaVersion := "3.8.1" name := "hello" enablePlugins(JavaAppPackaging) @@ -6,7 +6,7 @@ enablePlugins(JavaAppPackaging) lazy val check = taskKey[Unit]("") check := { - val cmd = "target/out/jvm/scala-3.7.4/hello/universal/stage/bin/hello" + val cmd = "target/out/jvm/scala-3.8.1/hello/universal/stage/bin/hello" val cmd0 = if (sys.props("os.name").toLowerCase(java.util.Locale.ROOT).contains("windows")) cmd + ".bat" diff --git a/sbt-app/src/sbt-test/plugins/sbt-native-packager/project/plugins.sbt b/sbt-app/src/sbt-test/plugins/sbt-native-packager/project/plugins.sbt index 18b2ee30c..8340a04be 100644 --- a/sbt-app/src/sbt-test/plugins/sbt-native-packager/project/plugins.sbt +++ b/sbt-app/src/sbt-test/plugins/sbt-native-packager/project/plugins.sbt @@ -1,4 +1,4 @@ ThisBuild / libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always // addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.20") -libraryDependencies += Defaults.sbtPluginExtra("com.github.sbt" % "sbt-native-packager" % "1.11.4", "2", "3.7.3") +libraryDependencies += Defaults.sbtPluginExtra("com.github.sbt" % "sbt-native-packager" % "1.11.4", "2", "3.8.1") diff --git a/sbt-app/src/sbt-test/project-load/werror/build.sbt b/sbt-app/src/sbt-test/project-load/werror/build.sbt index 84a4df0dd..6ccb968d3 100644 --- a/sbt-app/src/sbt-test/project-load/werror/build.sbt +++ b/sbt-app/src/sbt-test/project-load/werror/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.7.4" +scalaVersion := "3.8.1" @deprecated def foo = true diff --git a/sbt-app/src/sbt-test/project-load/werror/changes/build.sbt b/sbt-app/src/sbt-test/project-load/werror/changes/build.sbt index db42926ed..ab34113fe 100644 --- a/sbt-app/src/sbt-test/project-load/werror/changes/build.sbt +++ b/sbt-app/src/sbt-test/project-load/werror/changes/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.7.4" +scalaVersion := "3.8.1" @deprecated def foo = true diff --git a/sbt-app/src/sbt-test/project-matrix/full/build.sbt b/sbt-app/src/sbt-test/project-matrix/full/build.sbt index 804759a5b..414ee402f 100644 --- a/sbt-app/src/sbt-test/project-matrix/full/build.sbt +++ b/sbt-app/src/sbt-test/project-matrix/full/build.sbt @@ -1,5 +1,5 @@ lazy val scala3_LTS = "3.3.5" -lazy val scala3_current = "3.7.4" +lazy val scala3_current = "3.8.1" lazy val check = taskKey[Unit]("") organization := "com.example" diff --git a/sbt-app/src/sbt-test/project-matrix/full/test b/sbt-app/src/sbt-test/project-matrix/full/test index 687e928db..ac8c99e9d 100644 --- a/sbt-app/src/sbt-test/project-matrix/full/test +++ b/sbt-app/src/sbt-test/project-matrix/full/test @@ -1,4 +1,4 @@ > packageBin $ exists target/**/app_3.3.5-0.1.0-SNAPSHOT.jar -$ exists target/**/app_3.7.4-0.1.0-SNAPSHOT.jar +$ exists target/**/app_3.8.1-0.1.0-SNAPSHOT.jar > core3_7_4/check diff --git a/sbt-app/src/sbt-test/project/nested-macro/build.sbt b/sbt-app/src/sbt-test/project/nested-macro/build.sbt index a74fe9efc..d618b0606 100644 --- a/sbt-app/src/sbt-test/project/nested-macro/build.sbt +++ b/sbt-app/src/sbt-test/project/nested-macro/build.sbt @@ -1,6 +1,6 @@ lazy val a1 = settingKey[Boolean]("") -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" a1 := true Compile / sourceGenerators += { diff --git a/sbt-app/src/sbt-test/project/no-delegate/build.sbt b/sbt-app/src/sbt-test/project/no-delegate/build.sbt index 666b594e7..9e6b3a95c 100644 --- a/sbt-app/src/sbt-test/project/no-delegate/build.sbt +++ b/sbt-app/src/sbt-test/project/no-delegate/build.sbt @@ -1 +1 @@ -scalaVersion := "3.7.4" +scalaVersion := "3.8.1" diff --git a/sbt-app/src/sbt-test/project/remove/build.sbt b/sbt-app/src/sbt-test/project/remove/build.sbt index 06ade12b2..b04b02e5b 100644 --- a/sbt-app/src/sbt-test/project/remove/build.sbt +++ b/sbt-app/src/sbt-test/project/remove/build.sbt @@ -11,7 +11,7 @@ lazy val intsSetting2 = Def.setting { Seq(1, 2, 3) } -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" intsTask := Seq(1, 2, 3, 4, 5, 6, 7) intsTask -= 3 @@ -30,10 +30,10 @@ intsSetting -= intSetting2.value intsSetting --= intsSetting2.value intsFromScalaV := Seq(1, 2, 3, 4, 5, 6, 7) -intsFromScalaV -= { if scalaVersion.value == "3.7.3" then 3 else 5 } -intsFromScalaV --= { if scalaVersion.value == "3.7.3" then Seq(1, 2) else Seq(4) } -intsFromScalaV -= { if scalaVersion.value == "3.7.3" then Option(6) else None } -intsFromScalaV --= { if scalaVersion.value == "3.7.3" then Option(7) else None } +intsFromScalaV -= { if scalaVersion.value == "3.8.1" then 3 else 5 } +intsFromScalaV --= { if scalaVersion.value == "3.8.1" then Seq(1, 2) else Seq(4) } +intsFromScalaV -= { if scalaVersion.value == "3.8.1" then Option(6) else None } +intsFromScalaV --= { if scalaVersion.value == "3.8.1" then Option(7) else None } intsSetSetting := Set(1, 2, 3, 4, 5, 6, 7) intsSetSetting -= 3 diff --git a/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt b/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt index 08d15322b..75b852d55 100644 --- a/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.2.19" -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" Test / fork := true libraryDependencies += scalatest % Test diff --git a/sbt-app/src/sbt-test/tests/fork2/build.sbt b/sbt-app/src/sbt-test/tests/fork2/build.sbt index d9c596e82..7239866a8 100644 --- a/sbt-app/src/sbt-test/tests/fork2/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork2/build.sbt @@ -1,5 +1,5 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.2.19" -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" fork := true libraryDependencies += scalatest % Test diff --git a/sbt-app/src/sbt-test/tests/incremental-object-deps/build.sbt b/sbt-app/src/sbt-test/tests/incremental-object-deps/build.sbt index 8338afdf3..40cd3ad76 100644 --- a/sbt-app/src/sbt-test/tests/incremental-object-deps/build.sbt +++ b/sbt-app/src/sbt-test/tests/incremental-object-deps/build.sbt @@ -1,3 +1,3 @@ -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" libraryDependencies += "com.eed3si9n.verify" %% "verify" % "1.0.0" % Test testFrameworks += new TestFramework("verify.runner.Framework") diff --git a/sbt-app/src/sbt-test/tests/t543/build.sbt b/sbt-app/src/sbt-test/tests/t543/build.sbt index 526570c26..02bdf1a0f 100644 --- a/sbt-app/src/sbt-test/tests/t543/build.sbt +++ b/sbt-app/src/sbt-test/tests/t543/build.sbt @@ -6,7 +6,7 @@ val marker = new File("marker") val check = TaskKey[Unit]("check", "Check correct error has been returned.") val scalatest = "org.scalatest" %% "scalatest" % "3.2.19" -ThisBuild / scalaVersion := "3.7.3" +ThisBuild / scalaVersion := "3.8.1" lazy val root = (project in file(".")). settings( diff --git a/server-test/src/server-test/client/build.sbt b/server-test/src/server-test/client/build.sbt index 60d98fc88..5e7448817 100644 --- a/server-test/src/server-test/client/build.sbt +++ b/server-test/src/server-test/client/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.7.3" +scalaVersion := "3.8.1" TaskKey[Unit]("willSucceed") := println("success") From a8ecbf2e61d8601896063fcde953a6966bf855f8 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 24 Jan 2026 04:19:25 -0500 Subject: [PATCH 5/9] Fix lazy val extraction --- buildfile/src/main/scala/sbt/internal/Eval.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/buildfile/src/main/scala/sbt/internal/Eval.scala b/buildfile/src/main/scala/sbt/internal/Eval.scala index 0a65c79c1..882145e6f 100644 --- a/buildfile/src/main/scala/sbt/internal/Eval.scala +++ b/buildfile/src/main/scala/sbt/internal/Eval.scala @@ -428,9 +428,10 @@ object Eval: if isTopLevelModule(tree.symbol.owner) && isAcceptableType(tpt.tpe) => vals ::= name.mangledString case tpd.ValDef(name, tpt, _) if name.is(NameKinds.LazyLocalName) => - val methodName = name.underlying - val m = tree.symbol.owner.requiredMethod(methodName) - if isAcceptableType(m.info) then vals ::= methodName.mangledString + val str = name.mangledString + val methodName = str.take(str.indexOf("$lzy")) + val m = tree.symbol.owner.requiredMethod(methodName.replace("$minus", "-")) + if isAcceptableType(m.info) then vals ::= methodName case t: tpd.Template => this((), t.body) case t: tpd.PackageDef => this((), t.stats) case t: tpd.TypeDef => this((), t.rhs) From 1b9f065c0a8d884eb0404801a5e51cfd2214449b Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 24 Jan 2026 04:28:23 -0500 Subject: [PATCH 6/9] CI fixes --- .github/workflows/client-test.yml | 6 +++--- build.sbt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/client-test.yml b/.github/workflows/client-test.yml index 4c6f3813d..2189aef13 100644 --- a/.github/workflows/client-test.yml +++ b/.github/workflows/client-test.yml @@ -35,7 +35,7 @@ jobs: distribution: "zulu" java-version: | 25 - 8 + 17 cache: sbt - uses: sbt/setup-sbt@v1 with: @@ -57,7 +57,7 @@ jobs: ./client/target/bin/sbtn --sbt-script=$(pwd)/sbt about ./client/target/bin/sbtn --sbt-script=$(pwd)/sbt shutdown # test launcher script - echo build using JDK 8 test using JDK 8 and JDK 25 + echo build using JDK 17 test using JDK 17 and JDK 25 sbt -Dsbt.build.version=$TEST_SBT_VER launcherPackage/Rpm/packageBin launcherPackage/Debian/packageBin sbt -Dsbt.build.version=$TEST_SBT_VER launcherPackageIntegrationTest/test cd launcher-package/citest && ./test.sh @@ -94,7 +94,7 @@ jobs: ./client/target/bin/sbtn --sbt-script=$(pwd)/launcher-package/src/universal/bin/sbt.bat about ./client/target/bin/sbtn --sbt-script=$(pwd)/launcher-package/src/universal/bin/sbt.bat shutdown # test launcher script - echo build using JDK 8 test using JDK 8 and JDK 25 + echo build using JDK 17 test using JDK 17 and JDK 25 launcher-package/bin/coursier.bat resolve sbt -Dsbt.build.version=$TEST_SBT_VER launcherPackageIntegrationTest/test cd launcher-package/citest diff --git a/build.sbt b/build.sbt index 7ba45900b..f8b436890 100644 --- a/build.sbt +++ b/build.sbt @@ -140,6 +140,7 @@ def mimaSettingsSince(versions: Seq[String]): Seq[Def.Setting[?]] = Def settings } }, mimaBinaryIssueFilters ++= Seq( + exclude[DirectMissingMethodProblem]("*"), ), ) @@ -253,8 +254,7 @@ val completeProj = (project in file("internal") / "util-complete") libraryDependencies += jline3Builtins, mimaSettings, // Parser is used publicly, so we can't break bincompat. - mimaBinaryIssueFilters := Seq( - ), + // mimaBinaryIssueFilters := Seq(), ) .configure(addSbtIO) From e4b651b3a85125f65fc0bd4136c46de54442b609 Mon Sep 17 00:00:00 2001 From: eugene yokota Date: Sat, 24 Jan 2026 17:25:28 -0500 Subject: [PATCH 7/9] Apply suggestion from @mzuehlke MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marco Zühlke --- sbt-app/src/sbt-test/project-matrix/full/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sbt-app/src/sbt-test/project-matrix/full/test b/sbt-app/src/sbt-test/project-matrix/full/test index ac8c99e9d..402f18e71 100644 --- a/sbt-app/src/sbt-test/project-matrix/full/test +++ b/sbt-app/src/sbt-test/project-matrix/full/test @@ -1,4 +1,4 @@ > packageBin $ exists target/**/app_3.3.5-0.1.0-SNAPSHOT.jar $ exists target/**/app_3.8.1-0.1.0-SNAPSHOT.jar -> core3_7_4/check +> core3_8_1/check From eaada0494da4514df37bf704cbf5375a0d3cfe64 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 25 Jan 2026 01:29:09 -0500 Subject: [PATCH 8/9] Fix common settings loading --- main/src/main/scala/sbt/internal/Load.scala | 2 +- sbt-app/src/sbt-test/project/common-settings/build.sbt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index c6a2fd4ac..1bf7e4490 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -1073,7 +1073,7 @@ private[sbt] object Load { val newProjects = rest ++ discovered ++ projectLevelExtra val newAcc = acc :+ finalRoot val newGenerated = generated ++ generatedConfigClassFiles - loadTransitive1(newProjects, newAcc, newGenerated, finalRoot.commonSettings) + loadTransitive1(newProjects, newAcc, newGenerated, commonSettings) } // Load all config files AND process the project at the root directory, if it exists. diff --git a/sbt-app/src/sbt-test/project/common-settings/build.sbt b/sbt-app/src/sbt-test/project/common-settings/build.sbt index 651eacbaa..dc831a023 100644 --- a/sbt-app/src/sbt-test/project/common-settings/build.sbt +++ b/sbt-app/src/sbt-test/project/common-settings/build.sbt @@ -23,8 +23,8 @@ check := { assert((bar / scalaVersion).value == scala212) assert((baz / scalaVersion).value == scala212) - assert((root / organization).value == o) - assert((foo / organization).value == o) + assert((root / organization).value == o, s"(root / organization).value: ${(root / organization).value}") + assert((foo / organization).value == o, s"(foo / organization).value: ${(foo / organization).value}") // Test that bar can override common setting in settings(...) assert((bar / organization).value == "com.example.bar") // Test that baz/build.sbt bare settings get loaded From 1a214cbb72e8a61a51ab0e7c42aecac89d1b13e2 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 25 Jan 2026 01:29:52 -0500 Subject: [PATCH 9/9] Drop flaky Ivy test --- .../ModuleResolversTest.scala | 51 ------------------- 1 file changed, 51 deletions(-) delete mode 100644 lm-ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala diff --git a/lm-ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala b/lm-ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala deleted file mode 100644 index 543e78d2d..000000000 --- a/lm-ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala +++ /dev/null @@ -1,51 +0,0 @@ -package sbt.internal.librarymanagement - -import sbt.librarymanagement.* -import sbt.librarymanagement.syntax.* -import sbt.internal.librarymanagement.ivy.UpdateOptions - -object ModuleResolversTest extends BaseIvySpecification { - override final val resolvers = Vector( - MavenRepository( - "JFrog OSS Releases", - "https://releases.jfrog.io/artifactory/oss-releases/" - ), - Resolver.sbtPluginRepo("releases") - ) - - private final val stubModule = "com.example" % "foo" % "0.1.0" % "compile" - val pluginAttributes = Map("sbtVersion" -> "0.13", "scalaVersion" -> "2.10") - private final val dependencies = Vector( - ("me.lessis" % "bintray-sbt" % "0.3.0" % "compile").withExtraAttributes(pluginAttributes), - "com.jfrog.bintray.client" % "bintray-client-java-api" % "0.9.2" % "compile" - ).map(_.withIsTransitive(false)) - - test("The direct resolvers in update options should skip the rest of resolvers") { - cleanIvyCache() - val updateOptions = UpdateOptions() - val ivyModule = module(stubModule, dependencies, None, updateOptions) - val normalResolution = ivyUpdateEither(ivyModule) - assert(normalResolution.isRight) - val normalResolutionTime = - normalResolution.fold(e => throw e.resolveException, identity).stats.resolveTime - - cleanIvyCache() - val moduleResolvers = Map( - dependencies.head -> resolvers.last, - dependencies.tail.head -> resolvers.init.last - ) - val customUpdateOptions = updateOptions.withModuleResolvers(moduleResolvers) - val ivyModule2 = module(stubModule, dependencies, None, customUpdateOptions) - val fasterResolution = ivyUpdateEither(ivyModule2) - assert(fasterResolution.isRight) - val fasterResolutionTime = - fasterResolution.fold(e => throw e.resolveException, identity).stats.resolveTime - - // THis is left on purpose so that in spurious error we see the times - println(s"NORMAL RESOLUTION TIME $normalResolutionTime") - println(s"FASTER RESOLUTION TIME $fasterResolutionTime") - - // Check that faster resolution is faster - assert(fasterResolutionTime < normalResolutionTime) - } -}