Merge "Merge branch 'stable-2.15'"
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index a7c26b8..5c1a29e 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -1364,7 +1364,6 @@
     {
       "ref": "HEAD",
       "revision": "master",
-      "can_delete": false
     }
   ]
 ----
@@ -1388,7 +1387,6 @@
     {
       "ref": "HEAD",
       "revision": "master",
-      "can_delete": false
     }
   ]
 ----
@@ -2722,7 +2720,7 @@
 |Field Name  ||Description
 |`ref`       ||The ref of the branch.
 |`revision`  ||The revision to which the branch points.
-|`can_delete`|`false` if not set|
+|`can_delete`|not set if `false`|
 Whether the calling user can delete this branch.
 |`web_links` |optional|
 Links to the branch in external sites as a list of
@@ -3281,7 +3279,7 @@
 the signature.
 |`tagger`|Only set for annotated tags, if present in the tag.|The tagger as a
 link:rest-api-changes.html#git-person-info[GitPersonInfo] entity.
-|`can_delete`|`false` if not set|
+|`can_delete`|not set if `false`|
 Whether the calling user can delete this tag.
 |`web_links` |optional|
 Links to the tag in external sites as a list of
diff --git a/java/com/google/gerrit/extensions/api/projects/TagInfo.java b/java/com/google/gerrit/extensions/api/projects/TagInfo.java
index c7b1b94..99fc6ec 100644
--- a/java/com/google/gerrit/extensions/api/projects/TagInfo.java
+++ b/java/com/google/gerrit/extensions/api/projects/TagInfo.java
@@ -24,7 +24,7 @@
   public GitPerson tagger;
   public List<WebLinkInfo> webLinks;
 
-  public TagInfo(String ref, String revision, boolean canDelete, List<WebLinkInfo> webLinks) {
+  public TagInfo(String ref, String revision, Boolean canDelete, List<WebLinkInfo> webLinks) {
     this.ref = ref;
     this.revision = revision;
     this.canDelete = canDelete;
@@ -37,7 +37,7 @@
       String object,
       String message,
       GitPerson tagger,
-      boolean canDelete,
+      Boolean canDelete,
       List<WebLinkInfo> webLinks) {
     this(ref, revision, canDelete, webLinks);
     this.object = object;
diff --git a/java/com/google/gerrit/server/project/ListTags.java b/java/com/google/gerrit/server/project/ListTags.java
index a58f316..d57234a 100644
--- a/java/com/google/gerrit/server/project/ListTags.java
+++ b/java/com/google/gerrit/server/project/ListTags.java
@@ -190,7 +190,7 @@
       WebLinks links)
       throws MissingObjectException, IOException {
     RevObject object = rw.parseAny(ref.getObjectId());
-    boolean canDelete = perm.testOrFalse(RefPermission.DELETE);
+    Boolean canDelete = perm.testOrFalse(RefPermission.DELETE) ? true : null;
     List<WebLinkInfo> webLinks = links.getTagLinks(projectName.get(), ref.getName());
     if (object instanceof RevTag) {
       // Annotated or signed tag
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java b/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java
index d5bb2fd..c8f2fef 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java
@@ -139,6 +139,7 @@
   }
 
   private void assertDeleteSucceeds() throws Exception {
+    assertThat(branch().get().canDelete).isTrue();
     String branchRev = branch().get().revision;
     branch().delete();
     eventRecorder.assertRefUpdatedEvents(
@@ -148,6 +149,7 @@
   }
 
   private void assertDeleteForbidden() throws Exception {
+    assertThat(branch().get().canDelete).isNull();
     exception.expect(AuthException.class);
     exception.expectMessage("delete not permitted");
     branch().delete();
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java b/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java
index dd65f7c..0cbbe44 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java
@@ -14,6 +14,7 @@
 
 package com.google.gerrit.acceptance.rest.project;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
 import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
 import static org.eclipse.jgit.lib.Constants.R_TAGS;
@@ -22,6 +23,7 @@
 import com.google.gerrit.acceptance.RestResponse;
 import com.google.gerrit.common.data.Permission;
 import com.google.gerrit.extensions.api.projects.TagApi;
+import com.google.gerrit.extensions.api.projects.TagInfo;
 import com.google.gerrit.extensions.api.projects.TagInput;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
@@ -111,7 +113,9 @@
   }
 
   private void assertDeleteSucceeds() throws Exception {
-    String tagRev = tag().get().revision;
+    TagInfo tagInfo = tag().get();
+    assertThat(tagInfo.canDelete).isTrue();
+    String tagRev = tagInfo.revision;
     tag().delete();
     eventRecorder.assertRefUpdatedEvents(project.get(), TAG, null, tagRev, tagRev, null);
     exception.expect(ResourceNotFoundException.class);
@@ -119,6 +123,7 @@
   }
 
   private void assertDeleteForbidden() throws Exception {
+    assertThat(tag().get().canDelete).isNull();
     exception.expect(AuthException.class);
     exception.expectMessage("delete not permitted");
     tag().delete();
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java
index 6851650..548043d 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java
@@ -186,7 +186,7 @@
 
     setApiUser(user);
     result = tag(input.ref).get();
-    assertThat(result.canDelete).isFalse();
+    assertThat(result.canDelete).isNull();
 
     eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision);
   }