ListTags: Set the can_delete field

Change-Id: I3cfd21d7726bdaaab741c646de8c93d5805b0d9f
This commit is contained in:
David Pursehouse 2017-02-23 13:43:57 +09:00
parent 061573f135
commit 23669dac55
6 changed files with 30 additions and 12 deletions

View File

@ -2862,6 +2862,8 @@ tag points.
the signature. the signature.
|`tagger`|Only set for annotated tags, if present in the tag.|The tagger as a |`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. 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]] [[tag-input]]

View File

@ -999,6 +999,7 @@ public abstract class AbstractDaemonTest {
protected void grantTagPermissions() throws Exception { protected void grantTagPermissions() throws Exception {
grant(Permission.CREATE, project, R_TAGS + "*"); grant(Permission.CREATE, project, R_TAGS + "*");
grant(Permission.DELETE, project, R_TAGS + "");
grant(Permission.CREATE_TAG, project, R_TAGS + "*"); grant(Permission.CREATE_TAG, project, R_TAGS + "*");
grant(Permission.CREATE_SIGNED_TAG, project, R_TAGS + "*"); grant(Permission.CREATE_SIGNED_TAG, project, R_TAGS + "*");
} }

View File

@ -170,11 +170,17 @@ public class TagsIT extends AbstractDaemonTest {
TagInfo result = tag(input.ref).create(input).get(); TagInfo result = tag(input.ref).create(input).get();
assertThat(result.ref).isEqualTo(R_TAGS + input.ref); assertThat(result.ref).isEqualTo(R_TAGS + input.ref);
assertThat(result.revision).isEqualTo(input.revision); assertThat(result.revision).isEqualTo(input.revision);
assertThat(result.canDelete).isTrue();
input.ref = "refs/tags/v2.0"; input.ref = "refs/tags/v2.0";
result = tag(input.ref).create(input).get(); result = tag(input.ref).create(input).get();
assertThat(result.ref).isEqualTo(input.ref); assertThat(result.ref).isEqualTo(input.ref);
assertThat(result.revision).isEqualTo(input.revision); 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); eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision);
} }

View File

@ -21,13 +21,20 @@ public class TagInfo extends RefInfo {
public String message; public String message;
public GitPerson tagger; public GitPerson tagger;
public TagInfo(String ref, String revision) { public TagInfo(String ref, String revision, boolean canDelete) {
this.ref = ref; this.ref = ref;
this.revision = revision; this.revision = revision;
this.canDelete = canDelete;
} }
public TagInfo(String ref, String revision, String object, String message, GitPerson tagger) { public TagInfo(
this(ref, revision); String ref,
String revision,
String object,
String message,
GitPerson tagger,
boolean canDelete) {
this(ref, revision, canDelete);
this.object = object; this.object = object;
this.message = message; this.message = message;
this.tagger = tagger; this.tagger = tagger;

View File

@ -134,7 +134,7 @@ public class CreateTag implements RestModifyView<ProjectResource, TagInput> {
result.getObjectId(), result.getObjectId(),
identifiedUser.get().getAccount()); identifiedUser.get().getAccount());
try (RevWalk w = new RevWalk(repo)) { try (RevWalk w = new RevWalk(repo)) {
return ListTags.createTagInfo(result, w); return ListTags.createTagInfo(result, w, refControl);
} }
} }
} catch (InvalidRevisionException e) { } catch (InvalidRevisionException e) {

View File

@ -121,10 +121,11 @@ public class ListTags implements RestReadView<ProjectResource> {
try (Repository repo = getRepository(resource.getNameKey()); try (Repository repo = getRepository(resource.getNameKey());
RevWalk rw = new RevWalk(repo)) { RevWalk rw = new RevWalk(repo)) {
ProjectControl control = resource.getControl();
Map<String, Ref> all = Map<String, Ref> 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()) { 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<ProjectResource> {
tagName = Constants.R_TAGS + tagName; tagName = Constants.R_TAGS + tagName;
} }
Ref ref = repo.getRefDatabase().exactRef(tagName); Ref ref = repo.getRefDatabase().exactRef(tagName);
ProjectControl control = resource.getControl();
if (ref != null if (ref != null
&& !visibleTags(resource.getControl(), repo, ImmutableMap.of(ref.getName(), ref)) && !visibleTags(control, repo, ImmutableMap.of(ref.getName(), ref)).isEmpty()) {
.isEmpty()) { return createTagInfo(ref, rw, control.controlForRef(ref.getName()));
return createTagInfo(ref, rw);
} }
} }
throw new ResourceNotFoundException(id); 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 { throws MissingObjectException, IOException {
RevObject object = rw.parseAny(ref.getObjectId()); RevObject object = rw.parseAny(ref.getObjectId());
if (object instanceof RevTag) { if (object instanceof RevTag) {
@ -175,10 +176,11 @@ public class ListTags implements RestReadView<ProjectResource> {
tag.getName(), tag.getName(),
tag.getObject().getName(), tag.getObject().getName(),
tag.getFullMessage().trim(), tag.getFullMessage().trim(),
tagger != null ? CommonConverters.toGitPerson(tag.getTaggerIdent()) : null); tagger != null ? CommonConverters.toGitPerson(tag.getTaggerIdent()) : null,
control.canDelete());
} }
// Lightweight tag // 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) private Repository getRepository(Project.NameKey project)