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()); }