From f8d9e218306afb2441c70c6fe3c92fb9add91ec2 Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 08:27:31 +0100 Subject: [PATCH 01/12] Add Scala 3 to `core/crossScalaVersions` --- build.sbt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 7cb6d29359..66f17e5dbc 100644 --- a/build.sbt +++ b/build.sbt @@ -21,10 +21,11 @@ val moduleCrossPlatformMatrix: Map[String, List[Platform]] = Map( ) val Scala213 = "2.13.15" +val Scala3 = "3.3.4" /// sbt-typelevel configuration -ThisBuild / crossScalaVersions := Seq(Scala213) +ThisBuild / crossScalaVersions := Seq(Scala213, Scala3) ThisBuild / githubWorkflowTargetTags ++= Seq("v*") ThisBuild / githubWorkflowPublishTargetBranches := Seq( RefPredicate.Equals(Ref.Branch(mainBranch)), @@ -118,6 +119,7 @@ lazy val core = myCrossProject("core") .enablePlugins(BuildInfoPlugin, JavaAppPackaging, DockerPlugin) .settings(dockerSettings) .settings( + crossScalaVersions := Seq(Scala213, Scala3), libraryDependencies ++= Seq( Dependencies.bcprovJdk15to18, Dependencies.betterFiles, From 5aed8fe260c953baa5af03409e898884c54a3143 Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 08:29:00 +0100 Subject: [PATCH 02/12] Use `for3Use2_13` for Coursier ... since it is not available for Scala 3 --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 66f17e5dbc..662b46b514 100644 --- a/build.sbt +++ b/build.sbt @@ -131,8 +131,8 @@ lazy val core = myCrossProject("core") Dependencies.circeParser, Dependencies.circeRefined, Dependencies.commonsIo, - Dependencies.coursierCore, - Dependencies.coursierSbtMaven, + Dependencies.coursierCore.cross(CrossVersion.for3Use2_13), + Dependencies.coursierSbtMaven.cross(CrossVersion.for3Use2_13), Dependencies.cron4sCore, Dependencies.decline, Dependencies.fs2Core, From 92d358f15329f232044df0dbae1498584cad5d9d Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 08:42:14 +0100 Subject: [PATCH 03/12] Fix "discarded non-Unit value" warnings This fixes warnings like ``` -- [E175] Potential Issue Warning: modules/core/src/main/scala/org/scalasteward/core/client/ClientConfiguration.scala:52:31 52 | builder.sslParameters(params) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | discarded non-Unit value of type java.net.http.HttpClient#Builder ``` --- .../scala/org/scalasteward/core/client/ClientConfiguration.scala | 1 + .../scala/org/scalasteward/core/forge/github/GitHubAuthAlg.scala | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/core/src/main/scala/org/scalasteward/core/client/ClientConfiguration.scala b/modules/core/src/main/scala/org/scalasteward/core/client/ClientConfiguration.scala index bc28926141..1d330fd242 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/client/ClientConfiguration.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/client/ClientConfiguration.scala @@ -50,6 +50,7 @@ object ClientConfiguration { val params = javax.net.ssl.SSLContext.getDefault().getDefaultSSLParameters() params.setProtocols(params.getProtocols().filter(_ != "TLSv1.3")) builder.sslParameters(params) + () } builder.executor(exec) diff --git a/modules/core/src/main/scala/org/scalasteward/core/forge/github/GitHubAuthAlg.scala b/modules/core/src/main/scala/org/scalasteward/core/forge/github/GitHubAuthAlg.scala index 71894276da..360111d232 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/forge/github/GitHubAuthAlg.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/forge/github/GitHubAuthAlg.scala @@ -152,6 +152,7 @@ final class GitHubAuthAlg[F[_]]( val expMillis = nowMillis + ttlMillis val exp = new Date(expMillis) builder.expiration(exp) + () } builder.compact() } From 43f9ba73a0e088d47c5c587ab7cb54761696cbe8 Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 08:45:33 +0100 Subject: [PATCH 04/12] Fix `apply` auto insertion warnings This fixes warnings like ``` -- Warning: modules/core/src/main/scala/org/scalasteward/core/nurture/UpdateInfoUrlFinder.scala:92:17 92 | customUrls(CustomReleaseNotes, possibleReleaseNotesFilenames) ++ | ^^^^^^^^^^^^^^^^^^ |The method `apply` is inserted. The auto insertion will be deprecated, please write `org.scalasteward.core.nurture.UpdateInfoUrl.CustomReleaseNotes.apply` explicitly. ``` --- .../org/scalasteward/core/nurture/UpdateInfoUrlFinder.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/org/scalasteward/core/nurture/UpdateInfoUrlFinder.scala b/modules/core/src/main/scala/org/scalasteward/core/nurture/UpdateInfoUrlFinder.scala index bebf18a975..4d4009e2ce 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/nurture/UpdateInfoUrlFinder.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/nurture/UpdateInfoUrlFinder.scala @@ -89,8 +89,8 @@ object UpdateInfoUrlFinder { fileNames.map(f => wrap(forgeRepo.fileUrlFor(f))) gitHubReleaseNotesFor(forgeRepo, update.nextVersion) ++ - customUrls(CustomReleaseNotes, possibleReleaseNotesFilenames) ++ - customUrls(CustomChangelog, possibleChangelogFilenames) ++ + customUrls(CustomReleaseNotes.apply, possibleReleaseNotesFilenames) ++ + customUrls(CustomChangelog.apply, possibleChangelogFilenames) ++ possibleVersionDiffs(forgeRepo, update) } From e2fe15ca8317bfb34474b99511dfb2c8503f70d1 Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 08:53:30 +0100 Subject: [PATCH 05/12] Import `cron4s.syntax.cron._` ... to fix these errors ``` -- [E008] Not Found Error: modules/core/src/main/scala/org/scalasteward/core/repoconfig/PullRequestFrequency.scala:33:43 33 | case CronExpr(expr) => expr.datePart.allOf(now.toLocalDateTime) | ^^^^^^^^^^^^^^^^^^^ |value allOf is not a member of cron4s.expr.DateCronExpr, but could be made available as an extension method. -- [E008] Not Found Error: modules/core/src/main/scala/org/scalasteward/core/repoconfig/PullRequestFrequency.scala:41:34 41 | case CronExpr(expr) => expr.next(lastCreated.toLocalDateTime).map(Timestamp.fromLocalDateTime) | ^^^^^^^^^ |value next is not a member of cron4s.CronExpr, but could be made available as an extension method. ``` --- .../org/scalasteward/core/repoconfig/PullRequestFrequency.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/core/src/main/scala/org/scalasteward/core/repoconfig/PullRequestFrequency.scala b/modules/core/src/main/scala/org/scalasteward/core/repoconfig/PullRequestFrequency.scala index 57ddbcdefd..0761dfd8e9 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/repoconfig/PullRequestFrequency.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/repoconfig/PullRequestFrequency.scala @@ -19,6 +19,7 @@ package org.scalasteward.core.repoconfig import cats.Eq import cats.syntax.all._ import cron4s.lib.javatime._ +import cron4s.syntax.cron._ import io.circe.{Decoder, Encoder} import org.scalasteward.core.repoconfig.PullRequestFrequency._ import org.scalasteward.core.util.Timestamp From 600bbb9d5a017abc1c5abc3c4b2a716ab11c2a13 Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 09:26:38 +0100 Subject: [PATCH 06/12] Fix "Unused Symbol Warning" This fixes ``` -- [E198] Unused Symbol Warning: modules/core/src/main/scala/org/scalasteward/core/repoconfig/UpdatesConfig.scala:29:54 29 |import org.scalasteward.core.repoconfig.UpdatesConfig.defaultLimit | ^^^^^^^^^^^^ | unused import ``` --- .../scala/org/scalasteward/core/repoconfig/UpdatesConfig.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/org/scalasteward/core/repoconfig/UpdatesConfig.scala b/modules/core/src/main/scala/org/scalasteward/core/repoconfig/UpdatesConfig.scala index 624ae2112e..eacdcc9a3a 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/repoconfig/UpdatesConfig.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/repoconfig/UpdatesConfig.scala @@ -26,7 +26,6 @@ import org.scalasteward.core.buildtool.maven.pomXmlName import org.scalasteward.core.buildtool.mill.MillAlg import org.scalasteward.core.buildtool.sbt.buildPropertiesName import org.scalasteward.core.data.{GroupId, Update} -import org.scalasteward.core.repoconfig.UpdatesConfig.defaultLimit import org.scalasteward.core.scalafmt.scalafmtConfName import org.scalasteward.core.update.FilterAlg.{ FilterResult, @@ -42,7 +41,7 @@ final case class UpdatesConfig( private val allowPreReleases: Option[List[UpdatePattern]] = None, private val ignore: Option[List[UpdatePattern]] = None, private val retracted: Option[List[RetractedArtifact]] = None, - limit: Option[NonNegInt] = defaultLimit, + limit: Option[NonNegInt] = UpdatesConfig.defaultLimit, private val fileExtensions: Option[List[String]] = None ) { private[repoconfig] def pinOrDefault: List[UpdatePattern] = From b006125a1d560af9330ea8f21def09acc845b61d Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 09:29:26 +0100 Subject: [PATCH 07/12] Import `MockEffOps` ... to fix ``` -- [E008] Not Found Error: modules/core/src/test/scala/org/scalasteward/core/BuiltinConfigFilesTest.scala:37:9 35 | val migrations = artifactMigrationsLoader 36 | .loadAll(ArtifactCfg(List(), disableDefaults = false)) 37 | .runA(initialState) | ^ |value runA is not a member of org.scalasteward.core.mock.MockEff[ | List[org.scalasteward.core.update.artifact.ArtifactChange]], but could be made available as an extension method. | |The following import might fix the problem: | | import org.scalasteward.core.mock.MockEffOps ``` --- .../scala/org/scalasteward/core/BuiltinConfigFilesTest.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/core/src/test/scala/org/scalasteward/core/BuiltinConfigFilesTest.scala b/modules/core/src/test/scala/org/scalasteward/core/BuiltinConfigFilesTest.scala index 35fcb58361..644bf0a513 100644 --- a/modules/core/src/test/scala/org/scalasteward/core/BuiltinConfigFilesTest.scala +++ b/modules/core/src/test/scala/org/scalasteward/core/BuiltinConfigFilesTest.scala @@ -12,6 +12,7 @@ import org.scalasteward.core.mock.MockContext.context.{ scalafixMigrationsLoader } import org.scalasteward.core.mock.MockContext.mockState +import org.scalasteward.core.mock.MockEffOps import org.scalasteward.core.repoconfig.RepoConfigLoader import org.scalasteward.core.update.artifact.ArtifactMigrationsLoader import scala.util.{Failure, Success, Try} From 9254cb0dccfee034db11e0e3c311eade20e7aaa5 Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 09:33:16 +0100 Subject: [PATCH 08/12] Fix ambiguous `uri` reference This fixes ``` -- [E178] Type Error: modules/core/src/test/scala/org/scalasteward/core/util/uriTest.scala:11:6 11 | uri.withUserInfo.replace(UserInfo("user", Some("pass")))(url).toString, | ^^^ | missing argument list for method uri in trait LiteralsSyntax | | inline def uri(ctx: StringContext)(args: Any*): org.http4s.Uri | | longer explanation available when compiling with `-explain` ``` which was caused by the ambiguous `uri` reference. --- .../test/scala/org/scalasteward/core/util/uriTest.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/core/src/test/scala/org/scalasteward/core/util/uriTest.scala b/modules/core/src/test/scala/org/scalasteward/core/util/uriTest.scala index 920509f724..01fb2a24eb 100644 --- a/modules/core/src/test/scala/org/scalasteward/core/util/uriTest.scala +++ b/modules/core/src/test/scala/org/scalasteward/core/util/uriTest.scala @@ -3,13 +3,13 @@ package org.scalasteward.core.util import munit.FunSuite import org.http4s.Uri.UserInfo import org.http4s.syntax.literals._ +import org.scalasteward.core.util class uriTest extends FunSuite { test("withUserInfo") { val url = uri"https://api.github.com/repos/" - assertEquals( - uri.withUserInfo.replace(UserInfo("user", Some("pass")))(url).toString, - "https://user:pass@api.github.com/repos/" - ) + val obtained = util.uri.withUserInfo.replace(UserInfo("user", Some("pass")))(url).toString + val expected = "https://user:pass@api.github.com/repos/" + assertEquals(obtained, expected) } } From a9dc6d3f6be0bf34cb66ac5b7a51551806e3394d Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 09:37:22 +0100 Subject: [PATCH 09/12] Add Scala 3 to `benchmark/crossScalaVersions` --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index 662b46b514..a0344d8de1 100644 --- a/build.sbt +++ b/build.sbt @@ -110,6 +110,7 @@ lazy val benchmark = myCrossProject("benchmark") .enablePlugins(JmhPlugin) .settings(noPublishSettings) .settings( + crossScalaVersions := Seq(Scala213, Scala3), scalacOptions -= "-Wnonunit-statement", coverageEnabled := false, unusedCompileDependencies := Set.empty From ea4f1a9dd7b8a7c7591559a7c780b481b4393afd Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 12:06:59 +0100 Subject: [PATCH 10/12] Add `-tasty-reader` to `doc/scalacOptions` Adding Scala 3 to `doc/crossScalaVersions` results in the following error ``` sbt:scala-steward> doc/mdoc [error] Modules were resolved with conflicting cross-version suffixes in ProjectRef(uri("."), "docs"): [error] org.scala-lang.modules:scala-collection-compat _3, _2.13 [error] com.github.plokhotnyuk.jsoniter-scala:jsoniter-scala-core _3, _2.13 ``` which I believe is due to using `for3Use2_13` for Coursier. I therefore kept the `doc` project Scala 2-only and added the `-tasty-reader` scalac option to prevent this error ``` sbt:scala-steward> doc/mdoc [info] running mdoc.SbtMain error: error while loading Cli, Missing dependency 'Add -Ytasty-reader to scalac options to parse the TASTy in modules/core/.jvm/target/scala-3.3.4/classes/org/scalasteward/core/application/Cli.tasty', required by modules/core/.jvm/target/scala-3.3.4/classes/org/scalasteward/core/application/Cli.tasty [error] java.lang.RuntimeException: mdoc failed ``` --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index a0344d8de1..4742c0ead5 100644 --- a/build.sbt +++ b/build.sbt @@ -247,6 +247,7 @@ lazy val docs = myCrossProject("docs") .enablePlugins(MdocPlugin) .settings(noPublishSettings) .settings( + scalacOptions += "-Ytasty-reader", mdocIn := baseDirectory.value / ".." / "mdoc", mdocOut := (LocalRootProject / baseDirectory).value / "docs", mdocVariables := Map( From 176f10ad0b6badd98b5355cae7694cfe90cb3771 Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 12:14:35 +0100 Subject: [PATCH 11/12] Refresh GitHub workflow --- .github/workflows/ci.yml | 12 +++++++++++- .mergify.yml | 3 +++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e147c7de7d..7b92d619ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: strategy: matrix: os: [ubuntu-22.04] - scala: [2.13] + scala: [2.13, 3] java: [temurin@21, temurin@17, temurin@11] runs-on: ${{ matrix.os }} timeout-minutes: 60 @@ -177,6 +177,16 @@ jobs: tar xf targets.tar rm targets.tar + - name: Download target directories (3) + uses: actions/download-artifact@v4 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-3 + + - name: Inflate target directories (3) + run: | + tar xf targets.tar + rm targets.tar + - name: Publish JARs env: PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} diff --git a/.mergify.yml b/.mergify.yml index dbcbb8e87f..86c8a5f779 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -24,6 +24,9 @@ pull_request_rules: - status-success=Test (ubuntu-22.04, 2.13, temurin@21) - status-success=Test (ubuntu-22.04, 2.13, temurin@17) - status-success=Test (ubuntu-22.04, 2.13, temurin@11) + - status-success=Test (ubuntu-22.04, 3, temurin@21) + - status-success=Test (ubuntu-22.04, 3, temurin@17) + - status-success=Test (ubuntu-22.04, 3, temurin@11) actions: merge: method: merge From 4bf0b66dbd72a6e2018ff19a22d0af468fdb5a9a Mon Sep 17 00:00:00 2001 From: Frank Thomas Date: Tue, 7 Jan 2025 12:18:11 +0100 Subject: [PATCH 12/12] Workaround for sbt-explicit-dependencies and `for3Use2_13` --- build.sbt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.sbt b/build.sbt index 4742c0ead5..5304ef626a 100644 --- a/build.sbt +++ b/build.sbt @@ -161,6 +161,9 @@ lazy val core = myCrossProject("core") Dependencies.refinedScalacheck % Test, Dependencies.scalacheck % Test ), + // Workaround for https://github.com/cb372/sbt-explicit-dependencies/issues/117 + unusedCompileDependenciesFilter -= + moduleFilter(organization = Dependencies.coursierCore.organization), assembly / test := {}, assembly / assemblyMergeStrategy := { case PathList("META-INF", "versions", "9", "module-info.class") =>