Merge branch 'stable-3.2' into stable-3.3 * stable-3.2: Adapt to new ProjectCache interface Change-Id: I80ff7572e5dd90551f1386a16fc2d7734962225b Depends-on: https://gerrit-review.googlesource.com/c/gerrit/+/324315
diff --git a/BUILD b/BUILD index c982cdb..d560d98 100644 --- a/BUILD +++ b/BUILD
@@ -1,5 +1,5 @@ load("@rules_java//java:defs.bzl", "java_library") -load("@npm_bazel_rollup//:index.bzl", "rollup_bundle") +load("@npm//@bazel/rollup:index.bzl", "rollup_bundle") load("//tools/bzl:junit.bzl", "junit_tests") load("//tools/js:eslint.bzl", "eslint") load( @@ -47,9 +47,9 @@ name = "delete-project-bundle", srcs = glob(["gr-delete-repo/*.js"]), entry_point = "gr-delete-repo/plugin.js", + format = "iife", rollup_bin = "//tools/node_tools:rollup-bin", sourcemap = "hidden", - format = "iife", deps = [ "@tools_npm//rollup-plugin-node-resolve", ],
diff --git a/gr-delete-repo/gr-delete-repo_html.js b/gr-delete-repo/gr-delete-repo_html.js index 31962d8..e3a985d 100644 --- a/gr-delete-repo/gr-delete-repo_html.js +++ b/gr-delete-repo/gr-delete-repo_html.js
@@ -16,13 +16,24 @@ */ export const htmlTemplate = Polymer.html` - <style include="gr-form-styles"></style> - <gr-repo-command - title="[[action.label]]" - tooltip="[[action.title]]" - disabled="[[!action.enabled]]" - on-command-tap="_handleCommandTap"> - </gr-repo-command> + <style include="shared-styles"></style> + <style include="gr-form-styles"> + :host { + display: block; + margin-bottom: var(--spacing-xxl); + } + </style> + <h3 class="heading-3"> + [[action.label]] + </h3> + <gr-button + title="[[action.title]]" + loading="[[_deleting]]" + disabled="[[!action.enabled]]" + on-click="_handleCommandTap" + > + [[action.label]] + </gr-button> <gr-overlay id="deleteRepoOverlay" with-backdrop> <gr-dialog id="deleteRepoDialog"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java index 417c968..e35711a 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java +++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java
@@ -40,7 +40,7 @@ import com.google.gerrit.server.restapi.project.ListChildProjects; import com.google.gerrit.server.submit.MergeOpRepoManager; import com.google.gerrit.server.submit.SubmoduleConflictException; -import com.google.gerrit.server.submit.SubmoduleOp; +import com.google.gerrit.server.submit.SubscriptionGraph; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; @@ -59,7 +59,7 @@ private final String pluginName; private final Provider<InternalChangeQuery> queryProvider; private final GitRepositoryManager repoManager; - private final SubmoduleOp.Factory subOpFactory; + private final SubscriptionGraph.Factory subscriptionGraphFactory; private final Provider<CurrentUser> userProvider; private final ProtectedProjects protectedProjects; private final PermissionBackend permissionBackend; @@ -72,7 +72,7 @@ @PluginName String pluginName, Provider<InternalChangeQuery> queryProvider, GitRepositoryManager repoManager, - SubmoduleOp.Factory subOpFactory, + SubscriptionGraph.Factory subscriptionGraphFactory, Provider<CurrentUser> userProvider, ProtectedProjects protectedProjects, PermissionBackend permissionBackend) { @@ -82,7 +82,7 @@ this.pluginName = pluginName; this.queryProvider = queryProvider; this.repoManager = repoManager; - this.subOpFactory = subOpFactory; + this.subscriptionGraphFactory = subscriptionGraphFactory; this.userProvider = userProvider; this.protectedProjects = protectedProjects; this.permissionBackend = permissionBackend; @@ -156,9 +156,9 @@ repo.getRefDatabase().getRefsByPrefix(REFS_HEADS).stream() .map(ref -> BranchNameKey.create(projectNameKey, ref.getName())) .collect(toSet()); - SubmoduleOp sub = subOpFactory.create(branches, mergeOp); + SubscriptionGraph graph = subscriptionGraphFactory.compute(branches, mergeOp); for (BranchNameKey b : branches) { - if (!sub.superProjectSubscriptionsForSubmoduleBranch(b).isEmpty()) { + if (graph.hasSuperproject(b)) { throw new CannotDeleteProjectException("Project is subscribed by other projects."); } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java index 4b36826..40463b2 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java +++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
@@ -86,7 +86,7 @@ if (!preserve || !cfg.projectOnPreserveHidden()) { dbHandler.delete(project); try { - fsHandler.delete(project, preserve); + fsHandler.delete(project.getNameKey(), preserve); } catch (RepositoryNotFoundException e) { throw new ResourceNotFoundException(project.getName(), e); }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java index 9c7e559..4716c5b 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java +++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java
@@ -14,7 +14,7 @@ package com.googlesource.gerrit.plugins.deleteproject; -import com.google.gerrit.common.data.AccessSection; +import com.google.gerrit.entities.AccessSection; import com.google.gerrit.entities.Project; import com.google.gerrit.extensions.client.ProjectState; import com.google.gerrit.extensions.restapi.IdString; @@ -58,12 +58,9 @@ } public void apply(ProjectResource rsrc) throws IOException, RestApiException { - try { - MetaDataUpdate md = metaDataUpdateFactory.create(rsrc.getNameKey()); - + try (MetaDataUpdate md = metaDataUpdateFactory.create(rsrc.getNameKey())) { ProjectConfig projectConfig = projectConfigFactory.read(md); - Project p = projectConfig.getProject(); - p.setState(ProjectState.HIDDEN); + projectConfig.updateProject(p -> p.setState(ProjectState.HIDDEN)); for (AccessSection as : projectConfig.getAccessSections()) { projectConfig.remove(as); @@ -71,7 +68,7 @@ String parentForDeletedProjects = cfg.getDeletedProjectsParent(); createProjectIfMissing(parentForDeletedProjects); - p.setParentName(parentForDeletedProjects); + projectConfig.updateProject(p -> p.setParent(parentForDeletedProjects)); md.setMessage("Hide project\n"); projectConfig.commit(md);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java index a5436c1..053b2fc 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java +++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java
@@ -58,14 +58,14 @@ this.config = config; } - public void delete(Project project, boolean preserveGitRepository) + public void delete(Project.NameKey project, boolean preserveGitRepository) throws IOException, RepositoryNotFoundException { // Remove from the jgit cache - Repository repository = repoManager.openRepository(project.getNameKey()); + Repository repository = repoManager.openRepository(project); cleanCache(repository); if (!preserveGitRepository) { Path repoPath = repository.getDirectory().toPath(); - String projectName = project.getNameKey().get(); + String projectName = project.get(); if (config.shouldArchiveDeletedRepos()) { archiveGitRepository(projectName, repoPath); } else {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ConfigurationTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ConfigurationTest.java index 70d1715..9b59f63 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ConfigurationTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ConfigurationTest.java
@@ -36,7 +36,7 @@ private static final long DEFAULT_ARCHIVE_DURATION_MS = TimeUnit.DAYS.toMillis(180); private static final String CUSTOM_DURATION = "100"; private static final String CUSTOM_PARENT = "customParent"; - private static final String INVALID_CUSTOM_FOLDER = "\0"; + private static final String INVALID_CUSTOM_FOLDER = "//\\\\\\///////"; private static final String INVALID_ARCHIVE_DURATION = "180weeks180years"; private static final String PLUGIN_NAME = "delete-project"; @@ -56,7 +56,7 @@ @Test public void defaultValuesAreLoaded() { when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)) - .thenReturn(new PluginConfig(PLUGIN_NAME, new Config())); + .thenReturn(PluginConfig.create(PLUGIN_NAME, new Config(), null)); deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME, pluginDataDir); assertThat(deleteConfig.getDeletedProjectsParent()).isEqualTo("Deleted-Projects"); @@ -69,7 +69,7 @@ @Test public void customValuesAreLoaded() { - PluginConfig pluginConfig = new PluginConfig(PLUGIN_NAME, new Config()); + PluginConfig.Update pluginConfig = PluginConfig.Update.forTest(PLUGIN_NAME, new Config()); pluginConfig.setString("parentForDeletedProjects", CUSTOM_PARENT); pluginConfig.setBoolean("allowDeletionOfReposWithTags", false); pluginConfig.setBoolean("hideProjectOnPreserve", true); @@ -77,7 +77,8 @@ pluginConfig.setString("deleteArchivedReposAfter", CUSTOM_DURATION); pluginConfig.setString("archiveFolder", customArchiveFolder.toString()); - when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)).thenReturn(pluginConfig); + when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)) + .thenReturn(pluginConfig.asPluginConfig()); deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME, pluginDataDir); assertThat(deleteConfig.getDeletedProjectsParent()).isEqualTo(CUSTOM_PARENT); @@ -91,10 +92,11 @@ @Test public void archiveDurationWithUnitIsLoaded() { - PluginConfig pluginConfig = new PluginConfig(PLUGIN_NAME, new Config()); + PluginConfig.Update pluginConfig = PluginConfig.Update.forTest(PLUGIN_NAME, new Config()); pluginConfig.setString("deleteArchivedReposAfter", CUSTOM_DURATION + "years"); - when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)).thenReturn(pluginConfig); + when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)) + .thenReturn(pluginConfig.asPluginConfig()); deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME, pluginDataDir); assertThat(deleteConfig.getArchiveDuration()) @@ -103,10 +105,11 @@ @Test public void invalidArchiveDuration() { - PluginConfig pluginConfig = new PluginConfig(PLUGIN_NAME, new Config()); + PluginConfig.Update pluginConfig = PluginConfig.Update.forTest(PLUGIN_NAME, new Config()); pluginConfig.setString("deleteArchivedReposAfter", INVALID_ARCHIVE_DURATION); - when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)).thenReturn(pluginConfig); + when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)) + .thenReturn(pluginConfig.asPluginConfig()); deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME, pluginDataDir); assertThat(deleteConfig.getArchiveDuration()).isEqualTo(DEFAULT_ARCHIVE_DURATION_MS); @@ -114,10 +117,11 @@ @Test public void invalidTargetArchiveFolder() { - PluginConfig pluginConfig = new PluginConfig(PLUGIN_NAME, new Config()); + PluginConfig.Update pluginConfig = PluginConfig.Update.forTest(PLUGIN_NAME, new Config()); pluginConfig.setString("archiveFolder", INVALID_CUSTOM_FOLDER); - when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)).thenReturn(pluginConfig); + when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)) + .thenReturn(pluginConfig.asPluginConfig()); deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME, pluginDataDir); assertThat(deleteConfig.getArchiveFolder().toString()).isEqualTo(pluginDataDir.toString());
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java index 235dc3c..e126c19 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
@@ -14,15 +14,6 @@ package com.googlesource.gerrit.plugins.deleteproject; -import static com.google.common.truth.Truth.assertThat; -import static com.google.gerrit.testing.GerritJUnit.assertThrows; -import static com.googlesource.gerrit.plugins.deleteproject.DeleteOwnProjectCapability.DELETE_OWN_PROJECT; -import static com.googlesource.gerrit.plugins.deleteproject.DeleteProjectCapability.DELETE_PROJECT; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import com.google.common.collect.ImmutableList; import com.google.gerrit.entities.Project; import com.google.gerrit.exceptions.StorageException; @@ -42,7 +33,7 @@ import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gerrit.server.restapi.project.ListChildProjects; import com.google.gerrit.server.submit.MergeOpRepoManager; -import com.google.gerrit.server.submit.SubmoduleOp; +import com.google.gerrit.server.submit.SubscriptionGraph; import com.google.inject.Provider; import org.junit.Before; import org.junit.Test; @@ -50,6 +41,15 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import static com.google.common.truth.Truth.assertThat; +import static com.google.gerrit.testing.GerritJUnit.assertThrows; +import static com.googlesource.gerrit.plugins.deleteproject.DeleteOwnProjectCapability.DELETE_OWN_PROJECT; +import static com.googlesource.gerrit.plugins.deleteproject.DeleteProjectCapability.DELETE_PROJECT; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + @RunWith(MockitoJUnitRunner.class) public class DeletePreconditionsTest { private static final String PLUGIN_NAME = "delete-project"; @@ -60,7 +60,7 @@ @Mock private Provider<MergeOpRepoManager> mergeOpProvider; @Mock private Provider<InternalChangeQuery> queryProvider; @Mock private GitRepositoryManager repoManager; - @Mock private SubmoduleOp.Factory subOpFactory; + @Mock private SubscriptionGraph.Factory subscriptionGraphFactory; @Mock private CurrentUser currentUser; @Mock private Provider<CurrentUser> userProvider; @Mock private ProjectState state; @@ -84,7 +84,7 @@ PLUGIN_NAME, queryProvider, repoManager, - subOpFactory, + subscriptionGraphFactory, userProvider, protectedProjects, permissionBackend);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java index 4960816..e878096 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java
@@ -31,12 +31,12 @@ import com.google.gerrit.acceptance.config.GerritConfig; import com.google.gerrit.acceptance.testsuite.project.ProjectOperations; import com.google.gerrit.acceptance.testsuite.request.RequestScopeOperations; -import com.google.gerrit.common.data.Permission; +import com.google.gerrit.entities.CachedProjectConfig; +import com.google.gerrit.entities.Permission; import com.google.gerrit.entities.Project; import com.google.gerrit.entities.RefNames; import com.google.gerrit.extensions.client.ProjectState; import com.google.gerrit.extensions.restapi.RestApiException; -import com.google.gerrit.server.project.ProjectConfig; import com.google.inject.Inject; import com.googlesource.gerrit.plugins.deleteproject.DeleteProject.Input; import java.io.File; @@ -174,7 +174,8 @@ String cmd = createDeleteCommand("--preserve-git-repository", project.get()); adminSshSession.exec(cmd); - ProjectConfig cfg = projectCache.get(project).orElseThrow(illegalState(project)).getConfig(); + CachedProjectConfig cfg = + projectCache.get(project).orElseThrow(illegalState(project)).getConfig(); ProjectState state = cfg.getProject().getState(); assertThat(state).isEqualTo(ProjectState.HIDDEN);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ProtectedProjectsTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ProtectedProjectsTest.java index c4c370a..75ea96b 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ProtectedProjectsTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ProtectedProjectsTest.java
@@ -42,7 +42,7 @@ @Mock private AllUsersNameProvider allUsersMock; @Mock private PluginConfigFactory pluginConfigFactoryMock; - private PluginConfig pluginConfig; + private PluginConfig.Update pluginConfig; private Configuration deleteConfig; private ProtectedProjects protectedProjects; private File pluginData = new File("data"); @@ -51,8 +51,9 @@ public void setup() throws Exception { when(allProjectsMock.get()).thenReturn(new AllProjectsName("All-Projects")); when(allUsersMock.get()).thenReturn(new AllUsersName("All-Users")); - pluginConfig = new PluginConfig(PLUGIN_NAME, new Config()); - when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)).thenReturn(pluginConfig); + pluginConfig = PluginConfig.Update.forTest(PLUGIN_NAME, new Config()); + when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)) + .thenReturn(pluginConfig.asPluginConfig()); deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME, pluginData); protectedProjects = new ProtectedProjects(allProjectsMock, allUsersMock, deleteConfig); } @@ -76,7 +77,8 @@ public void customProjectIsProtected() throws Exception { List<String> projects = ImmutableList.of("Custom-Parent", "^protected-.*"); pluginConfig.setStringList("protectedProject", projects); - when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)).thenReturn(pluginConfig); + when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)) + .thenReturn(pluginConfig.asPluginConfig()); deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME, pluginData); assertThat(deleteConfig.protectedProjects()).hasSize(projects.size()); protectedProjects = new ProtectedProjects(allProjectsMock, allUsersMock, deleteConfig);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandlerTest.java index ce291e4..9cffd14 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandlerTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandlerTest.java
@@ -63,11 +63,10 @@ String repoName = "testRepo"; Repository repository = createRepository(repoName); Project.NameKey nameKey = Project.nameKey(repoName); - Project project = new Project(nameKey); when(repoManager.openRepository(nameKey)).thenReturn(repository); when(config.shouldArchiveDeletedRepos()).thenReturn(false); fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener, config); - fsDeleteHandler.delete(project, false); + fsDeleteHandler.delete(nameKey, false); assertThat(repository.getDirectory().exists()).isFalse(); } @@ -76,10 +75,9 @@ String repoName = "a/b/c"; Repository repository = createRepository(repoName); Project.NameKey nameKey = Project.nameKey(repoName); - Project project = new Project(nameKey); when(repoManager.openRepository(nameKey)).thenReturn(repository); fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener, config); - fsDeleteHandler.delete(project, false); + fsDeleteHandler.delete(nameKey, false); assertThat(repository.getDirectory().exists()).isFalse(); } @@ -92,10 +90,9 @@ Repository repoToKeep = createRepository(repoToKeepName); Project.NameKey nameKey = Project.nameKey(repoToDeleteName); - Project project = new Project(nameKey); when(repoManager.openRepository(nameKey)).thenReturn(repoToDelete); fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener, config); - fsDeleteHandler.delete(project, false); + fsDeleteHandler.delete(nameKey, false); assertThat(repoToDelete.getDirectory().exists()).isFalse(); assertThat(repoToKeep.getDirectory().exists()).isTrue(); } @@ -105,10 +102,9 @@ String repoName = "preservedRepo"; Repository repository = createRepository(repoName); Project.NameKey nameKey = Project.nameKey(repoName); - Project project = new Project(nameKey); when(repoManager.openRepository(nameKey)).thenReturn(repository); fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener, config); - fsDeleteHandler.delete(project, true); + fsDeleteHandler.delete(nameKey, true); assertThat(repository.getDirectory().exists()).isTrue(); } @@ -127,10 +123,9 @@ when(config.shouldArchiveDeletedRepos()).thenReturn(true); when(config.getArchiveFolder()).thenReturn(archiveFolder); Project.NameKey nameKey = Project.nameKey(repoName); - Project project = new Project(nameKey); when(repoManager.openRepository(nameKey)).thenReturn(repository); fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener, config); - fsDeleteHandler.delete(project, false); + fsDeleteHandler.delete(nameKey, false); assertThat(repository.getDirectory().exists()).isFalse(); String patternToVerify = archiveFolder.resolve(repoName).toString() + "*%archived%.git"; assertThat(pathExistsWithPattern(archiveFolder, patternToVerify)).isTrue();