From d5078807a19e7b4b34b9485d3eb7da172a020f0f Mon Sep 17 00:00:00 2001 From: Eyal Roth Date: Mon, 16 Sep 2019 21:47:14 +0300 Subject: [PATCH] Fix incorrect reading of source files when generating an HTML report (#68) --- .../groovy/org/scoverage/ScoverageAggregate.groovy | 4 ++++ src/main/groovy/org/scoverage/ScoveragePlugin.groovy | 9 +++++++++ src/main/groovy/org/scoverage/ScoverageReport.groovy | 4 ++++ src/main/groovy/org/scoverage/ScoverageWriter.java | 10 +++++++++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/groovy/org/scoverage/ScoverageAggregate.groovy b/src/main/groovy/org/scoverage/ScoverageAggregate.groovy index e41d16b..08d5eac 100644 --- a/src/main/groovy/org/scoverage/ScoverageAggregate.groovy +++ b/src/main/groovy/org/scoverage/ScoverageAggregate.groovy @@ -24,6 +24,9 @@ class ScoverageAggregate extends DefaultTask { @Input final Property deleteReportsOnAggregation = project.objects.property(Boolean) + @Input + final Property sourceEncoding = project.objects.property(String) + // TODO - consider separate options for `report` and `aggregate` tasks @Input final Property coverageOutputCobertura = project.objects.property(Boolean) @@ -60,6 +63,7 @@ class ScoverageAggregate extends DefaultTask { rootDir, reportDir.get(), coverage.get(), + sourceEncoding.get(), coverageOutputCobertura.get(), coverageOutputXML.get(), coverageOutputHTML.get(), diff --git a/src/main/groovy/org/scoverage/ScoveragePlugin.groovy b/src/main/groovy/org/scoverage/ScoveragePlugin.groovy index 8be36fb..4666a6c 100644 --- a/src/main/groovy/org/scoverage/ScoveragePlugin.groovy +++ b/src/main/groovy/org/scoverage/ScoveragePlugin.groovy @@ -104,7 +104,13 @@ class ScoveragePlugin implements Plugin { def globalReportTask = project.tasks.register(REPORT_NAME, ScoverageAggregate) def globalCheckTask = project.tasks.register(CHECK_NAME, OverallCheckTask) + project.afterEvaluate { + def detectedSourceEncoding = compileTask.scalaCompileOptions.encoding + if (detectedSourceEncoding == null) { + detectedSourceEncoding = "UTF-8" + } + // calling toList() on TaskCollection is required // to avoid potential ConcurrentModificationException in multi-project builds def testTasks = project.tasks.withType(Test).toList() @@ -123,6 +129,7 @@ class ScoveragePlugin implements Plugin { reportDir = taskReportDir sources = extension.sources dataDir = extension.dataDir + sourceEncoding.set(detectedSourceEncoding) coverageOutputCobertura = extension.coverageOutputCobertura coverageOutputXML = extension.coverageOutputXML coverageOutputHTML = extension.coverageOutputHTML @@ -139,6 +146,7 @@ class ScoveragePlugin implements Plugin { group = 'verification' runner = scoverageRunner reportDir = extension.reportDir + sourceEncoding.set(detectedSourceEncoding) dirsToAggregateFrom = reportDirs deleteReportsOnAggregation = false coverageOutputCobertura = extension.coverageOutputCobertura @@ -171,6 +179,7 @@ class ScoveragePlugin implements Plugin { group = 'verification' runner = scoverageRunner reportDir = extension.reportDir + sourceEncoding.set(detectedSourceEncoding) deleteReportsOnAggregation = extension.deleteReportsOnAggregation coverageOutputCobertura = extension.coverageOutputCobertura coverageOutputXML = extension.coverageOutputXML diff --git a/src/main/groovy/org/scoverage/ScoverageReport.groovy b/src/main/groovy/org/scoverage/ScoverageReport.groovy index d5c5691..784213d 100644 --- a/src/main/groovy/org/scoverage/ScoverageReport.groovy +++ b/src/main/groovy/org/scoverage/ScoverageReport.groovy @@ -28,6 +28,9 @@ class ScoverageReport extends DefaultTask { @OutputDirectory final Property reportDir = project.objects.property(File) + @Input + final Property sourceEncoding = project.objects.property(String) + @Input final Property coverageOutputCobertura = project.objects.property(Boolean) @Input @@ -59,6 +62,7 @@ class ScoverageReport extends DefaultTask { sources.get(), reportDir.get(), coverage, + sourceEncoding.get(), coverageOutputCobertura.get(), coverageOutputXML.get(), coverageOutputHTML.get(), diff --git a/src/main/groovy/org/scoverage/ScoverageWriter.java b/src/main/groovy/org/scoverage/ScoverageWriter.java index cf68851..a4c7ecf 100644 --- a/src/main/groovy/org/scoverage/ScoverageWriter.java +++ b/src/main/groovy/org/scoverage/ScoverageWriter.java @@ -1,6 +1,9 @@ package org.scoverage; import org.gradle.api.logging.Logger; +import scala.Some; +import scala.collection.JavaConverters; +import scala.collection.mutable.Buffer; import scoverage.Constants; import scoverage.Coverage; import scoverage.report.CoberturaXmlWriter; @@ -8,6 +11,8 @@ import scoverage.report.ScoverageXmlWriter; import java.io.File; +import java.nio.charset.Charset; +import java.util.Arrays; /** * Util for generating and saving coverage files. @@ -29,6 +34,7 @@ public ScoverageWriter(Logger logger) { * @param sourceDir directory with project sources * @param reportDir directory for generate reports * @param coverage coverage data + * @param sourceEncoding the encoding of the source files * @param coverageOutputCobertura switch for Cobertura output * @param coverageOutputXML switch for Scoverage XML output * @param coverageOutputHTML switch for Scoverage HTML output @@ -37,6 +43,7 @@ public ScoverageWriter(Logger logger) { public void write(File sourceDir, File reportDir, Coverage coverage, + String sourceEncoding, Boolean coverageOutputCobertura, Boolean coverageOutputXML, Boolean coverageOutputHTML, @@ -70,7 +77,8 @@ public void write(File sourceDir, } if (coverageOutputHTML) { - new ScoverageHtmlWriter(sourceDir, reportDir).write(coverage); + Buffer sources = JavaConverters.asScalaBuffer(Arrays.asList(sourceDir)); + new ScoverageHtmlWriter(sources, reportDir, new Some<>(sourceEncoding)).write(coverage); logger.info("[scoverage] Written HTML report to " + reportDir.getAbsolutePath() + File.separator +