]> source.dussan.org Git - sonarqube.git/commitdiff
Fix issue tracking for short living branches
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Mon, 14 Aug 2017 15:56:37 +0000 (17:56 +0200)
committerJanos Gyerik <janos.gyerik@sonarsource.com>
Tue, 12 Sep 2017 08:59:56 +0000 (10:59 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/MergeBranchIssuesLoader.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ShortBranchTrackerExecution.java
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerMergeBranchInputFactory.java
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java
sonar-ws/src/main/java/org/sonarqube/ws/client/component/ComponentsService.java

index f0c8946a452c9524e7c468585b1eb5f465afffd2..414920d19a3ac61d66b6440db15ba9eda2d5a247 100644 (file)
@@ -21,7 +21,9 @@ package org.sonar.server.computation.task.projectanalysis.container;
 
 import java.util.Arrays;
 import java.util.List;
+
 import javax.annotation.Nullable;
+
 import org.sonar.ce.organization.DefaultOrganizationLoader;
 import org.sonar.ce.queue.CeTask;
 import org.sonar.ce.settings.SettingsLoader;
@@ -65,7 +67,6 @@ import org.sonar.server.computation.task.projectanalysis.issue.IssueTrackingDele
 import org.sonar.server.computation.task.projectanalysis.issue.IssueVisitors;
 import org.sonar.server.computation.task.projectanalysis.issue.IssuesRepositoryVisitor;
 import org.sonar.server.computation.task.projectanalysis.issue.LoadComponentUuidsHavingOpenIssuesVisitor;
-import org.sonar.server.computation.task.projectanalysis.issue.MergeBranchIssuesLoader;
 import org.sonar.server.computation.task.projectanalysis.issue.MovedIssueVisitor;
 import org.sonar.server.computation.task.projectanalysis.issue.NewEffortAggregator;
 import org.sonar.server.computation.task.projectanalysis.issue.NewEffortCalculator;
@@ -240,7 +241,6 @@ public final class ProjectAnalysisTaskContainerPopulator implements ContainerPop
       ShortBranchTrackerExecution.class,
       ComponentIssuesLoader.class,
       BaseIssuesLoader.class,
-      MergeBranchIssuesLoader.class,
       IssueTrackingDelegator.class,
 
       // filemove
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/MergeBranchIssuesLoader.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/MergeBranchIssuesLoader.java
deleted file mode 100644 (file)
index b32e08c..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2017 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.computation.task.projectanalysis.issue;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.sonar.core.issue.DefaultIssue;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.component.ComponentDto;
-import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
-
-public class MergeBranchIssuesLoader {
-  private final DbClient dbClient;
-  private final ComponentIssuesLoader issuesLoader;
-  private final AnalysisMetadataHolder analysisMetadataHolder;
-  private Map<String, String> uuidsByKey;
-
-  public MergeBranchIssuesLoader(DbClient dbClient, ComponentIssuesLoader issuesLoader, AnalysisMetadataHolder analysisMetadataHolder) {
-    this.dbClient = dbClient;
-    this.issuesLoader = issuesLoader;
-    this.analysisMetadataHolder = analysisMetadataHolder;
-  }
-
-  public void loadMergeBranchComponents() {
-    String mergeBranchUuid = analysisMetadataHolder.getBranch().get().getMergeBranchUuid().get();
-
-    uuidsByKey = new HashMap<>();
-    try (DbSession dbSession = dbClient.openSession(false)) {
-
-      List<ComponentDto> components = dbClient.componentDao().selectByProjectUuid(mergeBranchUuid, dbSession);
-      for (ComponentDto dto : components) {
-        uuidsByKey.put(dto.getDbKey(), dto.uuid());
-      }
-    }
-  }
-
-  public List<DefaultIssue> loadForKey(String componentKey) {
-    if (uuidsByKey == null) {
-      loadMergeBranchComponents();
-    }
-
-    String componentUuid = uuidsByKey.get(componentKey);
-
-    if (componentUuid == null) {
-      return Collections.emptyList();
-    }
-
-    return issuesLoader.loadForComponentUuid(componentUuid);
-  }
-}
index 1666e3ea1ab25a4a9d239bab987eb41bb76243c9..f5888d5c2cb32ffc7c0ccf5255b6646259528157 100644 (file)
@@ -47,8 +47,8 @@ public class ShortBranchTrackerExecution {
     Input<DefaultIssue> baseInput = baseInputFactory.create(component);
     Input<DefaultIssue> mergeInput = mergeInputFactory.create(component);
 
-    Tracking<DefaultIssue, DefaultIssue> baseTracking = tracker.track(rawInput, mergeInput);
-    List<DefaultIssue> unmatchedRaws = toList(baseTracking.getUnmatchedRaws());
+    Tracking<DefaultIssue, DefaultIssue> mergeTracking = tracker.track(rawInput, mergeInput);
+    List<DefaultIssue> unmatchedRaws = toList(mergeTracking.getUnmatchedRaws());
     Input<DefaultIssue> unmatchedRawInput = new DefaultTrackingInput(unmatchedRaws, rawInput.getLineHashSequence(), rawInput.getBlockHashSequence());
 
     // do second tracking with base branch using raws issues that are still unmatched
index 44f65e4a798bfd0159bf08ae91e6b7bbae8743c2..21630f57dc8ac1769266044b83cb6f2493aafd8f 100644 (file)
 package org.sonar.server.computation.task.projectanalysis.issue;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import javax.annotation.Nullable;
+
+import org.apache.commons.lang.StringUtils;
 import org.sonar.core.issue.DefaultIssue;
 import org.sonar.core.issue.tracking.Input;
 import org.sonar.core.issue.tracking.LazyInput;
 import org.sonar.core.issue.tracking.LineHashSequence;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
+import org.sonar.db.component.ComponentDto;
+import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
 import org.sonar.server.computation.task.projectanalysis.component.Component;
 
 public class TrackerMergeBranchInputFactory {
   private static final LineHashSequence EMPTY_LINE_HASH_SEQUENCE = new LineHashSequence(Collections.<String>emptyList());
 
-  private final MergeBranchIssuesLoader mergeIssuesLoader;
+  private final ComponentIssuesLoader mergeIssuesLoader;
   private final DbClient dbClient;
+  private final AnalysisMetadataHolder analysisMetadataHolder;
+  private Map<String, String> uuidsByKey;
 
-  public TrackerMergeBranchInputFactory(MergeBranchIssuesLoader mergeIssuesLoader, DbClient dbClient) {
+  public TrackerMergeBranchInputFactory(ComponentIssuesLoader mergeIssuesLoader, AnalysisMetadataHolder analysisMetadataHolder, DbClient dbClient) {
     this.mergeIssuesLoader = mergeIssuesLoader;
+    this.analysisMetadataHolder = analysisMetadataHolder;
     this.dbClient = dbClient;
     // TODO detect file moves?
   }
 
+  private void loadMergeBranchComponents() {
+    String mergeBranchUuid = analysisMetadataHolder.getBranch().get().getMergeBranchUuid().get();
+
+    uuidsByKey = new HashMap<>();
+    try (DbSession dbSession = dbClient.openSession(false)) {
+
+      List<ComponentDto> components = dbClient.componentDao().selectByProjectUuid(mergeBranchUuid, dbSession);
+      for (ComponentDto dto : components) {
+        uuidsByKey.put(removeBranchFromKey(dto.getDbKey()), dto.uuid());
+      }
+    }
+  }
+
   public Input<DefaultIssue> create(Component component) {
-    return new MergeLazyInput(component);
+    if (uuidsByKey == null) {
+      loadMergeBranchComponents();
+    }
+
+    String cleanComponentKey = removeBranchFromKey(component.getKey());
+    String mergeBranchComponentUuid = uuidsByKey.get(cleanComponentKey);
+    return new MergeLazyInput(component.getType(), mergeBranchComponentUuid);
   }
 
   private class MergeLazyInput extends LazyInput<DefaultIssue> {
-    private final Component component;
+    private final Component.Type type;
+    private final String mergeBranchComponentUuid;
 
-    private MergeLazyInput(Component component) {
-      this.component = component;
+    private MergeLazyInput(Component.Type type, @Nullable String mergeBranchComponentUuid) {
+      this.type = type;
+      this.mergeBranchComponentUuid = mergeBranchComponentUuid;
     }
 
     @Override
     protected LineHashSequence loadLineHashSequence() {
-      if (component.getType() != Component.Type.FILE) {
+      if (mergeBranchComponentUuid == null || type != Component.Type.FILE) {
         return EMPTY_LINE_HASH_SEQUENCE;
       }
 
       try (DbSession session = dbClient.openSession(false)) {
-        List<String> hashes = dbClient.fileSourceDao().selectLineHashes(session, component.getUuid());
+        List<String> hashes = dbClient.fileSourceDao().selectLineHashes(session, mergeBranchComponentUuid);
         if (hashes == null || hashes.isEmpty()) {
           return EMPTY_LINE_HASH_SEQUENCE;
         }
@@ -70,7 +101,14 @@ public class TrackerMergeBranchInputFactory {
 
     @Override
     protected List<DefaultIssue> loadIssues() {
-      return mergeIssuesLoader.loadForKey(component.getUuid());
+      if (mergeBranchComponentUuid == null) {
+        return Collections.emptyList();
+      }
+      return mergeIssuesLoader.loadForComponentUuid(mergeBranchComponentUuid);
     }
   }
+
+  private static String removeBranchFromKey(String componentKey) {
+    return StringUtils.substringBeforeLast(componentKey, ":BRANCH:");
+  }
 }
index 33f85ac5d33c3a0bedcccd1a6c0e149bbeb76d96..6c663d282500689f6af113b23f0b87b9a37429d2 100644 (file)
@@ -116,7 +116,6 @@ public class IntegrateIssuesVisitorTest {
   ArgumentCaptor<DefaultIssue> defaultIssueCaptor = ArgumentCaptor.forClass(DefaultIssue.class);
 
   ComponentIssuesLoader issuesLoader = new ComponentIssuesLoader(dbTester.getDbClient(), ruleRepositoryRule, activeRulesHolderRule);
-  MergeBranchIssuesLoader mergeIssuesLoader = new MergeBranchIssuesLoader(dbTester.getDbClient(), issuesLoader, analysisMetadataHolder);
   IssueTrackingDelegator trackingDelegator;
   TrackerExecution tracker;
   ShortBranchTrackerExecution shortBranchTracker;
@@ -133,7 +132,7 @@ public class IntegrateIssuesVisitorTest {
 
     TrackerRawInputFactory rawInputFactory = new TrackerRawInputFactory(treeRootHolder, reportReader, fileSourceRepository, new CommonRuleEngineImpl(), issueFilter);
     TrackerBaseInputFactory baseInputFactory = new TrackerBaseInputFactory(issuesLoader, dbTester.getDbClient(), movedFilesRepository);
-    TrackerMergeBranchInputFactory mergeInputFactory = new TrackerMergeBranchInputFactory(mergeIssuesLoader, dbTester.getDbClient());
+    TrackerMergeBranchInputFactory mergeInputFactory = new TrackerMergeBranchInputFactory(issuesLoader, analysisMetadataHolder, dbTester.getDbClient());
     tracker = new TrackerExecution(baseInputFactory, rawInputFactory, new Tracker<>());
     shortBranchTracker = new ShortBranchTrackerExecution(baseInputFactory, rawInputFactory, mergeInputFactory, new Tracker<>());
 
index 496511543f81ca2b319d05fbfe1d27faa0858672..4f2db0a0608e59655ee72571c9c54d4ca0cc0863 100644 (file)
@@ -38,6 +38,7 @@ import static org.sonarqube.ws.client.component.ComponentsWsParameters.ACTION_SH
 import static org.sonarqube.ws.client.component.ComponentsWsParameters.ACTION_SUGGESTIONS;
 import static org.sonarqube.ws.client.component.ComponentsWsParameters.ACTION_TREE;
 import static org.sonarqube.ws.client.component.ComponentsWsParameters.CONTROLLER_COMPONENTS;
+import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_BRANCH;
 import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_COMPONENT;
 import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_COMPONENT_ID;
 import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_FILTER;
@@ -77,7 +78,8 @@ public class ComponentsService extends BaseService {
   public ShowWsResponse show(ShowWsRequest request) {
     GetRequest get = new GetRequest(path(ACTION_SHOW))
       .setParam(PARAM_COMPONENT_ID, request.getId())
-      .setParam(PARAM_COMPONENT, request.getKey());
+      .setParam(PARAM_COMPONENT, request.getKey())
+      .setParam(PARAM_BRANCH, request.getBranch());
     return call(get, ShowWsResponse.parser());
   }