diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2021-11-04 16:01:17 -0500 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2021-11-09 20:03:16 +0000 |
commit | 411f4d9dcb09fefc23c03da7a108d090592e3fb9 (patch) | |
tree | 675fc61b1ea51c6b10ecbbfbf9610166a1e810de /server/sonar-db-dao | |
parent | e939bcb62791d0d494731030806d5a7b9f21ad45 (diff) | |
download | sonarqube-411f4d9dcb09fefc23c03da7a108d090592e3fb9.tar.gz sonarqube-411f4d9dcb09fefc23c03da7a108d090592e3fb9.zip |
SONAR-15498 add IT and Purge should delete selected project if it only selects a branch being deleted
Diffstat (limited to 'server/sonar-db-dao')
5 files changed, 39 insertions, 3 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java index feba85ea9e3..402bf9ef5b8 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java @@ -455,7 +455,11 @@ class PurgeCommands { public void deleteProjectInPortfolios(String rootUuid) { profiler.start("deleteProjectInPortfolios (portfolio_projects)"); + // delete selected project if it's only selecting a single branch corresponding to rootUuid + purgeMapper.deletePortfolioProjectsByBranchUuid(rootUuid); + // delete selected branches if branch is rootUuid or if it's part of a project that is rootUuid purgeMapper.deletePortfolioProjectBranchesByBranchUuid(rootUuid); + // delete selected project if project is rootUuid purgeMapper.deletePortfolioProjectsByProjectUuid(rootUuid); session.commit(); profiler.stop(); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeDao.java index 11a0ee7e67c..7e0d1efd9ac 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeDao.java @@ -165,7 +165,7 @@ public class PurgeDao implements Dao { private static final class NewCodePeriodAnalysisFilter implements Predicate<PurgeableAnalysisDto> { @Nullable - private String analysisUuid; + private final String analysisUuid; private NewCodePeriodAnalysisFilter(PurgeMapper mapper, String componentUuid) { this.analysisUuid = mapper.selectSpecificAnalysisNewCodePeriod(componentUuid); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java index 5270cec0721..348d043c7d5 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java @@ -147,6 +147,8 @@ public interface PurgeMapper { void deleteApplicationBranchProjectBranchesByProjectBranchUuid(@Param("projectBranchUuid") String projectBranchUuid); + void deletePortfolioProjectsByBranchUuid(@Param("branchUuid") String branchUuid); + void deletePortfolioProjectsByProjectUuid(@Param("projectUuid") String projectUuid); void deletePortfolioProjectBranchesByBranchUuid(@Param("branchUuid") String branchUuid); diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml index 32267058e04..604300faae0 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml @@ -349,6 +349,19 @@ WHERE project_branch_uuid=#{projectBranchUuid,jdbcType=VARCHAR} </delete> + <delete id="deletePortfolioProjectsByBranchUuid" parameterType="map"> + <!-- deletes selected projects that were only selecting the branch being deleted --> + DELETE + FROM portfolio_projects + WHERE uuid in ( + SELECT ppb.portfolio_project_uuid FROM portfolio_proj_branches ppb + <!-- branch was selected --> + WHERE ppb.branch_uuid = #{branchUuid,jdbcType=VARCHAR} + <!-- and was the only one selected in the project --> + AND (SELECT count(*) FROM portfolio_proj_branches ppb2 WHERE ppb2.portfolio_project_uuid = ppb.portfolio_project_uuid) = 1 + ) + </delete> + <delete id="deletePortfolioProjectsByProjectUuid" parameterType="map"> DELETE FROM portfolio_projects diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java index 33c0475e5e5..f0851b0858c 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java @@ -56,7 +56,6 @@ import org.sonar.db.user.UserDto; import static com.google.common.collect.Lists.newArrayList; import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; @@ -654,7 +653,7 @@ public class PurgeCommandsTest { } @Test - public void deleteProjectInPortfolios_deletes_project_and_branch_from_portfolios() { + public void deleteProjectInPortfolios_deletes_project_and_branch_from_portfolios_if_root_is_branch() { var portfolio1 = dbTester.components().insertPrivatePortfolioDto(); var portfolio2 = dbTester.components().insertPrivatePortfolioDto(); dbTester.components().insertPrivatePortfolio(); @@ -677,6 +676,24 @@ public class PurgeCommandsTest { } @Test + public void deleteProjectInPortfolios_deletes_project_and_branch_from_portfolios_if_root_is_project_only_selecting_a_single_branch() { + var portfolio1 = dbTester.components().insertPrivatePortfolioDto(); + dbTester.components().insertPrivatePortfolio(); + ProjectDto project = dbTester.components().insertPrivateProjectDto(); + + dbTester.components().addPortfolioProject(portfolio1, project); + dbTester.components().addPortfolioProjectBranch(portfolio1, project, "projectBranch"); + + PurgeCommands purgeCommands = new PurgeCommands(dbTester.getSession(), profiler, system2); + + purgeCommands.deleteProjectInPortfolios(project.getUuid()); + + assertThat(dbTester.getDbClient().portfolioDao().selectAllPortfolioProjects(dbTester.getSession())).isEmpty(); + assertThat(dbTester.countRowsOfTable("portfolio_proj_branches")).isZero(); + assertThat(dbTester.countRowsOfTable("portfolio_projects")).isZero(); + } + + @Test public void deleteProjectInPortfolios_deletes_branch_from_portfolios_if_root_is_branch() { var portfolio1 = dbTester.components().insertPrivatePortfolioDto(); ProjectDto project = dbTester.components().insertPrivateProjectDto(); |