]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9607 Do not copy unchanged source files in scanner report
authorJulien HENRY <julien.henry@sonarsource.com>
Tue, 25 Jul 2017 15:48:43 +0000 (17:48 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Mon, 7 Aug 2017 09:44:06 +0000 (11:44 +0200)
12 files changed:
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStore.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStoreProvider.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdExecutorTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/DefaultPostJobContextTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/CoveragePublisherTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MeasuresPublisherTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/SourcePublisherTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleIndexerTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputComponentStoreTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStoreTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/report/JSONReportTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/source/ZeroCoverageSensorTest.java

index cc9c3b34123ac71408505c68dfa68057d13f0d4b..0138e851c689ef00bdc828e43bdcbe8da96b802c 100644 (file)
@@ -32,10 +32,12 @@ import java.util.Map;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import javax.annotation.CheckForNull;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.ScannerSide;
 import org.sonar.api.batch.fs.InputComponent;
 import org.sonar.api.batch.fs.InputDir;
 import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.fs.InputFile.Status;
 import org.sonar.api.batch.fs.InputModule;
 import org.sonar.api.batch.fs.internal.DefaultInputDir;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
@@ -62,9 +64,11 @@ public class InputComponentStore {
   private final SetMultimap<String, InputFile> filesByNameCache = LinkedHashMultimap.create();
   private final SetMultimap<String, InputFile> filesByExtensionCache = LinkedHashMultimap.create();
   private final InputModule root;
+  private final AnalysisMode mode;
 
-  public InputComponentStore(DefaultInputModule root) {
+  public InputComponentStore(DefaultInputModule root, AnalysisMode mode) {
     this.root = root;
+    this.mode = mode;
     this.put(root);
   }
 
@@ -75,7 +79,8 @@ public class InputComponentStore {
   public Iterable<DefaultInputFile> allFilesToPublish() {
     return inputFileCache.values().stream()
       .map(f -> (DefaultInputFile) f)
-      .filter(DefaultInputFile::isPublished)::iterator;
+      .filter(DefaultInputFile::isPublished)
+      .filter(f -> !mode.isIncremental() || f.status() != Status.SAME)::iterator;
   }
 
   public Iterable<InputFile> allFiles() {
index 6f8ecbb655c7564ec1741981406a35d645106d3f..2225f245207426f4679a69044154b864cb691ee0 100644 (file)
 package org.sonar.scanner.scan.filesystem;
 
 import org.picocontainer.injectors.ProviderAdapter;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
 
 public class InputComponentStoreProvider extends ProviderAdapter {
   private InputComponentStore store;
 
-  public InputComponentStore provide(InputModuleHierarchy hierarchy) {
+  public InputComponentStore provide(InputModuleHierarchy hierarchy, AnalysisMode mode) {
     if (store == null) {
-      store = new InputComponentStore(hierarchy.root());
+      store = new InputComponentStore(hierarchy.root(), mode);
     }
     return store;
   }
index e3407fc6fe0ad960e46f9accd09b59eea146dc55..71d060e2f46b5a6b7ed9bcb63ffd0183d00f9609 100644 (file)
@@ -30,6 +30,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
@@ -85,7 +86,7 @@ public class CpdExecutorTest {
 
     index = new SonarCpdBlockIndex(publisher, settings);
     DefaultInputModule inputModule = TestInputFileBuilder.newDefaultInputModule("foo", baseDir);
-    componentStore = new InputComponentStore(inputModule);
+    componentStore = new InputComponentStore(inputModule, mock(AnalysisMode.class));
     executor = new CpdExecutor(settings, index, publisher, componentStore);
     reader = new ScannerReportReader(outputDir);
 
index d1bcef89d99def5120eab9a8e69bec77601e0df6..8d0eb0085da468674a40e421d6d3c14dd797e00e 100644 (file)
@@ -54,7 +54,7 @@ public class DefaultPostJobContextTest {
   public void setUp() throws IOException {
     issueCache = mock(IssueCache.class);
     DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule("foo", temp.newFolder());
-    componentStore = new InputComponentStore(rootModule);
+    componentStore = new InputComponentStore(rootModule, mock(AnalysisMode.class));
     settings = new MapSettings();
     analysisMode = mock(AnalysisMode.class);
     context = new DefaultPostJobContext(settings.asConfig(), settings, issueCache, componentStore, analysisMode);
index 794345ebdf7c8422e9692bc5d20a9c142d8571e7..76ce5527497eef24994382f5fe63dc3dfc973d61 100644 (file)
@@ -25,6 +25,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
@@ -57,7 +58,7 @@ public class CoveragePublisherTest {
     String moduleKey = "foo";
     inputFile = new TestInputFileBuilder(moduleKey, "src/Foo.php").setLines(5).build();
     DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule(moduleKey, temp.newFolder());
-    InputComponentStore componentCache = new InputComponentStore(rootModule);
+    InputComponentStore componentCache = new InputComponentStore(rootModule, mock(AnalysisMode.class));
     componentCache.put(inputFile);
 
     measureCache = mock(MeasureCache.class);
index 224d3533423113b2dffd3b9a379d1aa3258b12c8..3e5c7d507e56beffc3352778636f7bd5f3e806a5 100644 (file)
@@ -28,6 +28,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
@@ -68,7 +69,7 @@ public class MeasuresPublisherTest {
     String moduleKey = "foo";
     inputModule = TestInputFileBuilder.newDefaultInputModule(moduleKey, temp.newFolder());
     inputFile = new TestInputFileBuilder(moduleKey, "src/Foo.php").setPublish(true).build();
-    InputComponentStore componentCache = new InputComponentStore(inputModule);
+    InputComponentStore componentCache = new InputComponentStore(inputModule, mock(AnalysisMode.class));
     componentCache.put(inputFile);
     measureCache = mock(MeasureCache.class);
     when(measureCache.byComponentKey(anyString())).thenReturn(Collections.<DefaultMeasure<?>>emptyList());
index 8745a546aed2e204fffa0696b122c1fa67c149b0..60b51e5a8f247fd62b68c8d9160935300450552a 100644 (file)
@@ -27,6 +27,8 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.AnalysisMode;
+import org.sonar.api.batch.fs.InputFile.Status;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
@@ -34,6 +36,8 @@ import org.sonar.scanner.protocol.output.ScannerReportWriter;
 import org.sonar.scanner.scan.filesystem.InputComponentStore;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public class SourcePublisherTest {
 
@@ -43,6 +47,7 @@ public class SourcePublisherTest {
   private File sourceFile;
   private ScannerReportWriter writer;
   private DefaultInputFile inputFile;
+  private AnalysisMode analysisMode;
 
   @Before
   public void prepare() throws IOException {
@@ -56,7 +61,8 @@ public class SourcePublisherTest {
       .build();
 
     DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule(moduleKey, baseDir);
-    InputComponentStore componentStore = new InputComponentStore(rootModule);
+    analysisMode = mock(AnalysisMode.class);
+    InputComponentStore componentStore = new InputComponentStore(rootModule, analysisMode);
     componentStore.put(inputFile);
 
     publisher = new SourcePublisher(componentStore);
@@ -114,4 +120,28 @@ public class SourcePublisherTest {
     File out = writer.getSourceFile(inputFile.batchId());
     assertThat(FileUtils.readFileToString(out, StandardCharsets.UTF_8)).isEqualTo("\n2\n3\n4\n5");
   }
+
+  @Test
+  public void publishChangedSourceInIncrementalMode() throws Exception {
+    when(analysisMode.isIncremental()).thenReturn(true);
+    FileUtils.write(sourceFile, "1\n2\n3\n4\n5", StandardCharsets.ISO_8859_1);
+    inputFile.setStatus(Status.CHANGED);
+
+    publisher.publish(writer);
+
+    File out = writer.getSourceFile(inputFile.batchId());
+    assertThat(FileUtils.readFileToString(out, StandardCharsets.UTF_8)).isEqualTo("1\n2\n3\n4\n5");
+  }
+
+  @Test
+  public void dontPublishUnchangedSourceInIncrementalMode() throws Exception {
+    when(analysisMode.isIncremental()).thenReturn(true);
+    FileUtils.write(sourceFile, "foo", StandardCharsets.ISO_8859_1);
+    inputFile.setStatus(Status.SAME);
+
+    publisher.publish(writer);
+
+    File out = writer.getSourceFile(inputFile.batchId());
+    assertThat(out).doesNotExist();
+  }
 }
index c25b4ce33f14bb04b4dbbe06af4d0fa4d8d8ebdc..a11e500c30232ad37952bcafd12ac3d82d4bc210 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.scanner.scan;
 
 import java.util.Arrays;
 import org.junit.Test;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputModule;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
@@ -37,7 +38,7 @@ public class ModuleIndexerTest {
   private InputComponentStore componentStore;
 
   public void createIndexer(DefaultInputModule rootModule) {
-    componentStore = new InputComponentStore(rootModule);
+    componentStore = new InputComponentStore(rootModule, mock(AnalysisMode.class));
     tree = new DefaultComponentTree();
     moduleHierarchy = mock(DefaultInputModuleHierarchy.class);
     indexer = new ModuleIndexer(tree, componentStore, moduleHierarchy);
index 097d9b918b428b629cbee7602d349c3f770ed60e..777af5ef52bffcabac04d54ecb4803d830837c71 100644 (file)
@@ -27,6 +27,7 @@ import java.util.List;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.InputFile.Status;
@@ -37,6 +38,7 @@ import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
 
 public class InputComponentStoreTest {
   @ClassRule
@@ -57,7 +59,7 @@ public class InputComponentStoreTest {
     DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule(rootDef);
     DefaultInputModule subModule = TestInputFileBuilder.newDefaultInputModule(moduleDef);
 
-    InputComponentStore cache = new InputComponentStore(rootModule);
+    InputComponentStore cache = new InputComponentStore(rootModule, mock(AnalysisMode.class));
     cache.put(subModule);
 
     DefaultInputFile fooFile = new TestInputFileBuilder(rootModuleKey, "src/main/java/Foo.java")
@@ -101,7 +103,11 @@ public class InputComponentStoreTest {
 
   static class InputComponentStoreTester extends InputComponentStore {
     InputComponentStoreTester() throws IOException {
+<<<<<<< HEAD
       super(TestInputFileBuilder.newDefaultInputModule("root", temp.newFolder()));
+=======
+      super(new PathResolver(), TestInputFileBuilder.newDefaultInputModule("root", temp.newFolder()), mock(AnalysisMode.class));
+>>>>>>> SONAR-9607 Do not copy unchanged source files in scanner report
     }
 
     InputFile addFile(String moduleKey, String relpath, String language) {
index ff1f957bccfd9fb5288bb53e2b4e51b409ca11d0..0911d7436c72d057aa81f35ca75d251b635495c8 100644 (file)
@@ -24,6 +24,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.InputModule;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
@@ -47,7 +48,7 @@ public class ModuleInputComponentStoreTest {
   @Before
   public void setUp() throws IOException {
     DefaultInputModule root = TestInputFileBuilder.newDefaultInputModule(moduleKey, temp.newFolder());
-    componentStore = new InputComponentStore(root);
+    componentStore = new InputComponentStore(root, mock(AnalysisMode.class));
   }
 
   @Test
index 876fcb13286dffc6bd4317456bed955ea83f2536..148dabfdab9d3c31da6c419085d9c1acb016c3c2 100644 (file)
@@ -31,6 +31,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.DefaultFileSystem;
@@ -82,7 +83,7 @@ public class JSONReportTest {
     DefaultComponentTree inputComponentTree = new DefaultComponentTree();
     ProjectDefinition def = ProjectDefinition.create().setBaseDir(projectBaseDir).setWorkDir(temp.newFolder()).setKey("struts");
     DefaultInputModule rootModule = new DefaultInputModule(def, 1);
-    InputComponentStore inputComponentStore = new InputComponentStore(rootModule);
+    InputComponentStore inputComponentStore = new InputComponentStore(rootModule, mock(AnalysisMode.class));
 
     DefaultInputModule moduleA = new DefaultInputModule(ProjectDefinition.create().setKey("struts-core").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     inputComponentTree.index(moduleA, rootModule);
index 3b30721750f9989c0ce4c7ab72481f894dd66aa7..09a347f71dc0242fde312c9b1c727dd3ab3d2b63 100644 (file)
@@ -38,7 +38,7 @@ public class ZeroCoverageSensorTest {
   public void dontForceCoverageInIncrementalMode() {
     AnalysisMode analysisMode = mock(AnalysisMode.class);
     when(analysisMode.isIncremental()).thenReturn(true);
-    ZeroCoverageSensor zeroCoverageSensor = new ZeroCoverageSensor(null, null, analysisMode);
+    ZeroCoverageSensor zeroCoverageSensor = new ZeroCoverageSensor(null, analysisMode);
     zeroCoverageSensor.execute(null);
     assertThat(logTester.logs(LoggerLevel.DEBUG)).contains("Incremental mode: not forcing coverage to zero");
   }