Skip to content

Commit 1c60145

Browse files
authored
Merge pull request #680 from nafg/choose-mode-on-the-fly
2 parents 42f1e0d + dab3a7b commit 1c60145

File tree

1 file changed

+52
-30
lines changed

1 file changed

+52
-30
lines changed

sbtplugin/src/main/scala/com/typesafe/tools/mima/plugin/MimaPlugin.scala

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package com.typesafe.tools.mima
22
package plugin
33

4-
import sbt._, Keys._
4+
import sbt.*, Keys.*
5+
import core.*
56

67
/** MiMa's sbt plugin. */
78
object MimaPlugin extends AutoPlugin {
89
override def trigger = allRequirements
910

1011
object autoImport extends MimaKeys
11-
import autoImport._
12+
import autoImport.*
1213

1314
override def globalSettings: Seq[Def.Setting[_]] = Seq(
1415
mimaPreviousArtifacts := NoPreviousArtifacts,
@@ -38,19 +39,7 @@ object MimaPlugin extends AutoPlugin {
3839
},
3940
mimaDependencyResolution := dependencyResolution.value,
4041
mimaPreviousClassfiles := {
41-
val depRes = mimaDependencyResolution.value
42-
val taskStreams = streams.value
43-
mimaPreviousArtifacts.value match {
44-
case _: NoPreviousArtifacts.type => NoPreviousClassfiles
45-
case previousArtifacts =>
46-
previousArtifacts.iterator.map { m =>
47-
val moduleId = CrossVersion(m, scalaModuleInfo.value) match {
48-
case Some(f) => m.withName(f(m.name)).withCrossVersion(CrossVersion.disabled)
49-
case None => m
50-
}
51-
moduleId -> SbtMima.getPreviousArtifact(moduleId, depRes, taskStreams)
52-
}.toMap
53-
}
42+
artifactsToClassfiles.value.toClassfiles(mimaPreviousArtifacts.value)
5443
},
5544
mimaCurrentClassfiles := (Compile / classDirectory).value,
5645
mimaFindBinaryIssues := binaryIssuesIterator.value.toMap,
@@ -63,31 +52,64 @@ object MimaPlugin extends AutoPlugin {
6352
@deprecated("Switch to enablePlugins(MimaPlugin)", "0.7.0")
6453
def mimaDefaultSettings: Seq[Setting[_]] = globalSettings ++ buildSettings ++ projectSettings
6554

66-
private def binaryIssueFilters = Def.task {
67-
val noSigs = core.ProblemFilters.exclude[core.IncompatibleSignatureProblem]("*")
68-
mimaBinaryIssueFilters.value ++ (if (mimaReportSignatureProblems.value) Nil else Seq(noSigs))
55+
trait ArtifactsToClassfiles {
56+
def toClassfiles(previousArtifacts: Set[ModuleID]): Map[ModuleID, File]
6957
}
7058

71-
// Allows reuse between mimaFindBinaryIssues and mimaReportBinaryIssues
72-
// without blowing up the Akka build's heap
73-
private def binaryIssuesIterator = Def.task {
59+
trait BinaryIssuesFinder {
60+
def runMima(prevClassFiles: Map[ModuleID, File], checkDirection: String)
61+
: Iterator[(ModuleID, (List[Problem], List[Problem]))]
62+
}
63+
64+
val artifactsToClassfiles: Def.Initialize[Task[ArtifactsToClassfiles]] = Def.task {
65+
val depRes = mimaDependencyResolution.value
66+
val taskStreams = streams.value
67+
val smi = scalaModuleInfo.value
68+
previousArtifacts => previousArtifacts match {
69+
case _: NoPreviousArtifacts.type => NoPreviousClassfiles
70+
case previousArtifacts =>
71+
previousArtifacts.iterator.map { m =>
72+
val moduleId = CrossVersion(m, smi) match {
73+
case Some(f) => m.withName(f(m.name)).withCrossVersion(CrossVersion.disabled)
74+
case None => m
75+
}
76+
moduleId -> SbtMima.getPreviousArtifact(moduleId, depRes, taskStreams)
77+
}.toMap
78+
}
79+
}
80+
81+
val binaryIssuesFinder: Def.Initialize[Task[BinaryIssuesFinder]] = Def.task {
7482
val log = streams.value.log
75-
val prevClassfiles = mimaPreviousClassfiles.value
7683
val currClassfiles = mimaCurrentClassfiles.value
7784
val cp = (mimaFindBinaryIssues / fullClasspath).value
7885
val sv = scalaVersion.value
7986
val excludeAnnots = mimaExcludeAnnotations.value.toList
87+
val failOnNoPrevious = mimaFailOnNoPrevious.value
88+
val projName = name.value
89+
90+
(prevClassfiles, checkDirection) => {
91+
if (prevClassfiles eq NoPreviousClassfiles) {
92+
val msg = "mimaPreviousArtifacts not set, not analyzing binary compatibility"
93+
if (failOnNoPrevious) sys.error(msg) else log.info(s"$projName: $msg")
94+
} else if (prevClassfiles.isEmpty) {
95+
log.info(s"$projName: mimaPreviousArtifacts is empty, not analyzing binary compatibility.")
96+
}
8097

81-
if (prevClassfiles eq NoPreviousClassfiles) {
82-
val msg = "mimaPreviousArtifacts not set, not analyzing binary compatibility"
83-
if (mimaFailOnNoPrevious.value) sys.error(msg) else log.info(s"${name.value}: $msg")
84-
} else if (prevClassfiles.isEmpty) {
85-
log.info(s"${name.value}: mimaPreviousArtifacts is empty, not analyzing binary compatibility.")
98+
prevClassfiles.iterator.map { case (moduleId, prevClassfiles) =>
99+
moduleId -> SbtMima.runMima(prevClassfiles, currClassfiles, cp, checkDirection, sv, log, excludeAnnots)
100+
}
86101
}
102+
}
87103

88-
prevClassfiles.iterator.map { case (moduleId, prevClassfiles) =>
89-
moduleId -> SbtMima.runMima(prevClassfiles, currClassfiles, cp, mimaCheckDirection.value, sv, log, excludeAnnots)
90-
}
104+
private val binaryIssueFilters = Def.task {
105+
val noSigs = ProblemFilters.exclude[IncompatibleSignatureProblem]("*")
106+
mimaBinaryIssueFilters.value ++ (if (mimaReportSignatureProblems.value) Nil else Seq(noSigs))
107+
}
108+
109+
// Allows reuse between mimaFindBinaryIssues and mimaReportBinaryIssues
110+
// without blowing up the Akka build's heap
111+
private val binaryIssuesIterator = Def.task {
112+
binaryIssuesFinder.value.runMima(mimaPreviousClassfiles.value, mimaCheckDirection.value)
91113
}
92114

93115
// Used to differentiate unset mimaPreviousArtifacts from empty mimaPreviousArtifacts

0 commit comments

Comments
 (0)