]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6931 Speed up issues mode by scanning only changed files 618/head
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Thu, 5 Nov 2015 15:56:58 +0000 (16:56 +0100)
committerDuarte Meneses <duarte.meneses@sonarsource.com>
Thu, 5 Nov 2015 16:04:57 +0000 (17:04 +0100)
sonar-batch/src/main/java/org/sonar/batch/analysis/DefaultAnalysisMode.java
sonar-batch/src/main/java/org/sonar/batch/issue/tracking/LocalIssueTracking.java
sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystem.java
sonar-batch/src/test/java/org/sonar/batch/analysis/DefaultAnalysisModeTest.java
sonar-batch/src/test/java/org/sonar/batch/mediumtest/issuesmode/ScanOnlyChangedTest.java
sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystemTest.java

index 2e0d79cf9d11e87c0a897fc9d3be4e763f14d595..31784aa1e806ec3f8d993035e40fbc8b648950ab 100644 (file)
@@ -36,11 +36,11 @@ import java.util.Map;
 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());
@@ -54,8 +54,8 @@ public class DefaultAnalysisMode extends AbstractAnalysisMode implements Analysi
     return notAssociated;
   }
 
-  public boolean onlyAnalyzeChanged() {
-    return onlyChanged;
+  public boolean scanAllFiles() {
+    return scanAllFiles;
   }
 
   private void init(Map<String, String> globalProps, Map<String, String> analysisProps) {
@@ -76,8 +76,8 @@ public class DefaultAnalysisMode extends AbstractAnalysisMode implements Analysi
     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() {
@@ -94,7 +94,7 @@ public class DefaultAnalysisMode extends AbstractAnalysisMode implements Analysi
     if (notAssociated) {
       LOG.info("Local analysis");
     }
-    if (onlyChanged) {
+    if (!scanAllFiles) {
       LOG.info("Scanning only changed files");
     }
   }
index eaaf466228ef0b9119bf1437d013fd3ad3d5350e..8c77079f5f6e75759b89b4dc38fa1e4594915c2a 100644 (file)
@@ -115,7 +115,7 @@ public class LocalIssueTracking {
   }
 
   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;
index 17d6f8d4271b7c9e7db0406a51d74648e3a78b5b..ad73100f46791d58c3b837686163d0f99b5ab9e3 100644 (file)
@@ -78,7 +78,7 @@ public class DefaultModuleFileSystem extends DefaultFileSystem implements Module
     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)));
     }
   }
@@ -98,7 +98,7 @@ public class DefaultModuleFileSystem extends DefaultFileSystem implements Module
     this.binaryDirs = initializer.binaryDirs();
     
     // filter the files sensors have access to
-    if (mode.onlyAnalyzeChanged()) {
+    if (!mode.scanAllFiles()) {
       setDefaultPredicate(predicates.not(predicates.hasStatus(Status.SAME)));
     }
   }
index 9c9b294cbafd9d96308f4a8d89bcfba51c642318..707205954758269b4fc7e6e3ac1f1465b0a3701d 100644 (file)
@@ -84,29 +84,33 @@ public class DefaultAnalysisModeTest {
   }
 
   @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
@@ -114,7 +118,7 @@ public class DefaultAnalysisModeTest {
     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) {
index 05e68afb164d3dcc95406d03f6e7dd8be798c527..2141351e8522120d1056dd3138673df5b390d875 100644 (file)
@@ -20,7 +20,6 @@
 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;
@@ -139,28 +138,31 @@ public class ScanOnlyChangedTest {
   }
 
   @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
@@ -169,18 +171,40 @@ public class ScanOnlyChangedTest {
      * 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);
+  }
 }
index ea087c8ebcb2bb823e29dd040d0ab97fea2755dd..b2035597af976116d746f7d30a179b6c6cc6e58e 100644 (file)
@@ -116,7 +116,7 @@ public class DefaultModuleFileSystemTest {
 
   @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);