1
1
package com .typesafe .tools .mima
2
2
package plugin
3
3
4
- import sbt ._ , Keys ._
4
+ import sbt .* , Keys .*
5
+ import core .*
5
6
6
7
/** MiMa's sbt plugin. */
7
8
object MimaPlugin extends AutoPlugin {
8
9
override def trigger = allRequirements
9
10
10
11
object autoImport extends MimaKeys
11
- import autoImport ._
12
+ import autoImport .*
12
13
13
14
override def globalSettings : Seq [Def .Setting [_]] = Seq (
14
15
mimaPreviousArtifacts := NoPreviousArtifacts ,
@@ -38,19 +39,7 @@ object MimaPlugin extends AutoPlugin {
38
39
},
39
40
mimaDependencyResolution := dependencyResolution.value,
40
41
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)
54
43
},
55
44
mimaCurrentClassfiles := (Compile / classDirectory).value,
56
45
mimaFindBinaryIssues := binaryIssuesIterator.value.toMap,
@@ -63,31 +52,64 @@ object MimaPlugin extends AutoPlugin {
63
52
@ deprecated(" Switch to enablePlugins(MimaPlugin)" , " 0.7.0" )
64
53
def mimaDefaultSettings : Seq [Setting [_]] = globalSettings ++ buildSettings ++ projectSettings
65
54
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 ]
69
57
}
70
58
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 {
74
82
val log = streams.value.log
75
- val prevClassfiles = mimaPreviousClassfiles.value
76
83
val currClassfiles = mimaCurrentClassfiles.value
77
84
val cp = (mimaFindBinaryIssues / fullClasspath).value
78
85
val sv = scalaVersion.value
79
86
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
+ }
80
97
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
+ }
86
101
}
102
+ }
87
103
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)
91
113
}
92
114
93
115
// Used to differentiate unset mimaPreviousArtifacts from empty mimaPreviousArtifacts
0 commit comments