summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java75
1 files changed, 37 insertions, 38 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java
index 5bd651d4bc..0425e53a18 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java
@@ -22,13 +22,11 @@ import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.MergeInput;
import com.google.gerrit.extensions.common.MergePatchSetInput;
-import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.MergeConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
@@ -42,10 +40,15 @@ import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MergeIdenticalTreeException;
import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.project.ChangeControl;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.CommitsCollection;
import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.gerrit.server.update.UpdateException;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@@ -65,64 +68,60 @@ import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.util.ChangeIdUtil;
@Singleton
-public class CreateMergePatchSet implements RestModifyView<ChangeResource, MergePatchSetInput> {
-
+public class CreateMergePatchSet
+ extends RetryingRestModifyView<ChangeResource, MergePatchSetInput, Response<ChangeInfo>> {
private final Provider<ReviewDb> db;
private final GitRepositoryManager gitManager;
+ private final CommitsCollection commits;
private final TimeZone serverTimeZone;
private final Provider<CurrentUser> user;
private final ChangeJson.Factory jsonFactory;
private final PatchSetUtil psUtil;
private final MergeUtil.Factory mergeUtilFactory;
- private final BatchUpdate.Factory batchUpdateFactory;
private final PatchSetInserter.Factory patchSetInserterFactory;
+ private final ProjectCache projectCache;
@Inject
CreateMergePatchSet(
Provider<ReviewDb> db,
GitRepositoryManager gitManager,
+ CommitsCollection commits,
@GerritPersonIdent PersonIdent myIdent,
Provider<CurrentUser> user,
ChangeJson.Factory json,
PatchSetUtil psUtil,
MergeUtil.Factory mergeUtilFactory,
- BatchUpdate.Factory batchUpdateFactory,
- PatchSetInserter.Factory patchSetInserterFactory) {
+ RetryHelper retryHelper,
+ PatchSetInserter.Factory patchSetInserterFactory,
+ ProjectCache projectCache) {
+ super(retryHelper);
this.db = db;
this.gitManager = gitManager;
+ this.commits = commits;
this.serverTimeZone = myIdent.getTimeZone();
this.user = user;
this.jsonFactory = json;
this.psUtil = psUtil;
this.mergeUtilFactory = mergeUtilFactory;
- this.batchUpdateFactory = batchUpdateFactory;
this.patchSetInserterFactory = patchSetInserterFactory;
+ this.projectCache = projectCache;
}
@Override
- public Response<ChangeInfo> apply(ChangeResource req, MergePatchSetInput in)
+ protected Response<ChangeInfo> applyImpl(
+ BatchUpdate.Factory updateFactory, ChangeResource rsrc, MergePatchSetInput in)
throws OrmException, IOException, InvalidChangeOperationException, RestApiException,
- UpdateException {
- if (in.merge == null) {
- throw new BadRequestException("merge field is required");
- }
+ UpdateException, PermissionBackendException {
+ rsrc.permissions().database(db).check(ChangePermission.ADD_PATCH_SET);
MergeInput merge = in.merge;
- if (Strings.isNullOrEmpty(merge.source)) {
+ if (merge == null || Strings.isNullOrEmpty(merge.source)) {
throw new BadRequestException("merge.source must be non-empty");
}
- ChangeControl ctl = req.getControl();
- if (!ctl.isVisible(db.get())) {
- throw new InvalidChangeOperationException("Base change not found: " + req.getId());
- }
- PatchSet ps = psUtil.current(db.get(), ctl.getNotes());
- if (!ctl.canAddPatchSet(db.get())) {
- throw new AuthException("cannot add patch set");
- }
-
- ProjectControl projectControl = ctl.getProjectControl();
- Change change = ctl.getChange();
+ PatchSet ps = psUtil.current(db.get(), rsrc.getNotes());
+ ProjectState projectState = projectCache.checkedGet(rsrc.getProject());
+ Change change = rsrc.getChange();
Project.NameKey project = change.getProject();
Branch.NameKey dest = change.getDest();
try (Repository git = gitManager.openRepository(project);
@@ -131,21 +130,19 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
RevWalk rw = new RevWalk(reader)) {
RevCommit sourceCommit = MergeUtil.resolveCommit(git, rw, merge.source);
- if (!projectControl.canReadCommit(db.get(), git, sourceCommit)) {
+ if (!commits.canRead(projectState, git, sourceCommit)) {
throw new ResourceNotFoundException(
"cannot find source commit: " + merge.source + " to merge.");
}
RevCommit currentPsCommit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
-
Timestamp now = TimeUtil.nowTs();
IdentifiedUser me = user.get().asIdentifiedUser();
PersonIdent author = me.newCommitterIdent(now, serverTimeZone);
-
RevCommit newCommit =
createMergeCommit(
in,
- projectControl,
+ projectState,
dest,
git,
oi,
@@ -156,14 +153,16 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
ObjectId.fromString(change.getKey().get().substring(1)));
PatchSet.Id nextPsId = ChangeUtil.nextPatchSetId(ps.getId());
- PatchSetInserter psInserter = patchSetInserterFactory.create(ctl, nextPsId, newCommit);
- try (BatchUpdate bu = batchUpdateFactory.create(db.get(), project, me, now)) {
+ PatchSetInserter psInserter =
+ patchSetInserterFactory.create(rsrc.getNotes(), nextPsId, newCommit);
+ try (BatchUpdate bu = updateFactory.create(db.get(), project, me, now)) {
bu.setRepository(git, rw, oi);
bu.addOp(
- ctl.getId(),
+ rsrc.getId(),
psInserter
.setMessage("Uploaded patch set " + nextPsId.get() + ".")
- .setDraft(ps.isDraft())
+ .setNotify(NotifyHandling.NONE)
+ .setCheckAddPatchSetPermission(false)
.setNotify(NotifyHandling.NONE));
bu.execute();
}
@@ -175,7 +174,7 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
private RevCommit createMergeCommit(
MergePatchSetInput in,
- ProjectControl projectControl,
+ ProjectState projectState,
Branch.NameKey dest,
Repository git,
ObjectInserter oi,
@@ -213,9 +212,9 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
String mergeStrategy =
MoreObjects.firstNonNull(
Strings.emptyToNull(in.merge.strategy),
- mergeUtilFactory.create(projectControl.getProjectState()).mergeStrategyName());
+ mergeUtilFactory.create(projectState).mergeStrategyName());
return MergeUtil.createMergeCommit(
- git, oi, mergeTip, sourceCommit, mergeStrategy, author, commitMsg, rw);
+ oi, git.getConfig(), mergeTip, sourceCommit, mergeStrategy, author, commitMsg, rw);
}
}