Skip to content

Commit c3e3c06

Browse files
committed
Merge pull request #140 from thomaska/added_teamcity_support
Added teamcity support - applied @wennergr commit
2 parents 7060d5c + e74b569 commit c3e3c06

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

Diff for: src/main/scala/scoverage/ScoverageKeys.scala

+1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ object ScoverageKeys {
1616
lazy val coverageOutputHTML = settingKey[Boolean]("enables html report generation")
1717
lazy val coverageOutputDebug = settingKey[Boolean]("turn on the debug report")
1818
lazy val coverageCleanSubprojectFiles = settingKey[Boolean]("removes subproject data after an aggregation")
19+
lazy val coverageOutputTeamCity = settingKey[Boolean]("turn on teamcity reporting")
1920
}

Diff for: src/main/scala/scoverage/ScoverageSbtPlugin.scala

+34-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package scoverage
22

33
import sbt.Keys._
44
import sbt._
5+
import scoverage.ScoverageKeys._
56
import scoverage.report.{CoverageAggregator, CoberturaXmlWriter, ScoverageHtmlWriter, ScoverageXmlWriter}
67

78
object ScoverageSbtPlugin extends AutoPlugin {
@@ -42,7 +43,8 @@ object ScoverageSbtPlugin extends AutoPlugin {
4243
coverageOutputHTML := true,
4344
coverageOutputCobertura := true,
4445
coverageOutputDebug := false,
45-
coverageCleanSubprojectFiles := true
46+
coverageCleanSubprojectFiles := true,
47+
coverageOutputTeamCity := false
4648
)
4749

4850
/**
@@ -72,6 +74,7 @@ object ScoverageSbtPlugin extends AutoPlugin {
7274
coverageOutputXML.value,
7375
coverageOutputHTML.value,
7476
coverageOutputDebug.value,
77+
coverageOutputTeamCity.value,
7578
log)
7679
case None => log.warn("No coverage data, skipping reports")
7780
}
@@ -91,6 +94,7 @@ object ScoverageSbtPlugin extends AutoPlugin {
9194
coverageOutputXML.value,
9295
coverageOutputHTML.value,
9396
coverageOutputDebug.value,
97+
coverageOutputTeamCity.value,
9498
log)
9599
val cfmt = cov.statementCoverageFormatted
96100
log.info(s"Aggregation complete. Coverage was [$cfmt]")
@@ -127,6 +131,7 @@ object ScoverageSbtPlugin extends AutoPlugin {
127131
coverageOutputXML.value,
128132
coverageOutputHTML.value,
129133
coverageOutputDebug.value,
134+
coverageOutputTeamCity.value,
130135
log
131136
)
132137
checkCoverage(c, log, coverageMinimum.value, coverageFailOnMinimum.value)
@@ -163,6 +168,7 @@ object ScoverageSbtPlugin extends AutoPlugin {
163168
coverageOutputXML: Boolean,
164169
coverageOutputHTML: Boolean,
165170
coverageDebug: Boolean,
171+
coverageOutputTeamCity: Boolean,
166172
log: Logger): Unit = {
167173
log.info(s"Generating scoverage reports...")
168174

@@ -188,10 +194,37 @@ object ScoverageSbtPlugin extends AutoPlugin {
188194
log.info(s"Written HTML coverage report [${reportDir.getAbsolutePath}/index.html]")
189195
new ScoverageHtmlWriter(compileSourceDirectories, reportDir).write(coverage)
190196
}
197+
if (coverageOutputTeamCity) {
198+
log.info("Writing coverage report to teamcity")
199+
reportToTeamcity(coverage, coverageOutputHTML, reportDir, crossTarget, log)
200+
}
191201

202+
log.info(s"Statement coverage.: ${coverage.statementCoverageFormatted}%")
203+
log.info(s"Branch coverage....: ${coverage.branchCoverageFormatted}}%")
192204
log.info("Coverage reports completed")
193205
}
194206

207+
private def reportToTeamcity(coverage: Coverage,
208+
createCoverageZip: Boolean,
209+
reportDir: File,
210+
crossTarget: File,
211+
log: Logger) {
212+
213+
// Teamcity only have a definition of line/method and class coverage
214+
215+
// Log branch coverage as line coverage
216+
log.info(s"##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='${coverage.invokedStatementCount}']")
217+
log.info(s"##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='${coverage.statementCount}']")
218+
219+
// Log statement coverage as method coverage
220+
log.info(s"##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='${coverage.invokedBranchesCount}']")
221+
log.info(s"##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='${coverage.branchCount}']")
222+
223+
// Create the coverage report for teamcity (HTML files)
224+
if (createCoverageZip)
225+
IO.zip(Path.allSubpaths(reportDir), crossTarget / "coverage.zip")
226+
}
227+
195228
private def loadCoverage(crossTarget: File, log: Logger): Option[Coverage] = {
196229

197230
val dataDir = crossTarget / "/scoverage-data"

0 commit comments

Comments
 (0)