Skip to content

Commit d249cd7

Browse files
authored
Merge pull request #182 from BennyHill/topic/2-12
Use SBT settings to control scoverage
2 parents 69f71dc + d9cdd50 commit d249cd7

File tree

1 file changed

+53
-62
lines changed

1 file changed

+53
-62
lines changed

src/main/scala/scoverage/ScoverageSbtPlugin.scala

+53-62
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,8 @@ object ScoverageSbtPlugin extends AutoPlugin {
2323
override def requires: JvmPlugin.type = plugins.JvmPlugin
2424
override def trigger: PluginTrigger = allRequirements
2525

26-
override lazy val projectSettings = Seq(
26+
override def globalSettings: Seq[Def.Setting[_]] = super.globalSettings ++ Seq(
2727
coverageEnabled := false,
28-
commands += Command.command("coverage", "enable compiled code with instrumentation", "")(toggleCoverage(true)),
29-
commands += Command.command("coverageOff", "disable compiled code with instrumentation", "")(toggleCoverage(false)),
30-
coverageReport <<= coverageReport0,
31-
coverageAggregate <<= coverageAggregate0,
32-
ivyConfigurations := ivyConfigurations.value :+ ScoveragePluginConfig,
33-
coverageScalacPluginVersion := DefaultScoverageVersion,
34-
libraryDependencies ++= {
35-
if (coverageEnabled.value) Seq(
36-
OrgScoverage %% (ScalacRuntimeArtifact + optionalScalaJsSuffix(libraryDependencies.value)) % coverageScalacPluginVersion.value,
37-
OrgScoverage %% ScalacPluginArtifact % coverageScalacPluginVersion.value % ScoveragePluginConfig.name
38-
) else Nil
39-
},
40-
scalacOptions in(Compile, compile) ++= scoverageScalacOptions.value,
41-
aggregate in coverageAggregate := false,
4228
coverageExcludedPackages := "",
4329
coverageExcludedFiles := "",
4430
coverageMinimum := 0, // default is no minimum
@@ -49,22 +35,60 @@ object ScoverageSbtPlugin extends AutoPlugin {
4935
coverageOutputCobertura := true,
5036
coverageOutputDebug := false,
5137
coverageCleanSubprojectFiles := true,
52-
coverageOutputTeamCity := false
38+
coverageOutputTeamCity := false,
39+
coverageScalacPluginVersion := DefaultScoverageVersion
40+
)
41+
42+
override def buildSettings: Seq[Setting[_]] = super.buildSettings ++
43+
addCommandAlias("coverage", ";set coverageEnabled in ThisBuild := true") ++
44+
addCommandAlias("coverageOn", ";set coverageEnabled in ThisBuild := true") ++
45+
addCommandAlias("coverageOff", ";set coverageEnabled in ThisBuild := false")
46+
47+
override def projectSettings: Seq[Setting[_]] = Seq(
48+
ivyConfigurations += ScoveragePluginConfig,
49+
coverageReport <<= coverageReport0,
50+
coverageAggregate <<= coverageAggregate0
51+
) ++ coverageSettings ++ scalacSettings
52+
53+
private lazy val coverageSettings = Seq(
54+
libraryDependencies ++= {
55+
if (coverageEnabled.value)
56+
Seq(
57+
// We only add for "compile"" because of macros. This setting could be optimed to just "test" if the handling
58+
// of macro coverage was improved.
59+
OrgScoverage %% (scalacRuntime(libraryDependencies.value)) % coverageScalacPluginVersion.value,
60+
// We don't want to instrument the test code itself, nor add to a pom when published with coverage enabled.
61+
OrgScoverage %% ScalacPluginArtifact % coverageScalacPluginVersion.value % ScoveragePluginConfig.name
62+
)
63+
else
64+
Nil
65+
}
66+
)
67+
68+
private lazy val scalacSettings = Seq(
69+
scalacOptions in(Compile, compile) ++= {
70+
if (coverageEnabled.value) {
71+
val scoverageDeps: Seq[File] = update.value matching configurationFilter(ScoveragePluginConfig.name)
72+
val pluginPath: File = scoverageDeps.find(_.getAbsolutePath.contains(ScalacPluginArtifact)) match {
73+
case None => throw new Exception(s"Fatal: $ScalacPluginArtifact not in libraryDependencies")
74+
case Some(pluginPath) => pluginPath
75+
}
76+
Seq(
77+
Some(s"-Xplugin:${pluginPath.getAbsolutePath}"),
78+
Some(s"-P:scoverage:dataDir:${crossTarget.value.getAbsolutePath}/scoverage-data"),
79+
Option(coverageExcludedPackages.value.trim).filter(_.nonEmpty).map(v => s"-P:scoverage:excludedPackages:$v"),
80+
Option(coverageExcludedFiles.value.trim).filter(_.nonEmpty).map(v => s"-P:scoverage:excludedFiles:$v"),
81+
// rangepos is broken in some releases of scala so option to turn it off
82+
if (coverageHighlighting.value) Some("-Yrangepos") else None
83+
).flatten
84+
} else {
85+
Nil
86+
}
87+
}
5388
)
5489

55-
/**
56-
* The "coverage" command enables or disables instrumentation for all projects
57-
* in the build.
58-
*/
59-
private def toggleCoverage(status: Boolean): State => State = { state =>
60-
val extracted = Project.extract(state)
61-
val currentProjRef = extracted.currentRef
62-
val newSettings = extracted.structure.allProjectRefs.flatMap(proj =>
63-
Seq(coverageEnabled in proj := status)
64-
)
65-
val appendSettings = Load.transformSettings(Load.projectScope(currentProjRef), currentProjRef.build, extracted.rootProject, newSettings)
66-
val newSessionSettings = extracted.session.appendRaw(appendSettings)
67-
SessionSettings.reapply(newSessionSettings, state)
90+
private def scalacRuntime(deps: Seq[ModuleID]): String = {
91+
ScalacRuntimeArtifact + optionalScalaJsSuffix(deps)
6892
}
6993

7094
// returns "_sjs$sjsVersion" for Scala.js projects or "" otherwise
@@ -130,39 +154,6 @@ object ScoverageSbtPlugin extends AutoPlugin {
130154
}
131155
}
132156

133-
private lazy val scoverageScalacOptions = Def.task {
134-
update.value
135-
.matching(configurationFilter(ScoveragePluginConfig.name))
136-
.find(_.getAbsolutePath.contains(ScalacPluginArtifact))
137-
.fold[Seq[String]](Nil)(pluginPath =>
138-
scalaArgs(coverageEnabled.value,
139-
pluginPath,
140-
crossTarget.value,
141-
coverageExcludedPackages.value,
142-
coverageExcludedFiles.value,
143-
coverageHighlighting.value))
144-
}
145-
146-
private def scalaArgs(coverageEnabled: Boolean,
147-
pluginPath: File,
148-
target: File,
149-
excludedPackages: String,
150-
excludedFiles: String,
151-
coverageHighlighting: Boolean) = {
152-
if (coverageEnabled) {
153-
Seq(
154-
Some(s"-Xplugin:${pluginPath.getAbsolutePath}"),
155-
Some(s"-P:scoverage:dataDir:${target.getAbsolutePath}/scoverage-data"),
156-
Option(excludedPackages.trim).filter(_.nonEmpty).map(v => s"-P:scoverage:excludedPackages:$v"),
157-
Option(excludedFiles.trim).filter(_.nonEmpty).map(v => s"-P:scoverage:excludedFiles:$v"),
158-
// rangepos is broken in some releases of scala so option to turn it off
159-
if (coverageHighlighting) Some("-Yrangepos") else None
160-
).flatten
161-
} else {
162-
Nil
163-
}
164-
}
165-
166157
private def writeReports(crossTarget: File,
167158
compileSourceDirectories: Seq[File],
168159
coverage: Coverage,

0 commit comments

Comments
 (0)