Merge branch 'stable-3.0'

* stable-3.0:
  Bump bazel version to 1.0.0

Change-Id: I461f769d02ffe220de70949eb1e5807be0834d3a
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 5bf75c5..f72b338 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java
@@ -27,14 +27,12 @@
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.BranchNameKey;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.permissions.GlobalPermission;
 import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.permissions.ProjectPermission;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.server.query.change.ChangeData;
@@ -136,29 +134,30 @@
   }
 
   private void assertHasNoChildProjects(ProjectResource rsrc) throws CannotDeleteProjectException {
+    List<ProjectInfo> children;
     try {
-      List<ProjectInfo> children = listChildProjectsProvider.get().withLimit(1).apply(rsrc);
-      if (!children.isEmpty()) {
-        throw new CannotDeleteProjectException(
-            "Cannot delete project because it has at least one child: "
-                + Iterables.getOnlyElement(children).name);
-      }
-    } catch (StorageException | PermissionBackendException | RestApiException e) {
+      children = listChildProjectsProvider.get().withLimit(1).apply(rsrc).value();
+    } catch (Exception e) {
       throw new CannotDeleteProjectException(
           String.format("Unable to verify if '%s' has children projects.", rsrc.getName()));
     }
+    if (!children.isEmpty()) {
+      throw new CannotDeleteProjectException(
+          "Cannot delete project because it has at least one child: "
+              + Iterables.getOnlyElement(children).name);
+    }
   }
 
   private void assertIsNotSubmodule(Project.NameKey projectNameKey)
       throws CannotDeleteProjectException {
     try (Repository repo = repoManager.openRepository(projectNameKey);
         MergeOpRepoManager mergeOp = mergeOpProvider.get()) {
-      Set<Branch.NameKey> branches =
+      Set<BranchNameKey> branches =
           repo.getRefDatabase().getRefsByPrefix(REFS_HEADS).stream()
-              .map(ref -> Branch.nameKey(projectNameKey, ref.getName()))
+              .map(ref -> BranchNameKey.create(projectNameKey, ref.getName()))
               .collect(toSet());
       SubmoduleOp sub = subOpFactory.create(branches, mergeOp);
-      for (Branch.NameKey b : branches) {
+      for (BranchNameKey b : branches) {
         if (!sub.superProjectSubscriptionsForSubmoduleBranch(b).isEmpty()) {
           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 4ffd01c..bca13cc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
@@ -66,7 +66,7 @@
   }
 
   @Override
-  public Object apply(ProjectResource rsrc, Input input) throws IOException, RestApiException {
+  public Response<?> apply(ProjectResource rsrc, Input input) throws IOException, RestApiException {
     preConditions.assertDeletePermission(rsrc);
     preConditions.assertCanBeDeleted(rsrc, input);
 
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 b2cc319..b56eacf 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
@@ -28,6 +28,7 @@
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.git.GitRepositoryManager;
@@ -139,7 +140,7 @@
     ListChildProjects childProjects = mock(ListChildProjects.class);
     when(listChildProjectsProvider.get()).thenReturn(childProjects);
     when(childProjects.withLimit(1)).thenReturn(childProjects);
-    when(childProjects.apply(rsrc)).thenReturn(ImmutableList.of(new ProjectInfo()));
+    when(childProjects.apply(rsrc)).thenReturn(Response.ok(ImmutableList.of(new ProjectInfo())));
     expectedException.expect(ResourceConflictException.class);
     expectedException.expectMessage("Cannot delete project because it has at least one child:");
     preConditions.assertCanBeDeleted(rsrc, new DeleteProject.Input());
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 1bc8b72..b58430e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java
@@ -15,7 +15,9 @@
 package com.googlesource.gerrit.plugins.deleteproject;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.acceptance.testsuite.project.TestProjectUpdate.allow;
 import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 
@@ -26,6 +28,7 @@
 import com.google.gerrit.acceptance.TestPlugin;
 import com.google.gerrit.acceptance.UseLocalDisk;
 import com.google.gerrit.acceptance.UseSsh;
+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.extensions.client.ProjectState;
@@ -61,6 +64,7 @@
   private static final String ARCHIVE_FOLDER = "archiveFolder";
   private static final String PARENT_FOLDER = "parentFolder";
 
+  @Inject private ProjectOperations projectOperations;
   @Inject private RequestScopeOperations requestScopeOperations;
 
   private File archiveFolder;
@@ -191,7 +195,11 @@
   @UseLocalDisk
   @GerritConfig(name = "plugin.delete-project.allowDeletionOfReposWithTags", value = "false")
   public void testDeleteProjWithTags() throws Exception {
-    grant(project, "refs/tags/*", Permission.CREATE, false, REGISTERED_USERS);
+    projectOperations
+        .project(project)
+        .forUpdate()
+        .add(allow(Permission.CREATE).ref("refs/tags/*").group(REGISTERED_USERS))
+        .update();
     pushTagOldCommitNotForce();
 
     String cmd = createDeleteCommand(project.get());
@@ -280,13 +288,17 @@
     commitBuilder().ident(user.newIdent()).message("subject (" + System.nanoTime() + ")").create();
     String tagName = "v1_" + System.nanoTime();
 
-    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT, false, REGISTERED_USERS);
+    projectOperations
+        .project(project)
+        .forUpdate()
+        .add(allow(Permission.SUBMIT).ref("refs/for/refs/heads/master").group(REGISTERED_USERS))
+        .update();
     pushHead(testRepo, "refs/for/master%submit");
 
     String tagRef = RefNames.REFS_TAGS + tagName;
     PushResult r = pushHead(testRepo, tagRef, false, false);
     RemoteRefUpdate refUpdate = r.getRemoteUpdate(tagRef);
-    assertThat(refUpdate.getStatus()).named("LIGHTWEIGHT").isEqualTo(Status.OK);
+    assertWithMessage("LIGHTWEIGHT").that(refUpdate.getStatus()).isEqualTo(Status.OK);
   }
 
   private boolean isEmpty(Path dir) throws IOException {