summaryrefslogtreecommitdiff
path: root/contrib/scoverage/src/ScoverageReportWorker.scala
diff options
context:
space:
mode:
authorNik Vanderhoof <nikolasrvanderhoof@gmail.com>2019-05-18 23:22:13 -0400
committerLi Haoyi <haoyi.sg@gmail.com>2019-05-19 11:22:13 +0800
commitc4a65baab92890d2d5682329a87469bec605fe5d (patch)
tree1d8caffb159d847e7cafa211572204164b3eabc2 /contrib/scoverage/src/ScoverageReportWorker.scala
parent6c86609a6474e952e3d4972852f032af944631dc (diff)
downloadmill-c4a65baab92890d2d5682329a87469bec605fe5d.tar.gz
mill-c4a65baab92890d2d5682329a87469bec605fe5d.tar.bz2
mill-c4a65baab92890d2d5682329a87469bec605fe5d.zip
Add support for Scoverage (#571)
* Add initial work for ScoverageModule * style: Move package scoverage from lib to contrib Suggested by @lefou > I think, it would be better to add under `mill.contrib.scoverage`. Pull request: #571 * Initial changes to non-hardcoded scoverage version * Using task context api to specify dataDir Now measurement data will be written to: PROJECT_ROOT/out/MODULE/scoverage/data/ and the html report will be written to: PROJECT_ROOT/out/MODULE/scoverage/data/htmlReport/ * Remove wild card imports in scoverage Also remove scoverage dependency from build.sc * Move htmlReport into worker Based on what I've seen in scalalib, scalajslib, scalanativelib, playlib, and twirllib modules. Still need to add tests * Add basic docs + tests for scoverage I still am working on testing the actual generation of reports. * Use cross-module for scoverage worker Now we can support multiple versions of scoverage by adding them to the crossmodule list. Also now running the local publish script succeeds. * Add scoverage to ci tests * Add detailed ScoverageModule documentation * Test scoverage dataDir * Remove <pre> tags in scaladoc * Add scoverage dependency in less hacky way * Modify scoverage tests to check classpaths * Put docs in alphabetical order * Test classpaths for scoverage runtime * Remove abstract def test: ScoverageTests * Construct classloader differently * Revert "Construct classloader differently" This reverts commit fccf9a94cc38fb9e2be58a9ff90b00b65f339db6. * Revert "Construct classloader differently" Also fixes unfound error in html report This reverts commit fccf9a94cc38fb9e2be58a9ff90b00b65f339db6. * Fix classpath for scoverage worker
Diffstat (limited to 'contrib/scoverage/src/ScoverageReportWorker.scala')
-rw-r--r--contrib/scoverage/src/ScoverageReportWorker.scala39
1 files changed, 39 insertions, 0 deletions
diff --git a/contrib/scoverage/src/ScoverageReportWorker.scala b/contrib/scoverage/src/ScoverageReportWorker.scala
new file mode 100644
index 00000000..1aaa31ad
--- /dev/null
+++ b/contrib/scoverage/src/ScoverageReportWorker.scala
@@ -0,0 +1,39 @@
+package mill.contrib.scoverage
+
+import mill.{Agg, T}
+import mill.api.{ClassLoader, Ctx, Result}
+import mill.define.{Discover, ExternalModule, Worker}
+import mill.eval.PathRef
+
+class ScoverageReportWorker {
+ private var scoverageInstanceCache = Option.empty[(Long, api.ScoverageReportWorkerApi)]
+
+ def bridge(classpath: Agg[os.Path])
+ (implicit ctx: Ctx) = {
+ val classloaderSig =
+ classpath.map(p => p.toString().hashCode + os.mtime(p)).sum
+ scoverageInstanceCache match {
+ case Some((sig, bridge)) if sig == classloaderSig => bridge
+ case _ =>
+ val toolsClassPath = classpath.map(_.toIO.toURI.toURL).toVector
+ ctx.log.debug("Loading classes from\n"+toolsClassPath.mkString("\n"))
+ val cl = ClassLoader.create(
+ toolsClassPath,
+ getClass.getClassLoader
+ )
+ val bridge = cl
+ .loadClass("mill.contrib.scoverage.worker.ScoverageReportWorkerImpl")
+ .getDeclaredConstructor()
+ .newInstance()
+ .asInstanceOf[api.ScoverageReportWorkerApi]
+ scoverageInstanceCache = Some((classloaderSig, bridge))
+ bridge
+ }
+ }
+}
+
+object ScoverageReportWorkerApi extends ExternalModule {
+
+ def scoverageReportWorker = T.worker { new ScoverageReportWorker() }
+ lazy val millDiscover = Discover[this.type]
+}