public class DefaultAnalysisMode extends AbstractAnalysisMode implements AnalysisMode {
private static final Logger LOG = LoggerFactory.getLogger(DefaultAnalysisMode.class);
- private static final String KEY_ONLY_ANALYZE_CHANGED = "sonar.scanChangedFilesOnly";
+ private static final String KEY_SCAN_ALL = "sonar.scanAllFiles";
private boolean mediumTestMode;
private boolean notAssociated;
- private boolean onlyChanged;
+ private boolean scanAllFiles;
public DefaultAnalysisMode(GlobalProperties globalProps, AnalysisProperties props) {
init(globalProps.properties(), props.properties());
return notAssociated;
}
- public boolean onlyAnalyzeChanged() {
- return onlyChanged;
+ public boolean scanAllFiles() {
+ return scanAllFiles;
}
private void init(Map<String, String> globalProps, Map<String, String> analysisProps) {
issues = CoreProperties.ANALYSIS_MODE_ISSUES.equals(mode) || CoreProperties.ANALYSIS_MODE_PREVIEW.equals(mode);
mediumTestMode = "true".equals(getPropertyWithFallback(analysisProps, globalProps, FakePluginInstaller.MEDIUM_TEST_ENABLED));
notAssociated = issues && rootProjectKeyMissing(analysisProps);
- String onlyChangedStr = getPropertyWithFallback(analysisProps, globalProps, KEY_ONLY_ANALYZE_CHANGED);
- onlyChanged = issues && "true".equals(onlyChangedStr);
+ String scanAllStr = getPropertyWithFallback(analysisProps, globalProps, KEY_SCAN_ALL);
+ scanAllFiles = !issues || "true".equals(scanAllStr);
}
public void printMode() {
if (notAssociated) {
LOG.info("Local analysis");
}
- if (onlyChanged) {
+ if (!scanAllFiles) {
LOG.info("Scanning only changed files");
}
}
}
private boolean shouldCopyServerIssues(BatchComponent component) {
- if (mode.onlyAnalyzeChanged() && component.isFile()) {
+ if (!mode.scanAllFiles() && component.isFile()) {
DefaultInputFile inputFile = (DefaultInputFile) component.inputComponent();
if (inputFile.status() == Status.SAME) {
return true;
this.binaryDirs = initializer.binaryDirs();
// filter the files that sensors have access to (SONAR-6931)
- if (mode.onlyAnalyzeChanged()) {
+ if (!mode.scanAllFiles()) {
setDefaultPredicate(predicates.not(predicates.hasStatus(Status.SAME)));
}
}
this.binaryDirs = initializer.binaryDirs();
// filter the files sensors have access to
- if (mode.onlyAnalyzeChanged()) {
+ if (!mode.scanAllFiles()) {
setDefaultPredicate(predicates.not(predicates.hasStatus(Status.SAME)));
}
}
}
@Test
- public void only_scan_changed() {
+ public void scan_all() {
Map<String, String> props = new HashMap<>();
props.put(CoreProperties.ANALYSIS_MODE, CoreProperties.ANALYSIS_MODE_ISSUES);
GlobalProperties globalProps = new GlobalProperties(props);
- props.put("sonar.scanChangedFilesOnly", "true");
- AnalysisProperties analysisProps = new AnalysisProperties(props);
-
+ AnalysisProperties analysisProps = new AnalysisProperties(new HashMap<String, String>());
DefaultAnalysisMode mode = new DefaultAnalysisMode(globalProps, analysisProps);
- assertThat(mode.onlyAnalyzeChanged()).isTrue();
+ assertThat(mode.scanAllFiles()).isFalse();
+
+ props.put("sonar.scanAllFiles", "true");
+ analysisProps = new AnalysisProperties(props);
+
+ mode = new DefaultAnalysisMode(globalProps, analysisProps);
+ assertThat(mode.scanAllFiles()).isTrue();
props.put(CoreProperties.ANALYSIS_MODE, CoreProperties.ANALYSIS_MODE_PUBLISH);
analysisProps = new AnalysisProperties(props);
mode = new DefaultAnalysisMode(globalProps, analysisProps);
- assertThat(mode.onlyAnalyzeChanged()).isFalse();
+ assertThat(mode.scanAllFiles()).isTrue();
}
@Test
public void default_publish_mode() {
DefaultAnalysisMode mode = createMode(null);
assertThat(mode.isPublish()).isTrue();
- assertThat(mode.onlyAnalyzeChanged()).isFalse();
+ assertThat(mode.scanAllFiles()).isTrue();
}
@Test
DefaultAnalysisMode mode = createMode(CoreProperties.ANALYSIS_MODE_ISSUES);
assertThat(mode.isIssues()).isTrue();
- assertThat(mode.onlyAnalyzeChanged()).isFalse();
+ assertThat(mode.scanAllFiles()).isFalse();
}
private static DefaultAnalysisMode createMode(@Nullable String mode) {
package org.sonar.batch.mediumtest.issuesmode;
import org.assertj.core.api.Condition;
-
import com.google.common.io.Resources;
import org.sonar.batch.repository.FileData;
import com.google.common.collect.ImmutableMap;
}
@Test
- public void testIssueTrackingChangedFiles() throws Exception {
+ public void testScanAll() throws Exception {
+ File projectDir = copyProject("/mediumtest/xoo/sample");
+
+ TaskResult result = tester
+ .newScanTask(new File(projectDir, "sonar-project.properties"))
+ .property("sonar.scanAllFiles", "true")
+ .start();
+
+ assertNumberIssues(result, 16, 3, 0);
+
+ /*
+ * 8 new per line
+ * 1 manual
+ */
+ assertNumberIssuesOnFile(result, "HelloJava.xoo", 9);
+ }
+
+ @Test
+ public void testScanOnlyChangedFiles() throws Exception {
File projectDir = copyProject("/mediumtest/xoo/sample");
TaskResult result = tester
.newScanTask(new File(projectDir, "sonar-project.properties"))
- .property("sonar.scanChangedFilesOnly", "true")
.start();
- int newIssues = 0;
- int openIssues = 0;
- int resolvedIssue = 0;
- for (Issue issue : result.trackedIssues()) {
- System.out
- .println(issue.message() + " " + issue.key() + " " + issue.ruleKey() + " " + issue.isNew() + " " + issue.resolution() + " " + issue.componentKey() + " " + issue.line());
- if (issue.isNew()) {
- newIssues++;
- } else if (issue.resolution() != null) {
- resolvedIssue++;
- } else {
- openIssues++;
- }
- }
/*
* We have:
* 6 new issues per line (open) in helloscala.xoo
* 1 manual issue (open, not new) in HelloJava.xoo
* 1 existing issue on the project (open, not new)
*/
- System.out.println("new: " + newIssues + " open: " + openIssues + " resolved " + resolvedIssue);
- assertThat(newIssues).isEqualTo(8);
- assertThat(openIssues).isEqualTo(3);
- assertThat(resolvedIssue).isEqualTo(0);
+ assertNumberIssues(result, 8, 3, 0);
// should only have server issues (HelloJava.xoo should not have been analyzed)
- assertThat(result.trackedIssues()).haveExactly(2, new Condition<Issue>() {
+ assertNumberIssuesOnFile(result, "HelloJava.xoo", 2);
+ }
+
+ private static void assertNumberIssuesOnFile(TaskResult result, final String fileNameEndsWith, int issues) {
+ assertThat(result.trackedIssues()).haveExactly(issues, new Condition<Issue>() {
@Override
public boolean matches(Issue value) {
- return value.componentKey().endsWith("HelloJava.xoo");
+ return value.componentKey().endsWith(fileNameEndsWith);
}
});
}
+ private static void assertNumberIssues(TaskResult result, int expectedNew, int expectedOpen, int expectedResolved) {
+ int newIssues = 0;
+ int openIssues = 0;
+ int resolvedIssue = 0;
+ for (Issue issue : result.trackedIssues()) {
+ System.out
+ .println(issue.message() + " " + issue.key() + " " + issue.ruleKey() + " " + issue.isNew() + " " + issue.resolution() + " " + issue.componentKey() + " " + issue.line());
+ if (issue.isNew()) {
+ newIssues++;
+ } else if (issue.resolution() != null) {
+ resolvedIssue++;
+ } else {
+ openIssues++;
+ }
+ }
+
+ System.out.println("new: " + newIssues + " open: " + openIssues + " resolved " + resolvedIssue);
+ assertThat(newIssues).isEqualTo(expectedNew);
+ assertThat(openIssues).isEqualTo(expectedOpen);
+ assertThat(resolvedIssue).isEqualTo(expectedResolved);
+ }
}
@Test
public void default_predicate_scan_only_changed() throws IOException {
- when(mode.onlyAnalyzeChanged()).thenReturn(true);
+ when(mode.scanAllFiles()).thenReturn(false);
DefaultModuleFileSystem fs = new DefaultModuleFileSystem(moduleInputFileCache,
new Project("foo"), settings, fileIndexer, initializer, componentIndexer, mode);