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;
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;
ShortBranchTrackerExecution.class,
ComponentIssuesLoader.class,
BaseIssuesLoader.class,
- MergeBranchIssuesLoader.class,
IssueTrackingDelegator.class,
// filemove
+++ /dev/null
-/*
- * 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);
- }
-}
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
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;
}
@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:");
+ }
}
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;
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<>());
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;
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());
}