@@ -2,6 +2,7 @@ package scoverage
2
2
3
3
import sbt .Keys ._
4
4
import sbt ._
5
+ import scoverage .report .{ScoverageHtmlWriter , ScoverageXmlWriter , CoberturaXmlWriter }
5
6
6
7
object ScoverageSbtPlugin extends ScoverageSbtPlugin
7
8
@@ -51,22 +52,22 @@ class ScoverageSbtPlugin extends sbt.Plugin {
51
52
case Some (classpath) =>
52
53
Seq (
53
54
" -Xplugin:" + classpath.getAbsolutePath,
54
- " -P:scoverage:excludedPackages:" + Option (excludedPackages.value).getOrElse(" " ),
55
+ " -P:scoverage:excludedPackages:" + Option (( excludedPackages in Scoverage ) .value).getOrElse(" " ),
55
56
" -P:scoverage:dataDir:" + target.getAbsolutePath + " /scoverage-data"
56
57
)
57
58
}
58
59
},
59
60
60
61
scalacOptions in Scoverage ++= (if (highlighting.value) List (" -Yrangepos" ) else Nil ),
61
62
62
- sources in ScoverageTest << = (sources in Test ),
63
- sourceDirectory in ScoverageTest << = (sourceDirectory in Test ),
64
- resourceDirectory in ScoverageTest << = (resourceDirectory in Test ),
65
- resourceGenerators in ScoverageTest << = (resourceGenerators in Test ),
66
- unmanagedResources in ScoverageTest << = (unmanagedResources in Test ),
67
- javacOptions in ScoverageTest << = (javacOptions in Test ),
68
- javaOptions in ScoverageTest << = (javaOptions in Test ),
69
- fork in ScoverageTest << = (fork in Test ),
63
+ sources in ScoverageTest : = (sources in Test ).value ,
64
+ sourceDirectory in ScoverageTest : = (sourceDirectory in Test ).value ,
65
+ resourceDirectory in ScoverageTest : = (resourceDirectory in Test ).value ,
66
+ resourceGenerators in ScoverageTest : = (resourceGenerators in Test ).value ,
67
+ unmanagedResources in ScoverageTest : = (unmanagedResources in Test ).value ,
68
+ javacOptions in ScoverageTest : = (javacOptions in Test ).value ,
69
+ javaOptions in ScoverageTest : = (javaOptions in Test ).value ,
70
+ fork in ScoverageTest : = (fork in Test ).value ,
70
71
71
72
externalDependencyClasspath in Scoverage <<= Classpaths
72
73
.concat(externalDependencyClasspath in Scoverage , externalDependencyClasspath in Compile ),
@@ -82,7 +83,63 @@ class ScoverageSbtPlugin extends sbt.Plugin {
82
83
testOptions in ScoverageTest <<= (testOptions in Test ),
83
84
84
85
// copy the test task into compile so we can do scoverage:test instead of scoverage-test:test
85
- test in Scoverage <<= (test in ScoverageTest )
86
+ test in Scoverage <<= (test in ScoverageTest ),
87
+
88
+ test in Scoverage := {
89
+ (test in Scoverage ).value
90
+
91
+ streams.value.log.info(s " [scoverage] Waiting for measurement data to sync... " )
92
+ Thread .sleep(2000 ) // have noticed some delay in writing, hacky but works
93
+
94
+ val dataDir = crossTarget.value / " /scoverage-data"
95
+ val coberturaDir = crossTarget.value / " coverage-report"
96
+ val reportDir = crossTarget.value / " scoverage-report"
97
+ coberturaDir.mkdirs()
98
+ reportDir.mkdirs()
99
+
100
+ val coverageFile = IOUtils .coverageFile(dataDir)
101
+ val measurementFiles = IOUtils .findMeasurementFiles(dataDir)
102
+
103
+ streams.value.log.info(s " [scoverage] Reading scoverage instrumentation [ $coverageFile] " )
104
+ streams.value.log.info(s " [scoverage] Reading scoverage measurements... " )
105
+
106
+ val coverage = IOUtils .deserialize(coverageFile)
107
+ val measurements = IOUtils .invoked(measurementFiles)
108
+ coverage.apply(measurements)
109
+
110
+ streams.value.log.info(s " [scoverage] Generating Cobertura report [ ${coberturaDir.getAbsolutePath}/cobertura.xml] " )
111
+ new CoberturaXmlWriter (baseDirectory in Compile value, coberturaDir).write(coverage)
112
+
113
+ streams.value.log.info(s " [scoverage] Generating XML report [ ${reportDir.getAbsolutePath}/scoverage.xml] " )
114
+ new ScoverageXmlWriter (scalaSource in Compile value, reportDir, false ).write(coverage)
115
+ new ScoverageXmlWriter (scalaSource in Compile value, reportDir, true ).write(coverage)
116
+
117
+ streams.value.log.info(s " [scoverage] Generating HTML report [ ${reportDir.getAbsolutePath}/index.html] " )
118
+ new ScoverageHtmlWriter (scalaSource in Compile value, reportDir).write(coverage)
119
+
120
+ streams.value.log.info(" [scoverage] Reports completed" )
121
+
122
+ val min = minimumCoverage.value
123
+ val failOnMin = failOnMinimumCoverage.value
124
+
125
+ // check for default minimum
126
+ if (min > 0 ) {
127
+ def is100 (d : Double ) = Math .abs(100 - d) <= 0.00001
128
+
129
+ if (is100(min) && is100(coverage.statementCoveragePercent)) {
130
+ streams.value.log.info(s " [scoverage] 100% Coverage ! " )
131
+ } else if (min > coverage.statementCoveragePercent) {
132
+ streams.value.log.error(s " [scoverage] Coverage is below minimum [ ${coverage.statementCoverageFormatted}% < $min%] " )
133
+ if (failOnMin)
134
+ throw new RuntimeException (" Coverage minimum was not reached" )
135
+ } else {
136
+ streams.value.log.info(s " [scoverage] Coverage is above minimum [ ${coverage.statementCoverageFormatted}% > $min%] " )
137
+ }
138
+ }
139
+
140
+ streams.value.log.info(s " [scoverage] All done. Coverage was [ ${coverage.statementCoverageFormatted}%] " )
141
+ ()
142
+ }
86
143
)
87
144
}
88
145
}
0 commit comments