@@ -32,7 +32,7 @@ import org.apache.commons.io.IOUtils; | |||
public class CharsetDetector { | |||
private static final int BYTES_TO_DECODE = 4192; | |||
private Path filePath; | |||
private final Path filePath; | |||
private BufferedInputStream stream; | |||
private Charset detectedCharset; | |||
private Charset userEncoding; |
@@ -32,6 +32,7 @@ import org.sonar.api.batch.fs.InputFile; | |||
import org.sonar.api.batch.fs.internal.DefaultInputFile; | |||
import org.sonar.api.batch.scm.BlameCommand.BlameOutput; | |||
import org.sonar.api.batch.scm.BlameLine; | |||
import org.sonar.api.notifications.AnalysisWarnings; | |||
import org.sonar.api.utils.log.Logger; | |||
import org.sonar.api.utils.log.Loggers; | |||
import org.sonar.scanner.protocol.output.ScannerReport; | |||
@@ -46,13 +47,15 @@ class DefaultBlameOutput implements BlameOutput { | |||
private static final Logger LOG = Loggers.get(DefaultBlameOutput.class); | |||
private final ScannerReportWriter writer; | |||
private AnalysisWarnings analysisWarnings; | |||
private final Set<InputFile> allFilesToBlame = new LinkedHashSet<>(); | |||
private ProgressReport progressReport; | |||
private int count; | |||
private int total; | |||
DefaultBlameOutput(ScannerReportWriter writer, List<InputFile> filesToBlame) { | |||
DefaultBlameOutput(ScannerReportWriter writer, AnalysisWarnings analysisWarnings, List<InputFile> filesToBlame) { | |||
this.writer = writer; | |||
this.analysisWarnings = analysisWarnings; | |||
this.allFilesToBlame.addAll(filesToBlame); | |||
count = 0; | |||
total = filesToBlame.size(); | |||
@@ -131,6 +134,9 @@ class DefaultBlameOutput implements BlameOutput { | |||
LOG.warn(" * " + f); | |||
} | |||
LOG.warn("This may lead to missing/broken features in SonarQube"); | |||
analysisWarnings.addUnique(String.format("Missing blame information for %d %s. This may lead to some features not working correctly. Please check the analysis logs.", | |||
allFilesToBlame.size(), | |||
allFilesToBlame.size() > 1 ? "files" : "file")); | |||
} | |||
} | |||
@@ -28,6 +28,7 @@ import org.sonar.api.batch.fs.InputFile; | |||
import org.sonar.api.batch.fs.InputFile.Status; | |||
import org.sonar.api.batch.fs.internal.DefaultInputFile; | |||
import org.sonar.api.batch.scm.ScmProvider; | |||
import org.sonar.api.notifications.AnalysisWarnings; | |||
import org.sonar.api.utils.log.Logger; | |||
import org.sonar.api.utils.log.Loggers; | |||
import org.sonar.scanner.protocol.output.ScannerReport; | |||
@@ -48,16 +49,18 @@ public final class ScmPublisher { | |||
private final InputComponentStore componentStore; | |||
private final FileSystem fs; | |||
private final ScannerReportWriter writer; | |||
private AnalysisWarnings analysisWarnings; | |||
private final BranchConfiguration branchConfiguration; | |||
public ScmPublisher(ScmConfiguration configuration, ProjectRepositoriesSupplier projectRepositoriesSupplier, | |||
InputComponentStore componentStore, FileSystem fs, ReportPublisher reportPublisher, BranchConfiguration branchConfiguration) { | |||
InputComponentStore componentStore, FileSystem fs, ReportPublisher reportPublisher, BranchConfiguration branchConfiguration, AnalysisWarnings analysisWarnings) { | |||
this.configuration = configuration; | |||
this.projectRepositoriesSupplier = projectRepositoriesSupplier; | |||
this.componentStore = componentStore; | |||
this.fs = fs; | |||
this.branchConfiguration = branchConfiguration; | |||
this.writer = reportPublisher.getWriter(); | |||
this.analysisWarnings = analysisWarnings; | |||
} | |||
public void publish() { | |||
@@ -76,7 +79,7 @@ public final class ScmPublisher { | |||
if (!filesToBlame.isEmpty()) { | |||
String key = provider.key(); | |||
LOG.info("SCM Publisher SCM provider for this project is: " + key); | |||
DefaultBlameOutput output = new DefaultBlameOutput(writer, filesToBlame); | |||
DefaultBlameOutput output = new DefaultBlameOutput(writer, analysisWarnings, filesToBlame); | |||
try { | |||
provider.blameCommand().blame(new DefaultBlameInput(fs, filesToBlame), output); | |||
} catch (Exception e) { |
@@ -20,6 +20,7 @@ | |||
package org.sonar.scanner.scm; | |||
import java.util.Arrays; | |||
import java.util.Collections; | |||
import java.util.Date; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
@@ -27,17 +28,36 @@ import org.junit.rules.ExpectedException; | |||
import org.sonar.api.batch.fs.InputFile; | |||
import org.sonar.api.batch.fs.internal.TestInputFileBuilder; | |||
import org.sonar.api.batch.scm.BlameLine; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.scanner.notifications.DefaultAnalysisWarnings; | |||
import static java.util.Collections.emptyList; | |||
import static java.util.Collections.singletonList; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
import static org.mockito.Mockito.verify; | |||
public class DefaultBlameOutputTest { | |||
@Rule | |||
public ExpectedException thrown = ExpectedException.none(); | |||
private System2 system2 = mock(System2.class); | |||
private DefaultAnalysisWarnings analysisWarnings = new DefaultAnalysisWarnings(system2); | |||
@Test | |||
public void shouldNotFailIfNotSameNumberOfLines() { | |||
InputFile file = new TestInputFileBuilder("foo", "src/main/java/Foo.java").setLines(10).build(); | |||
new DefaultBlameOutput(null, Arrays.asList(file)).blameResult(file, Arrays.asList(new BlameLine().revision("1").author("guy"))); | |||
new DefaultBlameOutput(null, analysisWarnings, singletonList(file)).blameResult(file, singletonList(new BlameLine().revision("1").author("guy"))); | |||
} | |||
@Test | |||
public void addWarningIfFilesMissing() { | |||
InputFile file = new TestInputFileBuilder("foo", "src/main/java/Foo.java").setLines(10).build(); | |||
new DefaultBlameOutput(null, analysisWarnings, singletonList(file)).finish(true); | |||
assertThat(analysisWarnings.warnings()).extracting(DefaultAnalysisWarnings.Message::getText) | |||
.containsOnly("Missing blame information for 1 file. This may lead to some features not working correctly. Please check the analysis logs."); | |||
} | |||
@Test | |||
@@ -47,8 +67,8 @@ public class DefaultBlameOutputTest { | |||
thrown.expect(IllegalArgumentException.class); | |||
thrown.expectMessage("It was not expected to blame file " + file); | |||
new DefaultBlameOutput(null, Arrays.<InputFile>asList(new TestInputFileBuilder("foo", "src/main/java/Foo2.java").build())) | |||
.blameResult(file, Arrays.asList(new BlameLine().revision("1").author("guy"))); | |||
new DefaultBlameOutput(null, analysisWarnings, singletonList(new TestInputFileBuilder("foo", "src/main/java/Foo2.java").build())) | |||
.blameResult(file, singletonList(new BlameLine().revision("1").author("guy"))); | |||
} | |||
@Test | |||
@@ -58,8 +78,8 @@ public class DefaultBlameOutputTest { | |||
thrown.expect(IllegalArgumentException.class); | |||
thrown.expectMessage("Blame date is null for file " + file + " at line 1"); | |||
new DefaultBlameOutput(null, Arrays.<InputFile>asList(file)) | |||
.blameResult(file, Arrays.asList(new BlameLine().revision("1").author("guy"))); | |||
new DefaultBlameOutput(null, analysisWarnings, singletonList(file)) | |||
.blameResult(file, singletonList(new BlameLine().revision("1").author("guy"))); | |||
} | |||
@Test | |||
@@ -69,8 +89,8 @@ public class DefaultBlameOutputTest { | |||
thrown.expect(IllegalArgumentException.class); | |||
thrown.expectMessage("Blame revision is blank for file " + file + " at line 1"); | |||
new DefaultBlameOutput(null, Arrays.<InputFile>asList(file)) | |||
.blameResult(file, Arrays.asList(new BlameLine().date(new Date()).author("guy"))); | |||
new DefaultBlameOutput(null, analysisWarnings, singletonList(file)) | |||
.blameResult(file, singletonList(new BlameLine().date(new Date()).author("guy"))); | |||
} | |||
} |