Reuse Gerrit code for head update
To avoid code duplication and to make sure that head update is done
correctly replace pull-replication custom code with the code from Gerrit
core.
Bug: Issue 15396
Change-Id: Ic49b731a8e5394ead3a4d36134db7a38f068718d
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 4195435..ae9c072 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,66 +14,28 @@
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 GerritConfigOps gerritConfigOps;
- private final PermissionBackend permissionBackend;
+
+ private final SetHead setHead;
@Inject
- UpdateHeadAction(GerritConfigOps gerritConfigOps, PermissionBackend permissionBackend) {
- this.gerritConfigOps = gerritConfigOps;
- this.permissionBackend = permissionBackend;
+ public UpdateHeadAction(SetHead setHead) {
+ this.setHead = setHead;
}
@Override
- public Response<?> apply(ProjectResource projectResource, HeadInput input)
+ public Response<?> apply(ProjectResource resource, HeadInput input)
throws AuthException, BadRequestException, ResourceConflictException, Exception {
- 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()));
+ return setHead.apply(resource, input);
}
}