From aa5537ba9748dd4f3f9c876064ff6a6e641cba3e Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Fri, 25 Aug 2017 11:27:51 +0200 Subject: [PATCH] SONAR-9757 Copy issues in directories with unchanged files only --- .../scanner/report/ComponentsPublisher.java | 24 +++++++++ .../report/ComponentsPublisherTest.java | 49 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ComponentsPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ComponentsPublisher.java index f28f73c7a43..b04a23870d4 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ComponentsPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ComponentsPublisher.java @@ -115,6 +115,11 @@ public class ComponentsPublisher implements ReportPublisherStep { if (lang != null) { builder.setLanguage(lang); } + } else if (component instanceof InputDir) { + FileStatus status = getDirectoryStatus(component, children); + if (status != null) { + builder.setStatus(status); + } } String path = getPath(component); @@ -143,6 +148,25 @@ public class ComponentsPublisher implements ReportPublisherStep { } } + @CheckForNull + private static FileStatus getDirectoryStatus(InputComponent component, Collection children) { + if (children.isEmpty()) { + // directory must have issues, otherwise wouldn't be written + return null; + } + + boolean hasChangedFiles = children.stream() + .filter(c -> c instanceof InputFile) + .map(c -> (DefaultInputFile) c) + .anyMatch(f -> f.isPublished() && f.status() != Status.SAME); + + if (!hasChangedFiles) { + // this means that SonarJava didn't analyze the directory + return FileStatus.SAME; + } + return null; + } + private boolean shouldSkipComponent(DefaultInputComponent component, Collection children) { if (component instanceof InputDir && children.isEmpty()) { try (CloseableIterator componentIssuesIt = reader.readComponentIssues(component.batchId())) { diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java index 20966ceef77..ca7163a0e01 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java @@ -58,12 +58,14 @@ public class ComponentsPublisherTest { private InputModuleHierarchy moduleHierarchy; private File outputDir; private ScannerReportWriter writer; + private ScannerReportReader reader; @Before public void setUp() throws IOException { tree = new DefaultComponentTree(); outputDir = temp.newFolder(); writer = new ScannerReportWriter(outputDir); + reader = new ScannerReportReader(outputDir); } private void writeIssue(int componentId) { @@ -198,6 +200,53 @@ public class ComponentsPublisherTest { assertThat(writer.hasComponentData(FileStructure.Domain.COMPONENT, 3)).isFalse(); assertThat(writer.hasComponentData(FileStructure.Domain.COMPONENT, 6)).isFalse(); assertThat(writer.hasComponentData(FileStructure.Domain.COMPONENT, 7)).isFalse(); + } + + @Test + public void should_set_directory_status() throws IOException { + ProjectAnalysisInfo projectAnalysisInfo = mock(ProjectAnalysisInfo.class); + when(projectAnalysisInfo.analysisDate()).thenReturn(DateUtils.parseDate("2012-12-12")); + + ProjectDefinition rootDef = ProjectDefinition.create() + .setKey("foo") + .setProperty(CoreProperties.PROJECT_VERSION_PROPERTY, "1.0") + .setName("Root project") + .setDescription("Root description") + .setBaseDir(temp.newFolder()) + .setWorkDir(temp.newFolder()); + DefaultInputModule root = new DefaultInputModule(rootDef, 1); + + moduleHierarchy = mock(InputModuleHierarchy.class); + when(moduleHierarchy.root()).thenReturn(root); + when(moduleHierarchy.children(root)).thenReturn(Collections.emptyList()); + + // dir with unchanged files + DefaultInputDir dir = new DefaultInputDir("module1", "src", 2); + tree.index(dir, root); + + // dir with changed files + DefaultInputDir dir2 = new DefaultInputDir("module1", "src2", 3); + tree.index(dir2, root); + + DefaultInputFile file = new TestInputFileBuilder("module1", "src/Foo.java", 4).setLines(2).setStatus(InputFile.Status.SAME).build(); + tree.index(file, dir); + + DefaultInputFile file2 = new TestInputFileBuilder("module1", "src/Foo.java", 5).setLines(2).setStatus(InputFile.Status.ADDED).build(); + tree.index(file2, dir2); + + ComponentsPublisher publisher = new ComponentsPublisher(moduleHierarchy, tree); + publisher.publish(writer); + + assertThat(writer.hasComponentData(FileStructure.Domain.COMPONENT, 1)).isTrue(); + assertThat(writer.hasComponentData(FileStructure.Domain.COMPONENT, 2)).isTrue(); + assertThat(writer.hasComponentData(FileStructure.Domain.COMPONENT, 3)).isTrue(); + assertThat(writer.hasComponentData(FileStructure.Domain.COMPONENT, 4)).isTrue(); + assertThat(writer.hasComponentData(FileStructure.Domain.COMPONENT, 5)).isTrue(); + + // directory is unchanged because its files are unchanged + assertThat(reader.readComponent(2).getStatus()).isEqualTo(FileStatus.SAME); + // status not set + assertThat(reader.readComponent(3).getStatus()).isEqualTo(FileStatus.UNAVAILABLE); } -- 2.39.5