Provide less verbose repo delete method
Currently, the repo delete method exposed is too verbose, and forces
the client to provide parameters for preserving and archiving the repo.
Provide a less verbose method with sensible defaults.
Annotate the method so its clear it will be used by the pull-
replication plugin, this will also prevent accidental removal of the
method impacting the pull-replication plugin.
Bug: Issue 16730
Change-Id: I50dbcb9a91bf3697b8c7d66db646020d29dae83a
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/RepositoryDelete.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/RepositoryDelete.java
index 661ac7c..91bded5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/RepositoryDelete.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/RepositoryDelete.java
@@ -18,6 +18,7 @@
import com.google.common.flogger.FluentLogger;
import com.google.common.io.MoreFiles;
+import com.google.gerrit.common.UsedAt;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
@@ -99,6 +100,19 @@
}
}
+ /**
+ * Removes a git repository from the filesystem and the jgit cache. The git repo is neither
+ * preserved (ie kept on disk) nor archived, and no downstream listeners are notified.
+ *
+ * @param project - the git repo name that is eligible for deletion
+ * @throws RepositoryNotFoundException - if the repository does not exist
+ * @throws IOException - if any of the underlying operations during repo deletion fails
+ */
+ @UsedAt(UsedAt.Project.PLUGIN_PULL_REPLICATION)
+ public void execute(Project.NameKey project) throws RepositoryNotFoundException, IOException {
+ execute(project, false, false, Optional.empty(), DynamicSet.emptySet());
+ }
+
private static void cleanCache(Repository repository) {
repository.close();
RepositoryCache.close(repository);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/RepositoryDeleteTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/RepositoryDeleteTest.java
index 00799d7..512b8b5 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/RepositoryDeleteTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/RepositoryDeleteTest.java
@@ -24,6 +24,7 @@
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
import com.google.gerrit.server.git.GitRepositoryManager;
import java.io.IOException;
import java.nio.file.FileSystems;
@@ -46,8 +47,6 @@
@RunWith(MockitoJUnitRunner.class)
public class RepositoryDeleteTest {
- private static final boolean NO_ARCHIVE = false;
- private static final boolean NO_PRESERVE_GIT_REPO = false;
private static final Optional<Path> NO_ARCHIVE_PATH = Optional.empty();
@Mock private GitRepositoryManager repoManager;
@@ -56,12 +55,14 @@
@Rule public TemporaryFolder tempFolder = new TemporaryFolder();
private DynamicSet<ProjectDeletedListener> deletedListeners;
+ private RegistrationHandle handle;
private RepositoryDelete repositoryDelete;
private Path basePath;
@Before
public void setUp() throws Exception {
deletedListeners = new DynamicSet<>();
+ handle = deletedListeners.add("testPlugin", projectDeleteListener);
basePath = tempFolder.newFolder().toPath().resolve("base");
}
@@ -72,8 +73,7 @@
Project.NameKey nameKey = Project.nameKey(repoName);
when(repoManager.openRepository(nameKey)).thenReturn(repository);
repositoryDelete = new RepositoryDelete(repoManager);
- repositoryDelete.execute(
- nameKey, NO_PRESERVE_GIT_REPO, NO_ARCHIVE, NO_ARCHIVE_PATH, deletedListeners);
+ repositoryDelete.execute(nameKey);
assertThat(repository.getDirectory().exists()).isFalse();
}
@@ -84,8 +84,7 @@
Project.NameKey nameKey = Project.nameKey(repoName);
when(repoManager.openRepository(nameKey)).thenReturn(repository);
repositoryDelete = new RepositoryDelete(repoManager);
- repositoryDelete.execute(
- nameKey, NO_PRESERVE_GIT_REPO, NO_ARCHIVE, NO_ARCHIVE_PATH, deletedListeners);
+ repositoryDelete.execute(nameKey);
assertThat(repository.getDirectory().exists()).isFalse();
}
@@ -100,8 +99,7 @@
Project.NameKey nameKey = Project.nameKey(repoToDeleteName);
when(repoManager.openRepository(nameKey)).thenReturn(repoToDelete);
repositoryDelete = new RepositoryDelete(repoManager);
- repositoryDelete.execute(
- nameKey, NO_PRESERVE_GIT_REPO, NO_ARCHIVE, NO_ARCHIVE_PATH, deletedListeners);
+ repositoryDelete.execute(nameKey);
assertThat(repoToDelete.getDirectory().exists()).isFalse();
assertThat(repoToKeep.getDirectory().exists()).isTrue();
}
@@ -109,13 +107,11 @@
@Test
public void shouldPreserveRepository() throws Exception {
String repoName = "preservedRepo";
- boolean preserveGitRepo = true;
Repository repository = createRepository(repoName);
Project.NameKey nameKey = Project.nameKey(repoName);
when(repoManager.openRepository(nameKey)).thenReturn(repository);
repositoryDelete = new RepositoryDelete(repoManager);
- repositoryDelete.execute(
- nameKey, preserveGitRepo, NO_ARCHIVE, NO_ARCHIVE_PATH, deletedListeners);
+ repositoryDelete.execute(nameKey, true, false, NO_ARCHIVE_PATH, deletedListeners);
assertThat(repository.getDirectory().exists()).isTrue();
}
@@ -134,8 +130,7 @@
Project.NameKey nameKey = Project.nameKey(repoName);
when(repoManager.openRepository(nameKey)).thenReturn(repository);
repositoryDelete = new RepositoryDelete(repoManager);
- repositoryDelete.execute(
- nameKey, NO_PRESERVE_GIT_REPO, true, Optional.of(archiveFolder), deletedListeners);
+ repositoryDelete.execute(nameKey, false, true, Optional.of(archiveFolder), deletedListeners);
assertThat(repository.getDirectory().exists()).isFalse();
String patternToVerify = archiveFolder.resolve(repoName).toString() + "*%archived%.git";
assertThat(pathExistsWithPattern(archiveFolder, patternToVerify)).isTrue();
@@ -148,9 +143,7 @@
Project.NameKey nameKey = Project.nameKey(repoName);
when(repoManager.openRepository(nameKey)).thenReturn(repository);
repositoryDelete = new RepositoryDelete(repoManager);
- deletedListeners.add("", projectDeleteListener);
- repositoryDelete.execute(
- nameKey, NO_PRESERVE_GIT_REPO, NO_ARCHIVE, NO_ARCHIVE_PATH, deletedListeners);
+ repositoryDelete.execute(nameKey, false, false, NO_ARCHIVE_PATH, deletedListeners);
Mockito.verify(projectDeleteListener).onProjectDeleted(any());
}
@@ -161,8 +154,8 @@
Project.NameKey nameKey = Project.nameKey(repoName);
when(repoManager.openRepository(nameKey)).thenReturn(repository);
repositoryDelete = new RepositoryDelete(repoManager);
- repositoryDelete.execute(
- nameKey, NO_PRESERVE_GIT_REPO, NO_ARCHIVE, NO_ARCHIVE_PATH, deletedListeners);
+ handle.remove();
+ repositoryDelete.execute(nameKey, false, false, NO_ARCHIVE_PATH, deletedListeners);
Mockito.verify(projectDeleteListener, never()).onProjectDeleted(any());
}