From 7bf26b2a9be610d60d8b2d12bb23d520d8a96ebb Mon Sep 17 00:00:00 2001 From: the-ivii Date: Tue, 24 Feb 2026 15:52:33 +0530 Subject: [PATCH 1/4] Add opt-in support for TASTy-MiMa to check Scala 3 compatibility in CI --- .../org/typelevel/sbt/TypelevelCiPlugin.scala | 15 ++++++++++- docs/customization.md | 2 ++ mima/build.sbt | 1 + .../typelevel/sbt/TypelevelMimaPlugin.scala | 26 ++++++++++++++++++- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala b/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala index 877fa5f3..dc9e3a41 100644 --- a/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala +++ b/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala @@ -43,6 +43,8 @@ object TypelevelCiPlugin extends AutoPlugin { settingKey[Boolean]("Whether to do scalafix check in CI (default: false)") lazy val tlCiMimaBinaryIssueCheck = settingKey[Boolean]("Whether to do MiMa binary issues check in CI (default: false)") + lazy val tlCiTastyMimaCheck = + settingKey[Boolean]("Whether to do TASTy-MiMa issues check in CI (default: false)") lazy val tlCiDocCheck = settingKey[Boolean]("Whether to build API docs in CI (default: false)") @@ -66,6 +68,7 @@ object TypelevelCiPlugin extends AutoPlugin { tlCiJavafmtCheck := false, tlCiScalafixCheck := false, tlCiMimaBinaryIssueCheck := false, + tlCiTastyMimaCheck := false, tlCiDocCheck := false, tlCiDependencyGraphJob := true, tlCiForkCondition := "github.event.repository.fork == false", @@ -129,6 +132,16 @@ object TypelevelCiPlugin extends AutoPlugin { )) else Nil + val tastyMima = + if (tlCiTastyMimaCheck.value) + List( + WorkflowStep.Sbt( + List("tastyMiMaReportIssues"), + name = Some("Check TASTy compatibility"), + cond = Some(primaryAxisCond.value) + )) + else Nil + val doc = if (tlCiDocCheck.value) List( @@ -140,7 +153,7 @@ object TypelevelCiPlugin extends AutoPlugin { ) else Nil - style ++ scalafix ++ test ++ mima ++ doc + style ++ scalafix ++ test ++ mima ++ tastyMima ++ doc }, githubWorkflowJavaVersions := Seq(JavaSpec.temurin("8")), githubWorkflowAddedJobs ++= { diff --git a/docs/customization.md b/docs/customization.md index 3691fb25..f0ac1c5d 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -27,6 +27,7 @@ Instead of using the super-plugins, for finer-grained control you can always add - `tlVersionIntroduced` (setting): A map `scalaBinaryVersion -> version` e.g. `Map("2.13" -> "1.5.2", "3" -> "1.7.1")` used to indicate that a particular `crossScalaVersions` value was introduced in a given version (default: empty). - `tlMimaPreviousVersions` (setting): A set of previous versions to compare binary-compatibility against. +- `tlTastyMima` (setting): Enable TASTy-MiMa (default: `false`). ### sbt-typelevel-sonatype `TypelevelSonatypePlugin`: Sets up publishing to Sonatype/Maven. @@ -64,6 +65,7 @@ Both plugins are documented in [**sbt-typelevel-github-actions**](gha.md). - `tlCiJavafmtCheck` (setting): Whether to do javafmt check in CI (default: `false`). - `tlCiScalafixCheck` (setting): Whether to do scalafix check in CI (default: `false`). - `tlCiMimaBinaryIssueCheck` (setting): Whether to do MiMa binary issues check in CI (default: `false`). +- `tlCiTastyMimaCheck` (setting): Whether to do TASTy-MiMa issues check in CI (default: `false`). - `tlCiDocCheck` (setting): Whether to build API docs in CI (default: `false`). - `tlCiDependencyGraphJob` (setting): Whether to add a job to submit dependencies to GH (default: `true`). - `tlCiForkCondition` (setting): Condition for checking on CI whether this project is a fork of another (default: `github.event.repository.fork == false`). diff --git a/mima/build.sbt b/mima/build.sbt index 16ad163e..6de71d4a 100644 --- a/mima/build.sbt +++ b/mima/build.sbt @@ -1 +1,2 @@ addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.1.5") +addSbtPlugin("ch.epfl.scala" % "sbt-tasty-mima" % "1.4.0") diff --git a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala index 82fa26b2..098c793a 100644 --- a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala +++ b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala @@ -17,16 +17,18 @@ package org.typelevel.sbt import com.typesafe.tools.mima.plugin.MimaPlugin +import sbttastymima.TastyMiMaPlugin import org.typelevel.sbt.kernel.GitHelper import org.typelevel.sbt.kernel.V import sbt._ import Keys._ import MimaPlugin.autoImport._ +import TastyMiMaPlugin.autoImport._ object TypelevelMimaPlugin extends AutoPlugin { - override def requires = MimaPlugin + override def requires = MimaPlugin && TastyMiMaPlugin override def trigger = allRequirements @@ -36,6 +38,7 @@ object TypelevelMimaPlugin extends AutoPlugin { "A map scalaBinaryVersion -> version e.g. Map('2.13' -> '1.5.2', '3' -> '1.7.1') used to indicate that a particular crossScalaVersions value was introduced in a given version (default: empty).") lazy val tlMimaPreviousVersions = settingKey[Set[String]]( "A set of previous versions to compare binary-compatibility against (default: auto-populated from git tags and the tlVersionIntroduced setting)") + lazy val tlTastyMima = settingKey[Boolean]("Enable TASTy-MiMa (default: false)") } import autoImport._ @@ -85,6 +88,27 @@ object TypelevelMimaPlugin extends AutoPlugin { } else Set.empty + }, + tlTastyMima := false, + tastyMiMaReportIssues := { + if (tlTastyMima.value && publishArtifact.value) tastyMiMaReportIssues.value + else () + }, + tastyMiMaPreviousArtifacts := { + if (tlTastyMima.value && publishArtifact.value) { + tlMimaPreviousVersions + .value + .flatMap(v => V(v)) + .toList + .sorted + .lastOption + .map { v => + projectID.value.withRevision(v.toString).withExplicitArtifacts(Vector.empty) + } + .toSet + } else { + Set.empty + } } ) From 5c301482273811e791e8421e7f345cff174edc6d Mon Sep 17 00:00:00 2001 From: the-ivii Date: Wed, 25 Feb 2026 20:25:40 +0530 Subject: [PATCH 2/4] Fix scalafix error: Reorder imports in TypelevelMimaPlugin --- mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala index 098c793a..35f97329 100644 --- a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala +++ b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala @@ -17,10 +17,10 @@ package org.typelevel.sbt import com.typesafe.tools.mima.plugin.MimaPlugin -import sbttastymima.TastyMiMaPlugin import org.typelevel.sbt.kernel.GitHelper import org.typelevel.sbt.kernel.V import sbt._ +import sbttastymima.TastyMiMaPlugin import Keys._ import MimaPlugin.autoImport._ From 8073f33bc30367010b5d05958bb43169b68430b0 Mon Sep 17 00:00:00 2001 From: the-ivii Date: Wed, 25 Feb 2026 20:33:12 +0530 Subject: [PATCH 3/4] chore: add mima binary issue filter for TypelevelMimaPlugin.requires --- build.sbt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 53fd89ca..c27dc746 100644 --- a/build.sbt +++ b/build.sbt @@ -187,7 +187,13 @@ lazy val mima = project .in(file("mima")) .enablePlugins(SbtPlugin) .settings( - name := "sbt-typelevel-mima" + name := "sbt-typelevel-mima", + mimaBinaryIssueFilters ++= Seq( + ProblemFilters.exclude[IncompatibleResultTypeProblem]( + "org.typelevel.sbt.TypelevelMimaPlugin.requires"), + ProblemFilters.exclude[DirectMissingMethodProblem]( + "org.typelevel.sbt.TypelevelMimaPlugin.requires") + ) ) .dependsOn(kernel) From 12e2eab438c38e304226187489aae549595a5d28 Mon Sep 17 00:00:00 2001 From: the-ivii Date: Sun, 1 Mar 2026 19:39:58 +0530 Subject: [PATCH 4/4] handle Scala 2 via tlIsScala3 and remove redundant tlTastyMima --- docs/customization.md | 1 - .../scala/org/typelevel/sbt/TypelevelMimaPlugin.scala | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/customization.md b/docs/customization.md index f0ac1c5d..5a8c6d5c 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -27,7 +27,6 @@ Instead of using the super-plugins, for finer-grained control you can always add - `tlVersionIntroduced` (setting): A map `scalaBinaryVersion -> version` e.g. `Map("2.13" -> "1.5.2", "3" -> "1.7.1")` used to indicate that a particular `crossScalaVersions` value was introduced in a given version (default: empty). - `tlMimaPreviousVersions` (setting): A set of previous versions to compare binary-compatibility against. -- `tlTastyMima` (setting): Enable TASTy-MiMa (default: `false`). ### sbt-typelevel-sonatype `TypelevelSonatypePlugin`: Sets up publishing to Sonatype/Maven. diff --git a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala index 35f97329..e9927858 100644 --- a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala +++ b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala @@ -25,10 +25,11 @@ import sbttastymima.TastyMiMaPlugin import Keys._ import MimaPlugin.autoImport._ import TastyMiMaPlugin.autoImport._ +import TypelevelKernelPlugin.autoImport._ object TypelevelMimaPlugin extends AutoPlugin { - override def requires = MimaPlugin && TastyMiMaPlugin + override def requires = TypelevelKernelPlugin && MimaPlugin && TastyMiMaPlugin override def trigger = allRequirements @@ -38,7 +39,6 @@ object TypelevelMimaPlugin extends AutoPlugin { "A map scalaBinaryVersion -> version e.g. Map('2.13' -> '1.5.2', '3' -> '1.7.1') used to indicate that a particular crossScalaVersions value was introduced in a given version (default: empty).") lazy val tlMimaPreviousVersions = settingKey[Set[String]]( "A set of previous versions to compare binary-compatibility against (default: auto-populated from git tags and the tlVersionIntroduced setting)") - lazy val tlTastyMima = settingKey[Boolean]("Enable TASTy-MiMa (default: false)") } import autoImport._ @@ -89,13 +89,12 @@ object TypelevelMimaPlugin extends AutoPlugin { else Set.empty }, - tlTastyMima := false, tastyMiMaReportIssues := { - if (tlTastyMima.value && publishArtifact.value) tastyMiMaReportIssues.value + if (tlIsScala3.value && publishArtifact.value) tastyMiMaReportIssues.value else () }, tastyMiMaPreviousArtifacts := { - if (tlTastyMima.value && publishArtifact.value) { + if (tlIsScala3.value && publishArtifact.value) { tlMimaPreviousVersions .value .flatMap(v => V(v))