From e9d00273f4a56a6fd21fbc8295fbd06cfe62e3d8 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sun, 20 Feb 2022 10:52:18 +0000 Subject: [PATCH 1/2] Add tlMimaPreviousVersions setting --- .../typelevel/sbt/TypelevelMimaPlugin.scala | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala index 9df7acdf..02bbd379 100644 --- a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala +++ b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala @@ -32,49 +32,57 @@ 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 projectSettings = Seq[Setting[_]]( - mimaReportBinaryIssues := { - if (tlSkipIrrelevantScalas.value && (mimaReportBinaryIssues / skip).value) - () - else mimaReportBinaryIssues.value - }, - skipIfIrrelevant(mimaReportBinaryIssues), - mimaPreviousArtifacts := { + override def buildSettings = Seq[Setting[_]]( + tlVersionIntroduced := Map.empty, + tlMimaPreviousVersions := { 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 + + previous.map(_.toString).toSet } else { Set.empty } } ) + override def projectSettings = Seq[Setting[_]]( + mimaReportBinaryIssues := { + if (tlSkipIrrelevantScalas.value && (mimaReportBinaryIssues / skip).value) + () + else mimaReportBinaryIssues.value + }, + skipIfIrrelevant(mimaReportBinaryIssues), + mimaPreviousArtifacts := { + tlMimaPreviousVersions.value.map { v => + projectID.value.withRevision(v).withExplicitArtifacts(Vector.empty) + } + } + ) + } From 53ae5d80b505aeeb36316a52444693f87d710fc6 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sun, 20 Feb 2022 11:07:58 +0000 Subject: [PATCH 2/2] Keep no-publish check scoped to project settings --- .../typelevel/sbt/TypelevelMimaPlugin.scala | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala index 02bbd379..970552cd 100644 --- a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala +++ b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala @@ -47,27 +47,23 @@ object TypelevelMimaPlugin extends AutoPlugin { 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 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 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(_)) + val previous = GitHelper + .previousReleases() + .filterNot(_.isPrerelease) + .filter(v => introduced.forall(v >= _)) + .filter(current.mustBeBinCompatWith(_)) - previous.map(_.toString).toSet - } else { - Set.empty - } + previous.map(_.toString).toSet } ) @@ -79,9 +75,12 @@ object TypelevelMimaPlugin extends AutoPlugin { }, skipIfIrrelevant(mimaReportBinaryIssues), mimaPreviousArtifacts := { - tlMimaPreviousVersions.value.map { v => - projectID.value.withRevision(v).withExplicitArtifacts(Vector.empty) - } + if (publishArtifact.value) + tlMimaPreviousVersions.value.map { v => + projectID.value.withRevision(v).withExplicitArtifacts(Vector.empty) + } + else + Set.empty } )