summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java219
1 files changed, 0 insertions, 219 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java
deleted file mode 100644
index 77aa9508b0..0000000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.gerrit.server.git.strategy;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.git.strategy.CommitMergeStatus.SKIPPED_IDENTICAL_TREE;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.MergeIdenticalTreeException;
-import com.google.gerrit.server.git.MergeTip;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-public class CherryPick extends SubmitStrategy {
-
- CherryPick(SubmitStrategy.Arguments args) {
- super(args);
- }
-
- @Override
- public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
- throws IntegrationException {
- List<CodeReviewCommit> sorted = CodeReviewCommit.ORDER.sortedCopy(toMerge);
- List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
- boolean first = true;
- while (!sorted.isEmpty()) {
- CodeReviewCommit n = sorted.remove(0);
- if (first && args.mergeTip.getInitialTip() == null) {
- ops.add(new FastForwardOp(args, n));
- } else if (n.getParentCount() == 0) {
- ops.add(new CherryPickRootOp(n));
- } else if (n.getParentCount() == 1) {
- ops.add(new CherryPickOneOp(n));
- } else {
- ops.add(new CherryPickMultipleParentsOp(n));
- }
- first = false;
- }
- return ops;
- }
-
- private class CherryPickRootOp extends SubmitStrategyOp {
- private CherryPickRootOp(CodeReviewCommit toMerge) {
- super(CherryPick.this.args, toMerge);
- }
-
- @Override
- public void updateRepoImpl(RepoContext ctx) {
- // Refuse to merge a root commit into an existing branch, we cannot obtain
- // a delta for the cherry-pick to apply.
- toMerge.setStatusCode(CommitMergeStatus.CANNOT_CHERRY_PICK_ROOT);
- }
- }
-
- private class CherryPickOneOp extends SubmitStrategyOp {
- private PatchSet.Id psId;
- private CodeReviewCommit newCommit;
- private PatchSetInfo patchSetInfo;
-
- private CherryPickOneOp(CodeReviewCommit toMerge) {
- super(CherryPick.this.args, toMerge);
- }
-
- @Override
- protected void updateRepoImpl(RepoContext ctx)
- throws IntegrationException, IOException, OrmException {
- // If there is only one parent, a cherry-pick can be done by taking the
- // delta relative to that one parent and redoing that on the current merge
- // tip.
- args.rw.parseBody(toMerge);
- psId =
- ChangeUtil.nextPatchSetIdFromChangeRefsMap(
- ctx.getRepoView().getRefs(getId().toRefPrefix()),
- toMerge.change().currentPatchSetId());
- RevCommit mergeTip = args.mergeTip.getCurrentTip();
- args.rw.parseBody(mergeTip);
- String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip);
-
- PersonIdent committer =
- args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone());
- try {
- newCommit =
- args.mergeUtil.createCherryPickFromCommit(
- ctx.getInserter(),
- ctx.getRepoView().getConfig(),
- args.mergeTip.getCurrentTip(),
- toMerge,
- committer,
- cherryPickCmtMsg,
- args.rw,
- 0,
- false);
- } catch (MergeConflictException mce) {
- // Keep going in the case of a single merge failure; the goal is to
- // cherry-pick as many commits as possible.
- toMerge.setStatusCode(CommitMergeStatus.PATH_CONFLICT);
- return;
- } catch (MergeIdenticalTreeException mie) {
- toMerge.setStatusCode(SKIPPED_IDENTICAL_TREE);
- return;
- }
- // Initial copy doesn't have new patch set ID since change hasn't been
- // updated yet.
- newCommit = amendGitlink(newCommit);
- newCommit.copyFrom(toMerge);
- newCommit.setPatchsetId(psId);
- newCommit.setStatusCode(CommitMergeStatus.CLEAN_PICK);
- args.mergeTip.moveTipTo(newCommit, newCommit);
- args.commitStatus.put(newCommit);
-
- ctx.addRefUpdate(ObjectId.zeroId(), newCommit, psId.toRefName());
- patchSetInfo = args.patchSetInfoFactory.get(ctx.getRevWalk(), newCommit, psId);
- }
-
- @Override
- public PatchSet updateChangeImpl(ChangeContext ctx)
- throws OrmException, NoSuchChangeException, IOException {
- if (newCommit == null && toMerge.getStatusCode() == SKIPPED_IDENTICAL_TREE) {
- return null;
- }
- checkNotNull(
- newCommit,
- "no new commit produced by CherryPick of %s, expected to fail fast",
- toMerge.change().getId());
- PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes());
- PatchSet newPs =
- args.psUtil.insert(
- ctx.getDb(),
- ctx.getRevWalk(),
- ctx.getUpdate(psId),
- psId,
- newCommit,
- prevPs != null ? prevPs.getGroups() : ImmutableList.<String>of(),
- null,
- null);
- ctx.getChange().setCurrentPatchSet(patchSetInfo);
-
- // Don't copy approvals, as this is already taken care of by
- // SubmitStrategyOp.
-
- newCommit.setNotes(ctx.getNotes());
- return newPs;
- }
- }
-
- private class CherryPickMultipleParentsOp extends SubmitStrategyOp {
- private CherryPickMultipleParentsOp(CodeReviewCommit toMerge) {
- super(CherryPick.this.args, toMerge);
- }
-
- @Override
- public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException {
- if (args.mergeUtil.hasMissingDependencies(args.mergeSorter, toMerge)) {
- // One or more dependencies were not met. The status was already marked
- // on the commit so we have nothing further to perform at this time.
- return;
- }
- // There are multiple parents, so this is a merge commit. We don't want
- // to cherry-pick the merge as clients can't easily rebase their history
- // with that merge present and replaced by an equivalent merge with a
- // different first parent. So instead behave as though MERGE_IF_NECESSARY
- // was configured.
- MergeTip mergeTip = args.mergeTip;
- if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge)
- && !args.submoduleOp.hasSubscription(args.destBranch)) {
- mergeTip.moveTipTo(toMerge, toMerge);
- } else {
- PersonIdent myIdent = new PersonIdent(args.serverIdent, ctx.getWhen());
- CodeReviewCommit result =
- args.mergeUtil.mergeOneCommit(
- myIdent,
- myIdent,
- args.rw,
- ctx.getInserter(),
- ctx.getRepoView().getConfig(),
- args.destBranch,
- mergeTip.getCurrentTip(),
- toMerge);
- result = amendGitlink(result);
- mergeTip.moveTipTo(result, toMerge);
- args.mergeUtil.markCleanMerges(
- args.rw, args.canMergeFlag, mergeTip.getCurrentTip(), args.alreadyAccepted);
- }
- }
- }
-
- static boolean dryRun(
- SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
- throws IntegrationException {
- return args.mergeUtil.canCherryPick(args.mergeSorter, args.repo, mergeTip, args.rw, toMerge);
- }
-}