]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-13262 P/R analysis fails if top directory as same name as project
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Fri, 27 Mar 2020 16:43:28 +0000 (11:43 -0500)
committersonartech <sonartech@sonarsource.com>
Fri, 17 Apr 2020 20:03:43 +0000 (20:03 +0000)
server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilder.java
server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java

index 7a7bd3b5b51800a55f17a7bbe50275a062b3d934..96edd8711ab04d8dca58b9f89dd877ecbfab7db8 100644 (file)
@@ -213,16 +213,16 @@ public class ComponentTreeBuilder {
   }
 
   public Component buildChangedComponentTreeRoot(Component project) {
-    return buildChangedComponentTree(project, "");
+    return buildChangedComponentTree(project);
   }
 
   @Nullable
-  private static Component buildChangedComponentTree(Component component, String parentPath) {
+  private static Component buildChangedComponentTree(Component component) {
     switch (component.getType()) {
       case PROJECT:
         return buildChangedProject(component);
       case DIRECTORY:
-        return buildChangedDirectory(component, parentPath);
+        return buildChangedDirectory(component);
       case FILE:
         return buildChangedFile(component);
       default:
@@ -231,14 +231,14 @@ public class ComponentTreeBuilder {
   }
 
   private static Component buildChangedProject(Component component) {
-    return changedComponentBuilder(component, "", "")
+    return changedComponentBuilder(component, "")
       .setProjectAttributes(new ProjectAttributes(component.getProjectAttributes()))
       .addChildren(buildChangedComponentChildren(component))
       .build();
   }
 
   @Nullable
-  private static Component buildChangedDirectory(Component component, String parentPath) {
+  private static Component buildChangedDirectory(Component component) {
     List<Component> children = buildChangedComponentChildren(component);
     if (children.isEmpty()) {
       return null;
@@ -246,11 +246,12 @@ public class ComponentTreeBuilder {
 
     if (children.size() == 1 && children.get(0).getType() == Component.Type.DIRECTORY) {
       Component child = children.get(0);
-      return changedComponentBuilder(child, parentPath, child.getName())
+      String shortName = component.getShortName() + "/" + child.getShortName();
+      return changedComponentBuilder(child, shortName)
         .addChildren(child.getChildren())
         .build();
     } else {
-      return changedComponentBuilder(component, parentPath, component.getName())
+      return changedComponentBuilder(component, component.getShortName())
         .addChildren(children)
         .build();
     }
@@ -258,12 +259,12 @@ public class ComponentTreeBuilder {
 
   private static List<Component> buildChangedComponentChildren(Component component) {
     return component.getChildren().stream()
-      .map(c -> ComponentTreeBuilder.buildChangedComponentTree(c, component.getName()))
+      .map(ComponentTreeBuilder::buildChangedComponentTree)
       .filter(Objects::nonNull)
       .collect(MoreCollectors.toList());
   }
 
-  private static ComponentImpl.Builder changedComponentBuilder(Component component, String parentPath, String path) {
+  private static ComponentImpl.Builder changedComponentBuilder(Component component, String newShortName) {
     return ComponentImpl.builder(component.getType())
       .setUuid(component.getUuid())
       .setDbKey(component.getDbKey())
@@ -271,7 +272,7 @@ public class ComponentTreeBuilder {
       .setStatus(component.getStatus())
       .setReportAttributes(component.getReportAttributes())
       .setName(component.getName())
-      .setShortName(removeStart(removeStart(path, parentPath), "/"))
+      .setShortName(newShortName)
       .setDescription(component.getDescription());
   }
 
index 153cbf4d0d61e4d53b2962eedd05cd2122ad9452..4a4cf3db828616befa90cf9520bcb998c90e508a 100644 (file)
@@ -194,6 +194,29 @@ public class BuildComponentTreeStepTest {
     context.getStatistics().assertValue("components", 7);
   }
 
+  /**
+   * SONAR-13262
+   */
+  @Test
+  public void verify_tree_is_correctly_built_in_prs_with_repeated_names() {
+    setAnalysisMetadataHolder(true);
+    reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF));
+    reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_PROJECT_KEY + "/file.js"));
+
+    TestComputationStepContext context = new TestComputationStepContext();
+    underTest.execute(context);
+
+    // modified root
+    Component mRoot = treeRootHolder.getRoot();
+    verifyComponent(mRoot, Component.Type.PROJECT, ROOT_REF, 1);
+
+    Component dir = mRoot.getChildren().get(0);
+    assertThat(dir.getName()).isEqualTo(REPORT_PROJECT_KEY);
+    assertThat(dir.getShortName()).isEqualTo(REPORT_PROJECT_KEY);
+
+    verifyComponent(dir, Component.Type.DIRECTORY, null, 1);
+  }
+
   @Test
   public void compute_keys_and_uuids() {
     setAnalysisMetadataHolder();
@@ -273,11 +296,7 @@ public class BuildComponentTreeStepTest {
 
   @Test
   public void generate_keys_when_using_main_branch() {
-    Branch branch = new DefaultBranchImpl();
-    analysisMetadataHolder.setRootComponentRef(ROOT_REF)
-      .setAnalysisDate(ANALYSIS_DATE)
-      .setProject(Project.from(newPrivateProjectDto(newOrganizationDto()).setDbKey(REPORT_PROJECT_KEY)))
-      .setBranch(branch);
+    setAnalysisMetadataHolder();
     BuildComponentTreeStep underTest = new BuildComponentTreeStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder, reportModulesPath);
     reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF));
     reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_FILE_PATH_1));
@@ -498,6 +517,7 @@ public class BuildComponentTreeStepTest {
     ScannerReport.Component.Builder builder = ScannerReport.Component.newBuilder()
       .setType(componentType)
       .setRef(componentRef)
+      .setName(key)
       .setStatus(status)
       .setLines(1)
       .setKey(key);
@@ -559,7 +579,7 @@ public class BuildComponentTreeStepTest {
     analysisMetadataHolder.setRootComponentRef(ROOT_REF)
       .setAnalysisDate(ANALYSIS_DATE)
       .setBranch(branch)
-      .setProject(Project.from(newPrivateProjectDto(newOrganizationDto()).setDbKey(REPORT_PROJECT_KEY)));
+      .setProject(Project.from(newPrivateProjectDto(newOrganizationDto()).setDbKey(REPORT_PROJECT_KEY).setName(REPORT_PROJECT_KEY)));
   }
 
   public static ScannerReport.Metadata createReportMetadata(@Nullable String projectVersion, @Nullable String buildString) {