From 23669dac5596e15b9f79ee3b089e8b85bcfb1516 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Thu, 23 Feb 2017 13:43:57 +0900 Subject: [PATCH] ListTags: Set the can_delete field Change-Id: I3cfd21d7726bdaaab741c646de8c93d5805b0d9f --- Documentation/rest-api-projects.txt | 2 ++ .../gerrit/acceptance/AbstractDaemonTest.java | 1 + .../gerrit/acceptance/rest/project/TagsIT.java | 6 ++++++ .../extensions/api/projects/TagInfo.java | 13 ++++++++++--- .../gerrit/server/project/CreateTag.java | 2 +- .../google/gerrit/server/project/ListTags.java | 18 ++++++++++-------- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt index f69b955a0c..e2be6e6aeb 100644 --- a/Documentation/rest-api-projects.txt +++ b/Documentation/rest-api-projects.txt @@ -2862,6 +2862,8 @@ tag points. 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| +Whether the calling user can delete this tag. |========================= [[tag-input]] diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java index 05198626f8..1e0065ff77 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java @@ -999,6 +999,7 @@ public abstract class AbstractDaemonTest { protected void grantTagPermissions() throws Exception { grant(Permission.CREATE, project, R_TAGS + "*"); + grant(Permission.DELETE, project, R_TAGS + ""); grant(Permission.CREATE_TAG, project, R_TAGS + "*"); grant(Permission.CREATE_SIGNED_TAG, project, R_TAGS + "*"); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java index 03459da0dc..f1916819de 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java @@ -170,11 +170,17 @@ public class TagsIT extends AbstractDaemonTest { TagInfo result = tag(input.ref).create(input).get(); assertThat(result.ref).isEqualTo(R_TAGS + input.ref); assertThat(result.revision).isEqualTo(input.revision); + assertThat(result.canDelete).isTrue(); input.ref = "refs/tags/v2.0"; result = tag(input.ref).create(input).get(); assertThat(result.ref).isEqualTo(input.ref); assertThat(result.revision).isEqualTo(input.revision); + assertThat(result.canDelete).isTrue(); + + setApiUser(user); + result = tag(input.ref).get(); + assertThat(result.canDelete).isFalse(); eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java index 2b5778129d..ccfea46bc3 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java @@ -21,13 +21,20 @@ public class TagInfo extends RefInfo { public String message; public GitPerson tagger; - public TagInfo(String ref, String revision) { + public TagInfo(String ref, String revision, boolean canDelete) { this.ref = ref; this.revision = revision; + this.canDelete = canDelete; } - public TagInfo(String ref, String revision, String object, String message, GitPerson tagger) { - this(ref, revision); + public TagInfo( + String ref, + String revision, + String object, + String message, + GitPerson tagger, + boolean canDelete) { + this(ref, revision, canDelete); this.object = object; this.message = message; this.tagger = tagger; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateTag.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateTag.java index ed38c476ee..f674d174d5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateTag.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateTag.java @@ -134,7 +134,7 @@ public class CreateTag implements RestModifyView { result.getObjectId(), identifiedUser.get().getAccount()); try (RevWalk w = new RevWalk(repo)) { - return ListTags.createTagInfo(result, w); + return ListTags.createTagInfo(result, w, refControl); } } } catch (InvalidRevisionException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java index 9312e495b3..7f1ee60f75 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java @@ -121,10 +121,11 @@ public class ListTags implements RestReadView { try (Repository repo = getRepository(resource.getNameKey()); RevWalk rw = new RevWalk(repo)) { + ProjectControl control = resource.getControl(); Map all = - visibleTags(resource.getControl(), repo, repo.getRefDatabase().getRefs(Constants.R_TAGS)); + visibleTags(control, repo, repo.getRefDatabase().getRefs(Constants.R_TAGS)); for (Ref ref : all.values()) { - tags.add(createTagInfo(ref, rw)); + tags.add(createTagInfo(ref, rw, control.controlForRef(ref.getName()))); } } @@ -154,16 +155,16 @@ public class ListTags implements RestReadView { tagName = Constants.R_TAGS + tagName; } Ref ref = repo.getRefDatabase().exactRef(tagName); + ProjectControl control = resource.getControl(); if (ref != null - && !visibleTags(resource.getControl(), repo, ImmutableMap.of(ref.getName(), ref)) - .isEmpty()) { - return createTagInfo(ref, rw); + && !visibleTags(control, repo, ImmutableMap.of(ref.getName(), ref)).isEmpty()) { + return createTagInfo(ref, rw, control.controlForRef(ref.getName())); } } throw new ResourceNotFoundException(id); } - public static TagInfo createTagInfo(Ref ref, RevWalk rw) + public static TagInfo createTagInfo(Ref ref, RevWalk rw, RefControl control) throws MissingObjectException, IOException { RevObject object = rw.parseAny(ref.getObjectId()); if (object instanceof RevTag) { @@ -175,10 +176,11 @@ public class ListTags implements RestReadView { tag.getName(), tag.getObject().getName(), tag.getFullMessage().trim(), - tagger != null ? CommonConverters.toGitPerson(tag.getTaggerIdent()) : null); + tagger != null ? CommonConverters.toGitPerson(tag.getTaggerIdent()) : null, + control.canDelete()); } // Lightweight tag - return new TagInfo(ref.getName(), ref.getObjectId().getName()); + return new TagInfo(ref.getName(), ref.getObjectId().getName(), control.canDelete()); } private Repository getRepository(Project.NameKey project)