Revert "Reuse Gerrit code for head update" This reverts commit 1a1abe3ed37eccaf4e23df696180ff3c8e2dc923. Reason for revert: The pull-replication needs specific logic on the ACLs which would not be compatible with the existing Gerrit's heads update command. Change-Id: Icb82133909f48e3e7740ad4de7fc09a91166dbb0
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/UpdateHeadAction.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/UpdateHeadAction.java index ae9c072..4195435 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/UpdateHeadAction.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/UpdateHeadAction.java
@@ -14,28 +14,66 @@ package com.googlesource.gerrit.plugins.replication.pull.api; +import com.google.common.base.Strings; +import com.google.gerrit.entities.RefNames; import com.google.gerrit.extensions.api.projects.HeadInput; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ResourceConflictException; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestModifyView; +import com.google.gerrit.extensions.restapi.UnprocessableEntityException; +import com.google.gerrit.server.permissions.PermissionBackend; +import com.google.gerrit.server.permissions.RefPermission; import com.google.gerrit.server.project.ProjectResource; -import com.google.gerrit.server.restapi.project.SetHead; import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.googlesource.gerrit.plugins.replication.LocalFS; +import com.googlesource.gerrit.plugins.replication.pull.GerritConfigOps; +import java.util.Optional; +import org.eclipse.jgit.transport.URIish; +@Singleton public class UpdateHeadAction implements RestModifyView<ProjectResource, HeadInput> { - - private final SetHead setHead; + private final GerritConfigOps gerritConfigOps; + private final PermissionBackend permissionBackend; @Inject - public UpdateHeadAction(SetHead setHead) { - this.setHead = setHead; + UpdateHeadAction(GerritConfigOps gerritConfigOps, PermissionBackend permissionBackend) { + this.gerritConfigOps = gerritConfigOps; + this.permissionBackend = permissionBackend; } @Override - public Response<?> apply(ProjectResource resource, HeadInput input) + public Response<?> apply(ProjectResource projectResource, HeadInput input) throws AuthException, BadRequestException, ResourceConflictException, Exception { - return setHead.apply(resource, input); + if (input == null || Strings.isNullOrEmpty(input.ref)) { + throw new BadRequestException("ref required"); + } + String ref = RefNames.fullName(input.ref); + + permissionBackend + .user(projectResource.getUser()) + .project(projectResource.getNameKey()) + .ref(ref) + .check(RefPermission.SET_HEAD); + + // TODO: the .git suffix should not be added here, but rather it should be + // dealt with by the caller, honouring the naming style from the + // replication.config (Issue 15221) + Optional<URIish> maybeRepo = + gerritConfigOps.getGitRepositoryURI(String.format("%s.git", projectResource.getName())); + + if (maybeRepo.isPresent()) { + if (new LocalFS(maybeRepo.get()).updateHead(projectResource.getNameKey(), ref)) { + return Response.ok(ref); + } + throw new UnprocessableEntityException( + String.format( + "Could not update HEAD of repo %s to ref %s", projectResource.getName(), ref)); + } + throw new ResourceNotFoundException( + String.format("Could not compute URL for repo: %s", projectResource.getName())); } }