@@ -5,6 +5,7 @@ import mill._
5
5
import mill .api .{Loose , PathRef }
6
6
import mill .contrib .scoverage .api .ScoverageReportWorkerApi .ReportType
7
7
import mill .define .{Command , Persistent , Sources , Target , Task }
8
+ import mill .scalalib .api .ZincWorkerUtil
8
9
import mill .scalalib .{Dep , DepSyntax , JavaModule , ScalaModule }
9
10
10
11
/**
@@ -56,11 +57,38 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
56
57
*/
57
58
def scoverageVersion : T [String ]
58
59
60
+ private def isScoverage2 : Task [Boolean ] = T .task { scoverageVersion().startsWith(" 2." ) }
61
+
62
+ /** Binary compatibility shim. */
63
+ @ deprecated(" Use scoverageRuntimeDeps instead." , " Mill after 0.10.7" )
59
64
def scoverageRuntimeDep : T [Dep ] = T {
60
- ivy " org.scoverage::scalac-scoverage-runtime: ${outer.scoverageVersion()}"
65
+ T .log.error(" scoverageRuntimeDep is no longer used. To customize your module, use scoverageRuntimeDeps." )
66
+ scoverageRuntimeDeps().toIndexedSeq.head
67
+ }
68
+
69
+ def scoverageRuntimeDeps : T [Agg [Dep ]] = T {
70
+ Agg (ivy " org.scoverage::scalac-scoverage-runtime: ${outer.scoverageVersion()}" )
61
71
}
72
+
73
+ /** Binary compatibility shim. */
74
+ @ deprecated(" Use scoveragePluginDeps instead." , " Mill after 0.10.7" )
62
75
def scoveragePluginDep : T [Dep ] = T {
63
- ivy " org.scoverage:::scalac-scoverage-plugin: ${outer.scoverageVersion()}"
76
+ T .log.error(" scoveragePluginDep is no longer used. To customize your module, use scoverageRuntimeDeps." )
77
+ scoveragePluginDeps().toIndexedSeq.head
78
+ }
79
+
80
+ def scoveragePluginDeps : T [Agg [Dep ]] = T {
81
+ val sv = scoverageVersion()
82
+ if (isScoverage2()) {
83
+ Agg (
84
+ ivy " org.scoverage:::scalac-scoverage-plugin: ${sv}" ,
85
+ ivy " org.scoverage::scalac-scoverage-domain: ${sv}" ,
86
+ ivy " org.scoverage::scalac-scoverage-serializer: ${sv}" ,
87
+ ivy " org.scoverage::scalac-scoverage-reporter: ${sv}"
88
+ )
89
+ } else {
90
+ Agg (ivy " org.scoverage:::scalac-scoverage-plugin: ${sv}" )
91
+ }
64
92
}
65
93
66
94
@ deprecated(" Use scoverageToolsClasspath instead." , " mill after 0.10.0-M1" )
@@ -71,23 +99,44 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
71
99
def scoverageToolsClasspath : T [Agg [PathRef ]] = T {
72
100
scoverageReportWorkerClasspath() ++
73
101
resolveDeps(T .task {
74
- Agg (
75
- ivy " org.scoverage:scalac-scoverage-plugin_ ${mill.BuildInfo .scalaVersion}: ${outer.scoverageVersion()}"
76
- )
102
+ // we need to resolve with same Scala version used for Mill, not the project Scala version
103
+ val scalaBinVersion = ZincWorkerUtil .scalaBinaryVersion(BuildInfo .scalaVersion)
104
+ val sv = scoverageVersion()
105
+ if (isScoverage2()) {
106
+ Agg (
107
+ ivy " org.scoverage:scalac-scoverage-plugin_ ${mill.BuildInfo .scalaVersion}: ${sv}" ,
108
+ ivy " org.scoverage:scalac-scoverage-domain_ ${scalaBinVersion}: ${sv}" ,
109
+ ivy " org.scoverage:scalac-scoverage-serializer_ ${scalaBinVersion}: ${sv}" ,
110
+ ivy " org.scoverage:scalac-scoverage-reporter_ ${scalaBinVersion}: ${sv}"
111
+ )
112
+ } else {
113
+ Agg (
114
+ ivy " org.scoverage:scalac-scoverage-plugin_ ${mill.BuildInfo .scalaVersion}: ${sv}"
115
+ )
116
+ }
77
117
})()
78
118
}
79
119
80
120
def scoverageClasspath : T [Agg [PathRef ]] = T {
81
- resolveDeps(T .task { Agg (scoveragePluginDep()) } )()
121
+ resolveDeps(scoveragePluginDeps )()
82
122
}
83
123
84
124
def scoverageReportWorkerClasspath : T [Agg [PathRef ]] = T {
85
- val workerKey = " MILL_SCOVERAGE_REPORT_WORKER"
125
+ val isScov2 = isScoverage2()
126
+
127
+ val workerKey =
128
+ if (isScov2) " MILL_SCOVERAGE2_REPORT_WORKER"
129
+ else " MILL_SCOVERAGE_REPORT_WORKER"
130
+
131
+ val workerArtifact =
132
+ if (isScov2) " mill-contrib-scoverage-worker2"
133
+ else " mill-contrib-scoverage-worker"
134
+
86
135
mill.modules.Util .millProjectModule(
87
136
workerKey,
88
- s " mill-contrib-scoverage-worker " ,
137
+ workerArtifact ,
89
138
repositoriesTask(),
90
- resolveFilter = _.toString.contains(" mill-contrib-scoverage-worker " )
139
+ resolveFilter = _.toString.contains(workerArtifact )
91
140
)
92
141
}
93
142
@@ -98,7 +147,7 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
98
147
ScoverageReportWorker
99
148
.scoverageReportWorker()
100
149
.bridge(scoverageToolsClasspath().map(_.path))
101
- .report(reportType, allSources().map(_.path), Seq (data().path))
150
+ .report(reportType, allSources().map(_.path), Seq (data().path), T .workspace )
102
151
}
103
152
104
153
/**
@@ -121,16 +170,20 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
121
170
override def repositoriesTask : Task [Seq [Repository ]] = T .task { outer.repositoriesTask() }
122
171
override def compileIvyDeps : Target [Loose .Agg [Dep ]] = T { outer.compileIvyDeps() }
123
172
override def ivyDeps : Target [Loose .Agg [Dep ]] =
124
- T { outer.ivyDeps() ++ Agg ( outer.scoverageRuntimeDep() ) }
173
+ T { outer.ivyDeps() ++ outer.scoverageRuntimeDeps( ) }
125
174
override def unmanagedClasspath : Target [Loose .Agg [PathRef ]] = T { outer.unmanagedClasspath() }
126
175
127
176
/** Add the scoverage scalac plugin. */
128
177
override def scalacPluginIvyDeps : Target [Loose .Agg [Dep ]] =
129
- T { outer.scalacPluginIvyDeps() ++ Agg ( outer.scoveragePluginDep() ) }
178
+ T { outer.scalacPluginIvyDeps() ++ outer.scoveragePluginDeps( ) }
130
179
131
180
/** Add the scoverage specific plugin settings (`dataDir`). */
132
181
override def scalacOptions : Target [Seq [String ]] =
133
- T { outer.scalacOptions() ++ Seq (s " -P:scoverage:dataDir: ${data().path.toIO.getPath()}" ) }
182
+ T {
183
+ outer.scalacOptions() ++
184
+ Seq (s " -P:scoverage:dataDir: ${data().path.toIO.getPath()}" ) ++
185
+ (if (isScoverage2()) Seq (s " -P:scoverage:sourceRoot: ${T .workspace}" ) else Seq ())
186
+ }
134
187
135
188
def htmlReport (): Command [Unit ] = T .command { doReport(ReportType .Html ) }
136
189
def xmlReport (): Command [Unit ] = T .command { doReport(ReportType .Xml ) }
@@ -142,15 +195,15 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
142
195
trait ScoverageTests extends outer.Tests {
143
196
override def upstreamAssemblyClasspath = T {
144
197
super .upstreamAssemblyClasspath() ++
145
- resolveDeps(T .task { Agg ( outer.scoverageRuntimeDep()) } )()
198
+ resolveDeps(outer.scoverageRuntimeDeps )()
146
199
}
147
200
override def compileClasspath = T {
148
201
super .compileClasspath() ++
149
- resolveDeps(T .task { Agg ( outer.scoverageRuntimeDep()) } )()
202
+ resolveDeps(outer.scoverageRuntimeDeps )()
150
203
}
151
204
override def runClasspath = T {
152
205
super .runClasspath() ++
153
- resolveDeps(T .task { Agg ( outer.scoverageRuntimeDep()) } )()
206
+ resolveDeps(outer.scoverageRuntimeDeps )()
154
207
}
155
208
156
209
// Need the sources compiled with scoverage instrumentation to run.
0 commit comments