summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2017-08-14 17:56:37 +0200
committerJanos Gyerik <janos.gyerik@sonarsource.com>2017-09-12 10:59:56 +0200
commita33cf1af5ffb9b98444cea717bab330c22d86ca0 (patch)
treea6618a98c5024bc0b754d222ac9db6c0cd4d23ce /server
parentf3abcdf6023a6ec3bd05db750fedc608bb2b7ded (diff)
downloadsonarqube-a33cf1af5ffb9b98444cea717bab330c22d86ca0.tar.gz
sonarqube-a33cf1af5ffb9b98444cea717bab330c22d86ca0.zip
Fix issue tracking for short living branches
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/MergeBranchIssuesLoader.java71
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ShortBranchTrackerExecution.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerMergeBranchInputFactory.java56
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java3
5 files changed, 52 insertions, 86 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java
index f0c8946a452..414920d19a3 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java
@@ -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
index b32e08c43c7..00000000000
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/MergeBranchIssuesLoader.java
+++ /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);
- }
-}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ShortBranchTrackerExecution.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ShortBranchTrackerExecution.java
index 1666e3ea1ab..f5888d5c2cb 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ShortBranchTrackerExecution.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ShortBranchTrackerExecution.java
@@ -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
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerMergeBranchInputFactory.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerMergeBranchInputFactory.java
index 44f65e4a798..21630f57dc8 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerMergeBranchInputFactory.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerMergeBranchInputFactory.java
@@ -20,47 +20,78 @@
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:");
+ }
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java
index 33f85ac5d33..6c663d28250 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java
@@ -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<>());