diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2017-08-14 17:56:37 +0200 |
---|---|---|
committer | Janos Gyerik <janos.gyerik@sonarsource.com> | 2017-09-12 10:59:56 +0200 |
commit | a33cf1af5ffb9b98444cea717bab330c22d86ca0 (patch) | |
tree | a6618a98c5024bc0b754d222ac9db6c0cd4d23ce /server | |
parent | f3abcdf6023a6ec3bd05db750fedc608bb2b7ded (diff) | |
download | sonarqube-a33cf1af5ffb9b98444cea717bab330c22d86ca0.tar.gz sonarqube-a33cf1af5ffb9b98444cea717bab330c22d86ca0.zip |
Fix issue tracking for short living branches
Diffstat (limited to 'server')
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<>()); |