Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 32 additions & 25 deletions mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,39 @@ object TypelevelMimaPlugin extends AutoPlugin {
lazy val tlVersionIntroduced =
settingKey[Map[String, String]](
"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)")
}

import autoImport._
import TypelevelKernelPlugin.autoImport._
import TypelevelKernelPlugin.skipIfIrrelevant

override def buildSettings = Seq(
tlVersionIntroduced := Map.empty
override def buildSettings = Seq[Setting[_]](
tlVersionIntroduced := Map.empty,
tlMimaPreviousVersions := {
require(
versionScheme.value.contains("early-semver"),
"Only early-semver versioning scheme supported.")

val current = V(version.value)
// Consider it as a real release, for purposes of compat-checking
.map(_.copy(prerelease = None))
.getOrElse(sys.error(s"Version must be semver format: ${version.value}"))

val introduced = tlVersionIntroduced
.value
.get(scalaBinaryVersion.value)
.map(v => V(v).getOrElse(sys.error(s"Version must be semver format: $v")))

val previous = GitHelper
.previousReleases()
.filterNot(_.isPrerelease)
.filter(v => introduced.forall(v >= _))
.filter(current.mustBeBinCompatWith(_))

previous.map(_.toString).toSet
}
)

override def projectSettings = Seq[Setting[_]](
Expand All @@ -50,30 +75,12 @@ object TypelevelMimaPlugin extends AutoPlugin {
},
skipIfIrrelevant(mimaReportBinaryIssues),
mimaPreviousArtifacts := {
require(
versionScheme.value.contains("early-semver"),
"Only early-semver versioning scheme supported.")
if (publishArtifact.value) {
val current = V(version.value)
// Consider it as a real release, for purposes of compat-checking
.map(_.copy(prerelease = None))
.getOrElse(sys.error(s"Version must be semver format: ${version.value}"))
val introduced = tlVersionIntroduced
.value
.get(scalaBinaryVersion.value)
.map(v => V(v).getOrElse(sys.error(s"Version must be semver format: $v")))
val previous = GitHelper
.previousReleases()
.filterNot(_.isPrerelease)
.filter(v => introduced.forall(v >= _))
.filter(current.mustBeBinCompatWith(_))
previous
.map(v =>
projectID.value.withRevision(v.toString).withExplicitArtifacts(Vector.empty))
.toSet
} else {
if (publishArtifact.value)
tlMimaPreviousVersions.value.map { v =>
projectID.value.withRevision(v).withExplicitArtifacts(Vector.empty)
}
else
Set.empty
}
}
)

Expand Down