Skip to content

Sourceroot #384

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Nov 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ '8', '11', '17' ]
java: [ '8', '11' ]

steps:
- name: checkout the repo
Expand Down Expand Up @@ -43,7 +43,7 @@ jobs:
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: '17'
java-version: '11'

- name: Check Formatting
run: sbt scalafmtCheckAll
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ on:
tags: ["*"]
jobs:
publish:
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: actions/setup-java@v2
with:
distribution: 'adopt'
distribution: 'temurin'
java-version: '11'
- run: sbt ci-release
env:
Expand Down
2 changes: 2 additions & 0 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
version = "3.0.8"
project.git = true
runner.dialect = "scala213"
7 changes: 5 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name := "sbt-scoverage"

import sbt.ScriptedPlugin.autoImport.scriptedLaunchOpts

def scoverageVersion = "1.4.9"
lazy val scoverageVersion = "2.0.0-M2"

inThisBuild(
List(
Expand Down Expand Up @@ -33,7 +33,10 @@ lazy val root = Project("sbt-scoverage", file("."))
.enablePlugins(SbtPlugin, BuildInfoPlugin)
.settings(
libraryDependencies ++= Seq(
"org.scoverage" %% "scalac-scoverage-plugin" % scoverageVersion cross (CrossVersion.full)
"org.scoverage" %% "scalac-scoverage-plugin" % scoverageVersion cross (CrossVersion.full),
"org.scoverage" %% "scalac-scoverage-reporter" % scoverageVersion,
"org.scoverage" %% "scalac-scoverage-domain" % scoverageVersion,
"org.scoverage" %% "scalac-scoverage-serializer" % scoverageVersion
),
buildInfoKeys := Seq[BuildInfoKey]("scoverageVersion" -> scoverageVersion),
buildInfoPackage := "scoverage",
Expand Down
4 changes: 3 additions & 1 deletion src/main/scala/scoverage/CoverageMinimum.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package scoverage

import sbt._
import scoverage.DoubleFormat.twoFractionDigits
import scoverage.domain.Coverage
import scoverage.domain.CoverageMetrics
import scoverage.domain.DoubleFormat.twoFractionDigits

case class CoverageMinimum(
statement: Double,
Expand Down
1 change: 1 addition & 0 deletions src/main/scala/scoverage/ScoverageKeys.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ object ScoverageKeys {
lazy val coverageOutputTeamCity = settingKey[Boolean]("turn on teamcity reporting")
lazy val coverageScalacPluginVersion = settingKey[String]("version of scalac-scoverage-plugin to use")
lazy val coverageDataDir = settingKey[File]("directory where the measurements and report files will be stored")
lazy val coverageSourceRoot = settingKey[File]("the source root of the project")
// format: on

@deprecated("Use coverageMinimumStmtTotal instead", "v1.8.0")
Expand Down
126 changes: 102 additions & 24 deletions src/main/scala/scoverage/ScoverageSbtPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@ package scoverage
import sbt.Keys._
import sbt._
import sbt.plugins.JvmPlugin
import scoverage.report.CoberturaXmlWriter
import scoverage.report.CoverageAggregator
import scoverage.report.ScoverageHtmlWriter
import scoverage.report.ScoverageXmlWriter
import scoverage.reporter.CoberturaXmlWriter
import scoverage.domain.Constants
import scoverage.domain.Coverage
import scoverage.reporter.CoverageAggregator
import scoverage.reporter.IOUtils
import scoverage.reporter.ScoverageHtmlWriter
import scoverage.reporter.ScoverageXmlWriter
import scoverage.serialize.Serializer

import java.time.Instant

Expand All @@ -15,6 +19,9 @@ object ScoverageSbtPlugin extends AutoPlugin {
val orgScoverage = "org.scoverage"
val scalacRuntimeArtifact = "scalac-scoverage-runtime"
val scalacPluginArtifact = "scalac-scoverage-plugin"
val scalacDomainArtifact = "scalac-scoverage-domain"
val scalacReporterArtifact = "scalac-scoverage-reporter"
val scalacSerializerArtifact = "scalac-scoverage-serializer"
val defaultScoverageVersion = BuildInfo.scoverageVersion
val autoImport = ScoverageKeys
lazy val ScoveragePluginConfig = config("scoveragePlugin").hide
Expand Down Expand Up @@ -48,7 +55,8 @@ object ScoverageSbtPlugin extends AutoPlugin {
coverageOutputCobertura := true,
coverageOutputDebug := false,
coverageOutputTeamCity := false,
coverageScalacPluginVersion := defaultScoverageVersion
coverageScalacPluginVersion := defaultScoverageVersion,
coverageSourceRoot := (ThisBuild / baseDirectory).value
)

override def buildSettings: Seq[Setting[_]] = super.buildSettings ++
Expand All @@ -64,10 +72,21 @@ object ScoverageSbtPlugin extends AutoPlugin {
coverageDataDir := crossTarget.value
) ++ coverageSettings ++ scalacSettings

private def isScala2(scalaVersion: String) =
CrossVersion
.partialVersion(scalaVersion)
.collect { case (2, _) =>
true
}
.getOrElse(false)

private lazy val coverageSettings = Seq(
libraryDependencies ++= {
if (coverageEnabled.value) {
if (coverageEnabled.value && isScala2(scalaVersion.value)) {
Seq(
orgScoverage %% scalacDomainArtifact % coverageScalacPluginVersion.value,
orgScoverage %% scalacReporterArtifact % coverageScalacPluginVersion.value,
orgScoverage %% scalacSerializerArtifact % coverageScalacPluginVersion.value,
// We only add for "compile" because of macros. This setting could be optimed to just "test" if the handling
// of macro coverage was improved.
orgScoverage %% (scalacRuntime(
Expand All @@ -85,23 +104,47 @@ object ScoverageSbtPlugin extends AutoPlugin {
private lazy val scalacSettings = Seq(
Compile / compile / scalacOptions ++= {
val updateReport = update.value
if (coverageEnabled.value) {
if (coverageEnabled.value && isScala2(scalaVersion.value)) {
val scoverageDeps: Seq[File] =
updateReport matching configurationFilter(ScoveragePluginConfig.name)
val pluginPath: File = scoverageDeps.find(
_.getAbsolutePath.contains(scalacPluginArtifact)
) match {
case None =>
throw new Exception(
s"Fatal: $scalacPluginArtifact not in libraryDependencies"
)
case Some(pluginPath) => pluginPath
updateReport.matching(configurationFilter(ScoveragePluginConfig.name))

// Since everything isn't contained in a single plugin jar since we
// want to share reporter/domain code between the plugin and the
// reporter which can be used for Scala3 we need to essentially put
// together the little classpath to pass in to the compiler which
// includes everything it needs for the compiler plugin phase:
// 1. the plugin jar
// 2. the domain jar
// 3. the serializer jar
// NOTE: Even though you'd think that since plugin relies on domain
// it'd just auto include it... it doesn't.
// https://github.com/sbt/sbt/issues/2255
val pluginPaths = scoverageDeps.collect {
case path
if path.getAbsolutePath().contains(scalacPluginArtifact) || path
.getAbsolutePath()
.contains(scalacDomainArtifact) ||
path.getAbsolutePath().contains(scalacSerializerArtifact) =>
path.getAbsolutePath()
}

// NOTE: A little hacky, but make sure we are matching on the exact
// number of deps that we expect to collect up above.
if (pluginPaths.size != 3)
throw new Exception(
s"Fatal: Not finding either $scalacDomainArtifact or $scalacPluginArtifact or $scalacSerializerArtifact in libraryDependencies."
)

Seq(
Some(s"-Xplugin:${pluginPath.getAbsolutePath}"),
Some(
s"-Xplugin:${pluginPaths.mkString(":")}"
),
Some(
s"-P:scoverage:dataDir:${coverageDataDir.value.getAbsolutePath}/scoverage-data"
),
Some(
s"-P:scoverage:sourceRoot:${coverageSourceRoot.value.getAbsolutePath}"
),
Option(coverageExcludedPackages.value.trim)
.filter(_.nonEmpty)
.map(v => s"-P:scoverage:excludedPackages:$v"),
Expand All @@ -112,6 +155,16 @@ object ScoverageSbtPlugin extends AutoPlugin {
// rangepos is broken in some releases of scala so option to turn it off
if (coverageHighlighting.value) Some("-Yrangepos") else None
).flatten
} else if (
// TODO this is very temporary until support for this gets merged in.
// For now we restrict this to this exact SNAPSHOT version which needs
// to be published localled in order to test
coverageEnabled.value && scalaVersion.value == "3.1.2-RC1-bin-SNAPSHOT"
) {
Seq(
"-coverage",
s"${coverageDataDir.value.getAbsolutePath()}/scoverage-data"
)
} else {
Nil
}
Expand Down Expand Up @@ -145,7 +198,11 @@ object ScoverageSbtPlugin extends AutoPlugin {
1000
) // have noticed some delay in writing on windows, hacky but works

loadCoverage(target, log) match {
loadCoverage(
target,
log,
coverageSourceRoot.value.getAbsoluteFile()
) match {
case Some(cov) =>
writeReports(
target,
Expand Down Expand Up @@ -176,7 +233,7 @@ object ScoverageSbtPlugin extends AutoPlugin {
file / Constants.DataDir
}

CoverageAggregator.aggregate(dataDirs) match {
CoverageAggregator.aggregate(dataDirs, coverageSourceRoot.value) match {
case Some(cov) =>
writeReports(
coverageDataDir.value,
Expand Down Expand Up @@ -220,7 +277,11 @@ object ScoverageSbtPlugin extends AutoPlugin {
reportDir.mkdirs()

if (coverageOutputCobertura) {
new CoberturaXmlWriter(compileSourceDirectories, coberturaDir).write(
new CoberturaXmlWriter(
compileSourceDirectories,
coberturaDir,
coverageSourceEncoding
).write(
coverage
)
log.info(
Expand All @@ -229,11 +290,21 @@ object ScoverageSbtPlugin extends AutoPlugin {
}

if (coverageOutputXML) {
new ScoverageXmlWriter(compileSourceDirectories, reportDir, false).write(
new ScoverageXmlWriter(
compileSourceDirectories,
reportDir,
false,
coverageSourceEncoding
).write(
coverage
)
if (coverageDebug) {
new ScoverageXmlWriter(compileSourceDirectories, reportDir, true).write(
new ScoverageXmlWriter(
compileSourceDirectories,
reportDir,
true,
coverageSourceEncoding
).write(
coverage
)
}
Expand Down Expand Up @@ -306,7 +377,11 @@ object ScoverageSbtPlugin extends AutoPlugin {
)
}

private def loadCoverage(crossTarget: File, log: Logger): Option[Coverage] = {
private def loadCoverage(
crossTarget: File,
log: Logger,
sourceRoot: File
): Option[Coverage] = {

val dataDir = crossTarget / "/scoverage-data"
val coverageFile = Serializer.coverageFile(dataDir)
Expand All @@ -315,7 +390,10 @@ object ScoverageSbtPlugin extends AutoPlugin {

if (coverageFile.exists) {

val coverage = Serializer.deserialize(coverageFile)
val coverage = Serializer.deserialize(
coverageFile,
sourceRoot
)

log.info(s"Reading scoverage measurements...")
val measurementFiles = IOUtils.findMeasurementFiles(dataDir)
Expand Down
17 changes: 0 additions & 17 deletions src/sbt-test/scoverage/scalac-plugin-version/build.sbt

This file was deleted.

16 changes: 0 additions & 16 deletions src/sbt-test/scoverage/scalac-plugin-version/project/plugins.sbt

This file was deleted.

3 changes: 0 additions & 3 deletions src/sbt-test/scoverage/scalac-plugin-version/test

This file was deleted.