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