Skip to content

Commit 917a024

Browse files
committed
WIP: rework scoverage worker
1 parent d0a4153 commit 917a024

File tree

7 files changed

+165
-80
lines changed

7 files changed

+165
-80
lines changed

contrib/package.mill

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,17 +130,17 @@ object `package` extends RootModule {
130130

131131
// TODO: (Scala 3) temporarily disable until decision on compatibility with Scala 3
132132
// Worker for Scoverage 1.x
133-
// object worker extends build.MillPublishScalaModule {
134-
// // scoverage is on an old Scala version which doesnt support scalafix
135-
// def fix(args: String*): Command[Unit] = T.command {}
136-
// def compileModuleDeps = Seq(build.main.api)
137-
// def moduleDeps = Seq(scoverage.api)
138-
// def testDepPaths = T { Seq(compile().classes) }
139-
140-
// // compile-time only, need to provide the correct scoverage version at runtime
141-
// def compileIvyDeps = Agg(build.Deps.scalacScoveragePlugin)
142-
// def scalaVersion = build.Deps.scalaVersionForScoverageWorker1
143-
// }
133+
object worker extends build.MillPublishScalaModule {
134+
// scoverage is on an old Scala version which doesnt support scalafix
135+
def fix(args: String*): Command[Unit] = T.command {}
136+
def compileModuleDeps = Seq(build.main.api)
137+
def moduleDeps = Seq(scoverage.api)
138+
def testDepPaths = T { Seq(compile().classes) }
139+
140+
// compile-time only, need to provide the correct scoverage version at runtime
141+
def compileIvyDeps = Agg(build.Deps.scalacScoveragePlugin)
142+
def scalaVersion = build.Deps.scalaVersionForScoverageWorker1
143+
}
144144

145145
// Worker for Scoverage 2.0
146146
object worker2 extends build.MillPublishScalaModule {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package mill.contrib.scoverage.api;
2+
3+
public abstract class FileReportType extends ReportType {
4+
private final String folderName;
5+
6+
/*private[api]*/
7+
FileReportType(String name, String folderName) {
8+
super(name);
9+
this.folderName = folderName;
10+
}
11+
12+
public String folderName() {
13+
return folderName;
14+
}
15+
16+
/* private[api]*/
17+
static final FileReportType _Html =
18+
new FileReportType("Html", "htmlReport") {};
19+
20+
/* private[api]*/
21+
static final FileReportType _Xml =
22+
new FileReportType("Xml", "xmlReport") {};
23+
24+
/* private[api]*/
25+
static final FileReportType _XmlCobertura =
26+
new FileReportType("XmlCobertura", "xmlCoberturaReport") {};
27+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package mill.contrib.scoverage.api;
2+
3+
public abstract class ReportType {
4+
private String name;
5+
6+
/*private[api]*/
7+
ReportType(String name) {}
8+
9+
public static final ReportType Console = new ReportType("Console") {};
10+
public static final FileReportType Html = FileReportType._Html;
11+
public static final FileReportType Xml = FileReportType._Xml;
12+
public static final FileReportType XmlCobertura = FileReportType._XmlCobertura;
13+
14+
@Override
15+
public String toString() {
16+
return name;
17+
}
18+
}
Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,46 @@
1-
package mill.contrib.scoverage.api
1+
// package mill.contrib.scoverage.api
22

3-
import mill.api.Ctx
3+
// import mill.api.Ctx
44

5-
trait ScoverageReportWorkerApi {
6-
import ScoverageReportWorkerApi._
5+
// trait ScoverageReportWorkerApi {
6+
// import ScoverageReportWorkerApi._
77

8-
@deprecated("Use other overload instead.", "Mill after 0.10.7")
9-
def report(
10-
reportType: ReportType,
11-
sources: Seq[os.Path],
12-
dataDirs: Seq[os.Path]
13-
)(implicit
14-
ctx: Ctx
15-
): Unit = {
16-
report(reportType, sources, dataDirs, ctx.workspace)
17-
}
8+
// @deprecated("Use other overload instead.", "Mill after 0.10.7")
9+
// def report(
10+
// reportType: ReportType,
11+
// sources: Seq[os.Path],
12+
// dataDirs: Seq[os.Path]
13+
// )(implicit
14+
// ctx: Ctx
15+
// ): Unit = {
16+
// report(reportType, sources, dataDirs, ctx.workspace)
17+
// }
1818

19-
def report(
20-
reportType: ReportType,
21-
sources: Seq[os.Path],
22-
dataDirs: Seq[os.Path],
23-
sourceRoot: os.Path
24-
)(implicit
25-
ctx: Ctx
26-
): Unit = {
27-
// FIXME: We only call the deprecated version here, to preserve binary compatibility. Remove when appropriate.
28-
ctx.log.error(
29-
"Binary compatibility stub may cause infinite loops with StackOverflowError. You need to implement: def report(ReportType, Seq[Path], Seq[Path], os.Path): Unit"
30-
)
31-
report(reportType, sources, dataDirs)
32-
}
33-
}
19+
// def report(
20+
// reportType: ReportType,
21+
// sources: Seq[os.Path],
22+
// dataDirs: Seq[os.Path],
23+
// sourceRoot: os.Path
24+
// )(implicit
25+
// ctx: Ctx
26+
// ): Unit = {
27+
// // FIXME: We only call the deprecated version here, to preserve binary compatibility. Remove when appropriate.
28+
// ctx.log.error(
29+
// "Binary compatibility stub may cause infinite loops with StackOverflowError. You need to implement: def report(ReportType, Seq[Path], Seq[Path], os.Path): Unit"
30+
// )
31+
// report(reportType, sources, dataDirs)
32+
// }
33+
// }
3434

35-
object ScoverageReportWorkerApi {
36-
sealed trait ReportType
37-
sealed trait FileReportType extends ReportType { def folderName: String }
38-
object ReportType {
39-
final case object Html extends FileReportType { val folderName: String = "htmlReport" }
40-
final case object Xml extends FileReportType { val folderName: String = "xmlReport" }
41-
final case object XmlCobertura extends FileReportType {
42-
val folderName: String = "xmlCoberturaReport"
43-
}
44-
final case object Console extends ReportType
45-
}
46-
}
35+
// object ScoverageReportWorkerApi {
36+
// sealed trait ReportType
37+
// sealed trait FileReportType extends ReportType { def folderName: String }
38+
// object ReportType {
39+
// final case object Html extends FileReportType { val folderName: String = "htmlReport" }
40+
// final case object Xml extends FileReportType { val folderName: String = "xmlReport" }
41+
// final case object XmlCobertura extends FileReportType {
42+
// val folderName: String = "xmlCoberturaReport"
43+
// }
44+
// final case object Console extends ReportType
45+
// }
46+
// }
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package mill.contrib.scoverage.api;
2+
3+
import java.nio.file.Path;
4+
import java.nio.file.Files;
5+
import java.io.IOException;
6+
7+
public interface ScoverageReportWorkerApi2 {
8+
9+
interface Logger {
10+
void info(String msg);
11+
void error(String msg);
12+
void debug(String msg);
13+
void warn(String msg);
14+
}
15+
16+
interface Ctx {
17+
Logger log();
18+
Path dest();
19+
}
20+
21+
void report(ReportType reportType, Path[] sources, Path[] dataDirs, Path sourceRoot, Ctx ctx);
22+
23+
static void makeAllDirs(Path path) throws IOException {
24+
// Replicate behavior of `os.makeDir.all(path)`
25+
if (Files.isDirectory(path) && Files.isSymbolicLink(path)) {
26+
// do nothing
27+
} else {
28+
Files.createDirectories(path);
29+
}
30+
}
31+
32+
}

contrib/scoverage/worker/src/mill/contrib/scoverage/worker/ScoverageReportWorkerImpl.scala

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,47 @@
11
package mill.contrib.scoverage.worker
22

3-
import mill.contrib.scoverage.api.ScoverageReportWorkerApi
43
import _root_.scoverage.report.{
54
CoberturaXmlWriter,
65
CoverageAggregator,
76
ScoverageHtmlWriter,
87
ScoverageXmlWriter
98
}
10-
import mill.api.Ctx
11-
import mill.contrib.scoverage.api.ScoverageReportWorkerApi.ReportType
9+
10+
import mill.contrib.scoverage.api.ScoverageReportWorkerApi2
11+
import mill.contrib.scoverage.api.ReportType
12+
import ScoverageReportWorkerApi2.Ctx
13+
14+
import java.nio.file.Path
1215

1316
/**
1417
* Scoverage Worker for Scoverage 1.x
1518
*/
16-
class ScoverageReportWorkerImpl extends ScoverageReportWorkerApi {
19+
class ScoverageReportWorkerImpl extends ScoverageReportWorkerApi2 {
1720

1821
override def report(
1922
reportType: ReportType,
20-
sources: Seq[os.Path],
21-
dataDirs: Seq[os.Path],
23+
sources: Array[Path],
24+
dataDirs: Array[Path],
2225
// ignored in Scoverage 1.x
23-
sourceRoot: os.Path
24-
)(implicit ctx: Ctx): Unit =
26+
sourceRoot: Path,
27+
ctx: Ctx
28+
): Unit =
2529
try {
2630
ctx.log.info(s"Processing coverage data for ${dataDirs.size} data locations")
27-
CoverageAggregator.aggregate(dataDirs.map(_.toIO)) match {
31+
CoverageAggregator.aggregate(dataDirs.map(_.toFile).toIndexedSeq) match {
2832
case Some(coverage) =>
29-
val sourceFolders = sources.map(_.toIO)
33+
val sourceFolders = sources.map(_.toFile).toIndexedSeq
3034
val folder = ctx.dest
31-
os.makeDir.all(folder)
35+
ScoverageReportWorkerApi2.makeAllDirs(folder)
3236
reportType match {
3337
case ReportType.Html =>
34-
new ScoverageHtmlWriter(sourceFolders, folder.toIO, None)
38+
new ScoverageHtmlWriter(sourceFolders, folder.toFile, None)
3539
.write(coverage)
3640
case ReportType.Xml =>
37-
new ScoverageXmlWriter(sourceFolders, folder.toIO, false)
41+
new ScoverageXmlWriter(sourceFolders, folder.toFile, false)
3842
.write(coverage)
3943
case ReportType.XmlCobertura =>
40-
new CoberturaXmlWriter(sourceFolders, folder.toIO)
44+
new CoberturaXmlWriter(sourceFolders, folder.toFile)
4145
.write(coverage)
4246
case ReportType.Console =>
4347
ctx.log.info(s"Statement coverage.: ${coverage.statementCoverageFormatted}%")

contrib/scoverage/worker2/src/mill/contrib/scoverage/worker/ScoverageReportWorkerImpl.scala

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,46 @@
11
package mill.contrib.scoverage.worker
22

3-
import mill.contrib.scoverage.api.ScoverageReportWorkerApi
43
import _root_.scoverage.reporter.{
54
CoberturaXmlWriter,
65
CoverageAggregator,
76
ScoverageHtmlWriter,
87
ScoverageXmlWriter
98
}
10-
import mill.api.Ctx
11-
import mill.contrib.scoverage.api.ScoverageReportWorkerApi.ReportType
9+
10+
import mill.contrib.scoverage.api.ScoverageReportWorkerApi2
11+
import mill.contrib.scoverage.api.ReportType
12+
import ScoverageReportWorkerApi2.Ctx
13+
14+
import java.nio.file.Path
1215

1316
/**
1417
* Scoverage Worker for Scoverage 2.x
1518
*/
16-
class ScoverageReportWorkerImpl extends ScoverageReportWorkerApi {
19+
class ScoverageReportWorkerImpl extends ScoverageReportWorkerApi2 {
1720

1821
override def report(
1922
reportType: ReportType,
20-
sources: Seq[os.Path],
21-
dataDirs: Seq[os.Path],
22-
sourceRoot: os.Path
23-
)(implicit ctx: Ctx): Unit =
23+
sources: Array[Path],
24+
dataDirs: Array[Path],
25+
sourceRoot: Path,
26+
ctx: Ctx
27+
): Unit =
2428
try {
2529
ctx.log.info(s"Processing coverage data for ${dataDirs.size} data locations")
26-
CoverageAggregator.aggregate(dataDirs.map(_.toIO), sourceRoot.toIO) match {
30+
CoverageAggregator.aggregate(dataDirs.map(_.toFile).toIndexedSeq, sourceRoot.toFile) match {
2731
case Some(coverage) =>
28-
val sourceFolders = sources.map(_.toIO)
32+
val sourceFolders = sources.map(_.toFile).toIndexedSeq
2933
val folder = ctx.dest
30-
os.makeDir.all(folder)
34+
ScoverageReportWorkerApi2.makeAllDirs(folder)
3135
reportType match {
3236
case ReportType.Html =>
33-
new ScoverageHtmlWriter(sourceFolders, folder.toIO, None)
37+
new ScoverageHtmlWriter(sourceFolders, folder.toFile, None)
3438
.write(coverage)
3539
case ReportType.Xml =>
36-
new ScoverageXmlWriter(sourceFolders, folder.toIO, false, None)
40+
new ScoverageXmlWriter(sourceFolders, folder.toFile, false, None)
3741
.write(coverage)
3842
case ReportType.XmlCobertura =>
39-
new CoberturaXmlWriter(sourceFolders, folder.toIO, None)
43+
new CoberturaXmlWriter(sourceFolders, folder.toFile, None)
4044
.write(coverage)
4145
case ReportType.Console =>
4246
ctx.log.info(s"Statement coverage.: ${coverage.statementCoverageFormatted}%")

0 commit comments

Comments
 (0)