From e5bd169a6e017334ae77832adb7eaea766138e28 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 8 Jun 2018 10:57:23 +0200 Subject: [PATCH] SONAR-10812 Application with branches --- .../step/BuildComponentTreeStepTest.java | 23 ++- .../ComputeEngineContainerImplTest.java | 4 +- .../org/sonar/db/component/ComponentDao.java | 10 + .../sonar/db/component/ComponentMapper.java | 2 + .../sonar/db/component/ComponentMapper.xml | 12 ++ .../sonar/db/component/ComponentDaoTest.java | 24 +++ .../sonar/db/component/ComponentTesting.java | 20 +- .../MigrationConfigurationModule.java | 2 + .../db/migration/version/v73/DbVersion73.java | 33 ++++ .../v73/PopulateMainApplicationBranches.java | 63 ++++++ .../migration/version/v73/package-info.java | 24 +++ .../MigrationConfigurationModuleTest.java | 2 +- .../version/v73/DbVersion73Test.java | 35 ++++ .../PopulateMainApplicationBranchesTest.java | 126 ++++++++++++ .../schema.sql | 61 ++++++ .../sonar/server/branch/ws/ListAction.java | 12 +- .../server/component/ComponentUpdater.java | 11 +- .../sonar/server/issue/index/IssueIndex.java | 179 ++++++++++-------- .../server/branch/ws/DeleteActionTest.java | 9 +- .../server/branch/ws/ListActionTest.java | 35 +++- .../component/ComponentUpdaterTest.java | 35 ++-- .../server/issue/index/IssueIndexTest.java | 167 ++++++++++------ .../issue/ws/SearchActionComponentsTest.java | 46 ++++- .../js/app/components/ComponentContainer.tsx | 9 + .../src/main/js/app/utils/exposeLibraries.ts | 9 + 25 files changed, 751 insertions(+), 202 deletions(-) create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v73/DbVersion73.java create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v73/PopulateMainApplicationBranches.java create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v73/package-info.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v73/DbVersion73Test.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v73/PopulateMainApplicationBranchesTest.java create mode 100644 server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v73/PopulateMainApplicationBranchesTest/schema.sql diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java index 49cdaf24a2b..34dc809356e 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java @@ -202,7 +202,7 @@ public class BuildComponentTreeStepTest { } @Test - public void generate_keys_when_using_branch() { + public void generate_keys_when_using_new_branch() { Branch branch = mock(Branch.class); when(branch.getName()).thenReturn("origin/feature"); when(branch.isMain()).thenReturn(false); @@ -226,6 +226,27 @@ public class BuildComponentTreeStepTest { verifyComponent(FILE_1_REF, "generated", REPORT_MODULE_KEY + ":" + REPORT_FILE_KEY_1, null); } + @Test + public void generate_keys_when_using_existing_branch() { + ComponentDto projectDto = dbTester.components().insertMainBranch(); + ComponentDto branchDto = dbTester.components().insertProjectBranch(projectDto); + Branch branch = mock(Branch.class); + when(branch.getName()).thenReturn(branchDto.getBranch()); + when(branch.isMain()).thenReturn(false); + when(branch.isLegacyFeature()).thenReturn(false); + when(branch.generateKey(any(), any())).thenReturn(branchDto.getDbKey()); + analysisMetadataHolder.setRootComponentRef(ROOT_REF) + .setAnalysisDate(ANALYSIS_DATE) + .setProject(Project.from(projectDto)) + .setBranch(branch); + BuildComponentTreeStep underTest = new BuildComponentTreeStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder); + reportReader.putComponent(componentWithKey(ROOT_REF, PROJECT, branchDto.getKey())); + + underTest.execute(); + + verifyComponent(ROOT_REF, branchDto.getDbKey(), branchDto.getKey(), branchDto.uuid()); + } + @Test public void generate_keys_when_using_main_branch() { Branch branch = new DefaultBranchImpl(); diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java index 0899d7f4c2b..f0149992fe5 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java @@ -113,8 +113,8 @@ public class ComputeEngineContainerImplTest { ); assertThat(picoContainer.getParent().getParent().getComponentAdapters()).hasSize( CONTAINER_ITSELF - + 14 // MigrationConfigurationModule - + 19 // level 2 + + 17 // MigrationConfigurationModule + + 17 // level 2 ); assertThat(picoContainer.getParent().getParent().getParent().getComponentAdapters()).hasSize( COMPONENTS_IN_LEVEL_1_AT_CONSTRUCTION diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java index e572a95ba15..37009c74415 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java @@ -27,6 +27,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Set; import java.util.stream.Stream; import javax.annotation.CheckForNull; @@ -195,6 +196,15 @@ public class ComponentDao implements Dao { return executeLargeInputs(allKeys, subKeys -> mapper(session).selectByKeysAndBranch(subKeys, branch)); } + /** + * Return list of components that will will mix main and branch components. + * Please note that a project can only appear once in the list, it's not possible to ask for many branches on same project with this method. + */ + public List selectByKeysAndBranches(DbSession session, Map branchesByKey) { + List dbKeys = branchesByKey.entrySet().stream().map(entry -> generateBranchKey(entry.getKey(), entry.getValue())).collect(toList()); + return executeLargeInputs(dbKeys, subKeys -> mapper(session).selectByDbKeys(subKeys)); + } + public List selectByKeysAndPullRequest(DbSession session, Collection keys, String pullRequestId) { List dbKeys = keys.stream().map(k -> generatePullRequestKey(k, pullRequestId)).collect(toList()); List allKeys = Stream.of(keys, dbKeys).flatMap(Collection::stream).collect(toList()); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java index eb1023f17a0..10e3b48241c 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java @@ -49,6 +49,8 @@ public interface ComponentMapper { List selectByKeys(@Param("keys") Collection keys); + List selectByDbKeys(@Param("dbKeys") Collection dbKeys); + List selectByKeysAndBranch(@Param("keys") Collection keys, @Param("branch") String branch); List selectByIds(@Param("ids") Collection ids); diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml index e59d48eefa3..d6fd5aa8979 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml @@ -92,6 +92,18 @@ + +