Avoid casting to CodeReviewCommit
Override more methods in CodeReviewRevWalk to return or accept only CodeReviewCommits. Expose this type and use it wherever CodeReviewCommits are required, to make accidentally passing in a vanilla RevWalk a compile error. The only method that could not be effectively changed is the iterator() method, because generics are no covariant. Callers using this method would still have to cast, but that operation is still easier for a human to verify, since they can see that the object being iterated is actually a CodeReviewRevWalk. However, in practice, only one caller was using that pattern, so I just converted it to use next(). Change-Id: I3733240f2fca8236bd8c3894f79e35eff9f53e8c
This commit is contained in:
		@@ -30,6 +30,8 @@ import com.google.gerrit.server.CurrentUser;
 | 
			
		||||
import com.google.gerrit.server.GerritPersonIdent;
 | 
			
		||||
import com.google.gerrit.server.IdentifiedUser;
 | 
			
		||||
import com.google.gerrit.server.events.CommitReceivedEvent;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
import com.google.gerrit.server.git.GitRepositoryManager;
 | 
			
		||||
import com.google.gerrit.server.git.MergeConflictException;
 | 
			
		||||
import com.google.gerrit.server.git.MergeException;
 | 
			
		||||
@@ -60,7 +62,6 @@ import org.eclipse.jgit.lib.PersonIdent;
 | 
			
		||||
import org.eclipse.jgit.lib.Ref;
 | 
			
		||||
import org.eclipse.jgit.lib.RefUpdate;
 | 
			
		||||
import org.eclipse.jgit.lib.Repository;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
import org.eclipse.jgit.transport.ReceiveCommand;
 | 
			
		||||
import org.eclipse.jgit.util.ChangeIdUtil;
 | 
			
		||||
@@ -125,16 +126,16 @@ public class CherryPickChange {
 | 
			
		||||
    String destinationBranch = RefNames.shortName(ref);
 | 
			
		||||
    IdentifiedUser identifiedUser = (IdentifiedUser) currentUser.get();
 | 
			
		||||
    try (Repository git = gitManager.openRepository(project);
 | 
			
		||||
        RevWalk revWalk = new RevWalk(git)) {
 | 
			
		||||
        CodeReviewRevWalk revWalk = CodeReviewCommit.newRevWalk(git)) {
 | 
			
		||||
      Ref destRef = git.getRefDatabase().exactRef(ref);
 | 
			
		||||
      if (destRef == null) {
 | 
			
		||||
        throw new InvalidChangeOperationException(String.format(
 | 
			
		||||
            "Branch %s does not exist.", destinationBranch));
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      final RevCommit mergeTip = revWalk.parseCommit(destRef.getObjectId());
 | 
			
		||||
      CodeReviewCommit mergeTip = revWalk.parseCommit(destRef.getObjectId());
 | 
			
		||||
 | 
			
		||||
      RevCommit commitToCherryPick =
 | 
			
		||||
      CodeReviewCommit commitToCherryPick =
 | 
			
		||||
          revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get()));
 | 
			
		||||
 | 
			
		||||
      PersonIdent committerIdent =
 | 
			
		||||
@@ -148,7 +149,7 @@ public class CherryPickChange {
 | 
			
		||||
      String commitMessage =
 | 
			
		||||
          ChangeIdUtil.insertId(message, computedChangeId).trim() + '\n';
 | 
			
		||||
 | 
			
		||||
      RevCommit cherryPickCommit;
 | 
			
		||||
      CodeReviewCommit cherryPickCommit;
 | 
			
		||||
      try (ObjectInserter oi = git.newObjectInserter()) {
 | 
			
		||||
        ProjectState projectState = refControl.getProjectControl().getProjectState();
 | 
			
		||||
        cherryPickCommit =
 | 
			
		||||
@@ -207,7 +208,7 @@ public class CherryPickChange {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private Change.Id insertPatchSet(Repository git, RevWalk revWalk, Change change,
 | 
			
		||||
      RevCommit cherryPickCommit, RefControl refControl,
 | 
			
		||||
      CodeReviewCommit cherryPickCommit, RefControl refControl,
 | 
			
		||||
      IdentifiedUser identifiedUser)
 | 
			
		||||
      throws InvalidChangeOperationException, IOException, OrmException,
 | 
			
		||||
      NoSuchChangeException {
 | 
			
		||||
@@ -228,7 +229,7 @@ public class CherryPickChange {
 | 
			
		||||
 | 
			
		||||
  private Change createNewChange(Repository git, RevWalk revWalk,
 | 
			
		||||
      Change.Key changeKey, Project.NameKey project,
 | 
			
		||||
      Ref destRef, RevCommit cherryPickCommit, RefControl refControl,
 | 
			
		||||
      Ref destRef, CodeReviewCommit cherryPickCommit, RefControl refControl,
 | 
			
		||||
      IdentifiedUser identifiedUser, String topic)
 | 
			
		||||
      throws OrmException, InvalidChangeOperationException, IOException {
 | 
			
		||||
    Change change =
 | 
			
		||||
@@ -271,7 +272,7 @@ public class CherryPickChange {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private void addMessageToSourceChange(Change change, PatchSet.Id patchSetId,
 | 
			
		||||
      String destinationBranch, RevCommit cherryPickCommit,
 | 
			
		||||
      String destinationBranch, CodeReviewCommit cherryPickCommit,
 | 
			
		||||
      IdentifiedUser identifiedUser, RefControl refControl) throws OrmException {
 | 
			
		||||
    ChangeMessage changeMessage = new ChangeMessage(
 | 
			
		||||
        new ChangeMessage.Key(
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ import com.google.gerrit.reviewdb.client.Branch;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.cache.CacheModule;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
import com.google.gerrit.server.git.MergeException;
 | 
			
		||||
import com.google.gerrit.server.git.strategy.SubmitStrategyFactory;
 | 
			
		||||
import com.google.gerrit.server.project.NoSuchProjectException;
 | 
			
		||||
@@ -206,11 +207,11 @@ public class MergeabilityCacheImpl implements MergeabilityCache {
 | 
			
		||||
      Iterable<Ref> refs = Iterables.concat(
 | 
			
		||||
          refDatabase.getRefs(Constants.R_HEADS).values(),
 | 
			
		||||
          refDatabase.getRefs(Constants.R_TAGS).values());
 | 
			
		||||
      try (RevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
 | 
			
		||||
      try (CodeReviewRevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
 | 
			
		||||
        RevFlag canMerge = rw.newFlag("CAN_MERGE");
 | 
			
		||||
        CodeReviewCommit rev = parse(rw, key.commit);
 | 
			
		||||
        CodeReviewCommit rev = rw.parseCommit(key.commit);
 | 
			
		||||
        rev.add(canMerge);
 | 
			
		||||
        CodeReviewCommit tip = parse(rw, key.into);
 | 
			
		||||
        CodeReviewCommit tip = rw.parseCommit(key.into);
 | 
			
		||||
        Set<RevCommit> accepted = alreadyAccepted(rw, refs);
 | 
			
		||||
        accepted.add(tip);
 | 
			
		||||
        accepted.addAll(Arrays.asList(rev.getParents()));
 | 
			
		||||
@@ -239,12 +240,6 @@ public class MergeabilityCacheImpl implements MergeabilityCache {
 | 
			
		||||
      }
 | 
			
		||||
      return accepted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private CodeReviewCommit parse(RevWalk rw, ObjectId id)
 | 
			
		||||
        throws MissingObjectException, IncorrectObjectTypeException,
 | 
			
		||||
        IOException {
 | 
			
		||||
      return (CodeReviewCommit) rw.parseCommit(id);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static class MergeabilityWeigher
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,8 @@
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.git;
 | 
			
		||||
 | 
			
		||||
import static com.google.common.base.Preconditions.checkArgument;
 | 
			
		||||
 | 
			
		||||
import com.google.common.base.Function;
 | 
			
		||||
import com.google.common.collect.Ordering;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
@@ -21,6 +23,8 @@ import com.google.gerrit.reviewdb.client.PatchSet;
 | 
			
		||||
import com.google.gerrit.server.notedb.ChangeNotes;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 | 
			
		||||
import org.eclipse.jgit.errors.MissingObjectException;
 | 
			
		||||
import org.eclipse.jgit.lib.AnyObjectId;
 | 
			
		||||
import org.eclipse.jgit.lib.ObjectId;
 | 
			
		||||
import org.eclipse.jgit.lib.ObjectReader;
 | 
			
		||||
@@ -28,6 +32,7 @@ import org.eclipse.jgit.lib.Repository;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/** Extended commit entity with code review specific metadata. */
 | 
			
		||||
@@ -50,11 +55,11 @@ public class CodeReviewCommit extends RevCommit {
 | 
			
		||||
        }
 | 
			
		||||
      }).nullsFirst();
 | 
			
		||||
 | 
			
		||||
  public static RevWalk newRevWalk(Repository repo) {
 | 
			
		||||
  public static CodeReviewRevWalk newRevWalk(Repository repo) {
 | 
			
		||||
    return new CodeReviewRevWalk(repo);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static RevWalk newRevWalk(ObjectReader reader) {
 | 
			
		||||
  public static CodeReviewRevWalk newRevWalk(ObjectReader reader) {
 | 
			
		||||
    return new CodeReviewRevWalk(reader);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -85,7 +90,7 @@ public class CodeReviewCommit extends RevCommit {
 | 
			
		||||
    return r;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static class CodeReviewRevWalk extends RevWalk {
 | 
			
		||||
  public static class CodeReviewRevWalk extends RevWalk {
 | 
			
		||||
    private CodeReviewRevWalk(Repository repo) {
 | 
			
		||||
      super(repo);
 | 
			
		||||
    }
 | 
			
		||||
@@ -95,9 +100,42 @@ public class CodeReviewCommit extends RevCommit {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected RevCommit createCommit(AnyObjectId id) {
 | 
			
		||||
    protected CodeReviewCommit createCommit(AnyObjectId id) {
 | 
			
		||||
      return new CodeReviewCommit(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public CodeReviewCommit next() throws MissingObjectException,
 | 
			
		||||
         IncorrectObjectTypeException, IOException {
 | 
			
		||||
      return (CodeReviewCommit) super.next();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void markStart(RevCommit c) throws MissingObjectException,
 | 
			
		||||
        IncorrectObjectTypeException, IOException {
 | 
			
		||||
      checkArgument(c instanceof CodeReviewCommit);
 | 
			
		||||
      super.markStart(c);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void markUninteresting(final RevCommit c)
 | 
			
		||||
        throws MissingObjectException, IncorrectObjectTypeException,
 | 
			
		||||
        IOException {
 | 
			
		||||
      checkArgument(c instanceof CodeReviewCommit);
 | 
			
		||||
      super.markUninteresting(c);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public CodeReviewCommit lookupCommit(AnyObjectId id) {
 | 
			
		||||
      return (CodeReviewCommit) super.lookupCommit(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public CodeReviewCommit parseCommit(AnyObjectId id)
 | 
			
		||||
        throws MissingObjectException, IncorrectObjectTypeException,
 | 
			
		||||
        IOException {
 | 
			
		||||
      return (CodeReviewCommit) super.parseCommit(id);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
 
 | 
			
		||||
@@ -50,6 +50,7 @@ import com.google.gerrit.server.GerritPersonIdent;
 | 
			
		||||
import com.google.gerrit.server.IdentifiedUser;
 | 
			
		||||
import com.google.gerrit.server.account.AccountCache;
 | 
			
		||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
import com.google.gerrit.server.git.VersionedMetaData.BatchMetaDataUpdate;
 | 
			
		||||
import com.google.gerrit.server.git.strategy.SubmitStrategy;
 | 
			
		||||
import com.google.gerrit.server.git.strategy.SubmitStrategyFactory;
 | 
			
		||||
@@ -86,7 +87,6 @@ import org.eclipse.jgit.lib.Repository;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevFlag;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevSort;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
@@ -148,7 +148,7 @@ public class MergeOp {
 | 
			
		||||
  private ProjectState destProject;
 | 
			
		||||
  private ReviewDb db;
 | 
			
		||||
  private Repository repo;
 | 
			
		||||
  private RevWalk rw;
 | 
			
		||||
  private CodeReviewRevWalk rw;
 | 
			
		||||
  private RevFlag canMergeFlag;
 | 
			
		||||
  private ObjectInserter inserter;
 | 
			
		||||
  private PersonIdent refLogIdent;
 | 
			
		||||
@@ -507,8 +507,7 @@ public class MergeOp {
 | 
			
		||||
      RefUpdate branchUpdate = repo.updateRef(destBranch.get());
 | 
			
		||||
      CodeReviewCommit branchTip;
 | 
			
		||||
      if (branchUpdate.getOldObjectId() != null) {
 | 
			
		||||
        branchTip =
 | 
			
		||||
            (CodeReviewCommit) rw.parseCommit(branchUpdate.getOldObjectId());
 | 
			
		||||
        branchTip = rw.parseCommit(branchUpdate.getOldObjectId());
 | 
			
		||||
      } else if (Objects.equals(repo.getFullBranch(), destBranch.get())) {
 | 
			
		||||
        branchTip = null;
 | 
			
		||||
        branchUpdate.setExpectedOldObjectId(ObjectId.zeroId());
 | 
			
		||||
@@ -641,7 +640,7 @@ public class MergeOp {
 | 
			
		||||
 | 
			
		||||
      CodeReviewCommit commit;
 | 
			
		||||
      try {
 | 
			
		||||
        commit = (CodeReviewCommit) rw.parseCommit(id);
 | 
			
		||||
        commit = rw.parseCommit(id);
 | 
			
		||||
      } catch (IOException e) {
 | 
			
		||||
        logError("Invalid commit " + idstr + " on patch set " + ps.getId(), e);
 | 
			
		||||
        commits.put(changeId, CodeReviewCommit.revisionGone(ctl));
 | 
			
		||||
 
 | 
			
		||||
@@ -14,10 +14,11 @@
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.git;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommitList;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevFlag;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
@@ -27,12 +28,12 @@ import java.util.Iterator;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class MergeSorter {
 | 
			
		||||
  private final RevWalk rw;
 | 
			
		||||
  private final CodeReviewRevWalk rw;
 | 
			
		||||
  private final RevFlag canMergeFlag;
 | 
			
		||||
  private final Set<RevCommit> accepted;
 | 
			
		||||
 | 
			
		||||
  public MergeSorter(final RevWalk rw, final Set<RevCommit> alreadyAccepted,
 | 
			
		||||
      final RevFlag canMergeFlag) {
 | 
			
		||||
  public MergeSorter(CodeReviewRevWalk rw, Set<RevCommit> alreadyAccepted,
 | 
			
		||||
      RevFlag canMergeFlag) {
 | 
			
		||||
    this.rw = rw;
 | 
			
		||||
    this.canMergeFlag = canMergeFlag;
 | 
			
		||||
    this.accepted = alreadyAccepted;
 | 
			
		||||
@@ -51,8 +52,8 @@ public class MergeSorter {
 | 
			
		||||
        rw.markUninteresting(c);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      RevCommit c;
 | 
			
		||||
      final RevCommitList<RevCommit> contents = new RevCommitList<>();
 | 
			
		||||
      CodeReviewCommit c;
 | 
			
		||||
      RevCommitList<RevCommit> contents = new RevCommitList<>();
 | 
			
		||||
      while ((c = rw.next()) != null) {
 | 
			
		||||
        if (!c.has(canMergeFlag) || !incoming.contains(c)) {
 | 
			
		||||
          // We cannot merge n as it would bring something we
 | 
			
		||||
@@ -62,7 +63,7 @@ public class MergeSorter {
 | 
			
		||||
            n.setStatusCode(CommitMergeStatus.MISSING_DEPENDENCY);
 | 
			
		||||
            n.missing = new ArrayList<>();
 | 
			
		||||
          }
 | 
			
		||||
          n.missing.add((CodeReviewCommit) c);
 | 
			
		||||
          n.missing.add(c);
 | 
			
		||||
        } else {
 | 
			
		||||
          contents.add(c);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@ import com.google.gerrit.server.ApprovalsUtil;
 | 
			
		||||
import com.google.gerrit.server.IdentifiedUser;
 | 
			
		||||
import com.google.gerrit.server.config.CanonicalWebUrl;
 | 
			
		||||
import com.google.gerrit.server.config.GerritServerConfig;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectState;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
@@ -164,9 +165,10 @@ public class MergeUtil {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public RevCommit createCherryPickFromCommit(Repository repo,
 | 
			
		||||
  public CodeReviewCommit createCherryPickFromCommit(Repository repo,
 | 
			
		||||
      ObjectInserter inserter, RevCommit mergeTip, RevCommit originalCommit,
 | 
			
		||||
      PersonIdent cherryPickCommitterIdent, String commitMsg, RevWalk rw)
 | 
			
		||||
      PersonIdent cherryPickCommitterIdent, String commitMsg,
 | 
			
		||||
      CodeReviewRevWalk rw)
 | 
			
		||||
      throws MissingObjectException, IncorrectObjectTypeException, IOException,
 | 
			
		||||
      MergeIdenticalTreeException, MergeConflictException {
 | 
			
		||||
 | 
			
		||||
@@ -361,9 +363,9 @@ public class MergeUtil {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public boolean canFastForward(final MergeSorter mergeSorter,
 | 
			
		||||
      final CodeReviewCommit mergeTip, final RevWalk rw,
 | 
			
		||||
      final CodeReviewCommit toMerge) throws MergeException {
 | 
			
		||||
  public boolean canFastForward(MergeSorter mergeSorter,
 | 
			
		||||
      CodeReviewCommit mergeTip, CodeReviewRevWalk rw, CodeReviewCommit toMerge)
 | 
			
		||||
      throws MergeException {
 | 
			
		||||
    if (hasMissingDependencies(mergeSorter, toMerge)) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -375,9 +377,9 @@ public class MergeUtil {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public boolean canCherryPick(final MergeSorter mergeSorter,
 | 
			
		||||
      final Repository repo, final CodeReviewCommit mergeTip, final RevWalk rw,
 | 
			
		||||
      final CodeReviewCommit toMerge) throws MergeException {
 | 
			
		||||
  public boolean canCherryPick(MergeSorter mergeSorter, Repository repo,
 | 
			
		||||
      CodeReviewCommit mergeTip, CodeReviewRevWalk rw, CodeReviewCommit toMerge)
 | 
			
		||||
      throws MergeException {
 | 
			
		||||
    if (mergeTip == null) {
 | 
			
		||||
      // The branch is unborn. Fast-forward is possible.
 | 
			
		||||
      //
 | 
			
		||||
@@ -445,7 +447,7 @@ public class MergeUtil {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public CodeReviewCommit mergeOneCommit(PersonIdent author,
 | 
			
		||||
      PersonIdent committer, Repository repo, RevWalk rw,
 | 
			
		||||
      PersonIdent committer, Repository repo, CodeReviewRevWalk rw,
 | 
			
		||||
      ObjectInserter inserter, RevFlag canMergeFlag, Branch.NameKey destBranch,
 | 
			
		||||
      CodeReviewCommit mergeTip, CodeReviewCommit n) throws MergeException {
 | 
			
		||||
    final ThreeWayMerger m = newThreeWayMerger(repo, inserter);
 | 
			
		||||
@@ -481,22 +483,22 @@ public class MergeUtil {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static CodeReviewCommit failed(final RevWalk rw,
 | 
			
		||||
      final RevFlag canMergeFlag, final CodeReviewCommit mergeTip,
 | 
			
		||||
      final CodeReviewCommit n, final CommitMergeStatus failure)
 | 
			
		||||
  private static CodeReviewCommit failed(CodeReviewRevWalk rw,
 | 
			
		||||
      RevFlag canMergeFlag, CodeReviewCommit mergeTip, CodeReviewCommit n,
 | 
			
		||||
      CommitMergeStatus failure)
 | 
			
		||||
      throws MissingObjectException, IncorrectObjectTypeException, IOException {
 | 
			
		||||
    rw.resetRetain(canMergeFlag);
 | 
			
		||||
    rw.markStart(n);
 | 
			
		||||
    rw.markUninteresting(mergeTip);
 | 
			
		||||
    CodeReviewCommit failed;
 | 
			
		||||
    while ((failed = (CodeReviewCommit) rw.next()) != null) {
 | 
			
		||||
    while ((failed = rw.next()) != null) {
 | 
			
		||||
      failed.setStatusCode(failure);
 | 
			
		||||
    }
 | 
			
		||||
    return failed;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public CodeReviewCommit writeMergeCommit(PersonIdent author,
 | 
			
		||||
      PersonIdent committer, RevWalk rw, ObjectInserter inserter,
 | 
			
		||||
      PersonIdent committer, CodeReviewRevWalk rw, ObjectInserter inserter,
 | 
			
		||||
      RevFlag canMergeFlag, Branch.NameKey destBranch,
 | 
			
		||||
      CodeReviewCommit mergeTip, ObjectId treeId, CodeReviewCommit n)
 | 
			
		||||
      throws IOException, MissingObjectException,
 | 
			
		||||
@@ -505,8 +507,8 @@ public class MergeUtil {
 | 
			
		||||
    rw.resetRetain(canMergeFlag);
 | 
			
		||||
    rw.markStart(n);
 | 
			
		||||
    rw.markUninteresting(mergeTip);
 | 
			
		||||
    for (final RevCommit c : rw) {
 | 
			
		||||
      final CodeReviewCommit crc = (CodeReviewCommit) c;
 | 
			
		||||
    CodeReviewCommit crc;
 | 
			
		||||
    while ((crc = rw.next()) != null) {
 | 
			
		||||
      if (crc.getPatchsetId() != null) {
 | 
			
		||||
        merged.add(crc);
 | 
			
		||||
      }
 | 
			
		||||
@@ -536,7 +538,7 @@ public class MergeUtil {
 | 
			
		||||
    mergeCommit.setMessage(msgbuf.toString());
 | 
			
		||||
 | 
			
		||||
    CodeReviewCommit mergeResult =
 | 
			
		||||
        (CodeReviewCommit) rw.parseCommit(commit(inserter, mergeCommit));
 | 
			
		||||
        rw.parseCommit(commit(inserter, mergeCommit));
 | 
			
		||||
    mergeResult.setControl(n.getControl());
 | 
			
		||||
    return mergeResult;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -14,9 +14,10 @@
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.git;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevFlag;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
@@ -28,13 +29,12 @@ import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class RebaseSorter {
 | 
			
		||||
 | 
			
		||||
  private final RevWalk rw;
 | 
			
		||||
  private final CodeReviewRevWalk rw;
 | 
			
		||||
  private final RevFlag canMergeFlag;
 | 
			
		||||
  private final Set<RevCommit> accepted;
 | 
			
		||||
 | 
			
		||||
  public RebaseSorter(final RevWalk rw, final Set<RevCommit> alreadyAccepted,
 | 
			
		||||
      final RevFlag canMergeFlag) {
 | 
			
		||||
  public RebaseSorter(CodeReviewRevWalk rw, Set<RevCommit> alreadyAccepted,
 | 
			
		||||
      RevFlag canMergeFlag) {
 | 
			
		||||
    this.rw = rw;
 | 
			
		||||
    this.canMergeFlag = canMergeFlag;
 | 
			
		||||
    this.accepted = alreadyAccepted;
 | 
			
		||||
@@ -55,7 +55,7 @@ public class RebaseSorter {
 | 
			
		||||
 | 
			
		||||
      CodeReviewCommit c;
 | 
			
		||||
      final List<CodeReviewCommit> contents = new ArrayList<>();
 | 
			
		||||
      while ((c = (CodeReviewCommit) rw.next()) != null) {
 | 
			
		||||
      while ((c = rw.next()) != null) {
 | 
			
		||||
        if (!c.has(canMergeFlag) || !incoming.contains(c)) {
 | 
			
		||||
          // We cannot merge n as it would bring something we
 | 
			
		||||
          // aren't permitted to merge at this time. Drop n.
 | 
			
		||||
 
 | 
			
		||||
@@ -157,9 +157,9 @@ public class CherryPick extends SubmitStrategy {
 | 
			
		||||
 | 
			
		||||
    PersonIdent committer = args.caller.newCommitterIdent(
 | 
			
		||||
        TimeUtil.nowTs(), args.serverIdent.get().getTimeZone());
 | 
			
		||||
    CodeReviewCommit newCommit =
 | 
			
		||||
        (CodeReviewCommit) args.mergeUtil.createCherryPickFromCommit(args.repo,
 | 
			
		||||
            args.inserter, mergeTip, n, committer, cherryPickCmtMsg, args.rw);
 | 
			
		||||
    CodeReviewCommit newCommit = args.mergeUtil.createCherryPickFromCommit(
 | 
			
		||||
        args.repo, args.inserter, mergeTip, n, committer, cherryPickCmtMsg,
 | 
			
		||||
        args.rw);
 | 
			
		||||
 | 
			
		||||
    PatchSet.Id id =
 | 
			
		||||
        ChangeUtil.nextPatchSetId(args.repo, n.change().currentPatchSetId());
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,7 @@ public class RebaseIfNecessary extends SubmitStrategy {
 | 
			
		||||
            // rebaseChange.rebase() may already have copied some approvals,
 | 
			
		||||
            // use upsert, not insert, to avoid constraint violation on database
 | 
			
		||||
            args.db.patchSetApprovals().upsert(approvals);
 | 
			
		||||
            CodeReviewCommit newTip = (CodeReviewCommit) args.rw.parseCommit(
 | 
			
		||||
            CodeReviewCommit newTip = args.rw.parseCommit(
 | 
			
		||||
                ObjectId.fromString(newPatchSet.getRevision().get()));
 | 
			
		||||
            mergeTip.moveTipTo(newTip, newTip);
 | 
			
		||||
            n.change().setCurrentPatchSet(
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.ApprovalsUtil;
 | 
			
		||||
import com.google.gerrit.server.IdentifiedUser;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
import com.google.gerrit.server.git.MergeException;
 | 
			
		||||
import com.google.gerrit.server.git.MergeSorter;
 | 
			
		||||
import com.google.gerrit.server.git.MergeTip;
 | 
			
		||||
@@ -37,7 +38,6 @@ import org.eclipse.jgit.lib.RefUpdate.Result;
 | 
			
		||||
import org.eclipse.jgit.lib.Repository;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevFlag;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
@@ -58,7 +58,7 @@ public abstract class SubmitStrategy {
 | 
			
		||||
    protected final ChangeControl.GenericFactory changeControlFactory;
 | 
			
		||||
 | 
			
		||||
    protected final Repository repo;
 | 
			
		||||
    protected final RevWalk rw;
 | 
			
		||||
    protected final CodeReviewRevWalk rw;
 | 
			
		||||
    protected final ObjectInserter inserter;
 | 
			
		||||
    protected final RevFlag canMergeFlag;
 | 
			
		||||
    protected final Set<RevCommit> alreadyAccepted;
 | 
			
		||||
@@ -72,7 +72,7 @@ public abstract class SubmitStrategy {
 | 
			
		||||
    Arguments(IdentifiedUser.GenericFactory identifiedUserFactory,
 | 
			
		||||
        Provider<PersonIdent> serverIdent, ReviewDb db,
 | 
			
		||||
        ChangeControl.GenericFactory changeControlFactory, Repository repo,
 | 
			
		||||
        RevWalk rw, ObjectInserter inserter, RevFlag canMergeFlag,
 | 
			
		||||
        CodeReviewRevWalk rw, ObjectInserter inserter, RevFlag canMergeFlag,
 | 
			
		||||
        Set<RevCommit> alreadyAccepted, Branch.NameKey destBranch,
 | 
			
		||||
        ApprovalsUtil approvalsUtil, MergeUtil mergeUtil,
 | 
			
		||||
        ChangeIndexer indexer, IdentifiedUser caller) {
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@ import com.google.gerrit.server.GerritPersonIdent;
 | 
			
		||||
import com.google.gerrit.server.IdentifiedUser;
 | 
			
		||||
import com.google.gerrit.server.change.RebaseChange;
 | 
			
		||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
import com.google.gerrit.server.git.MergeException;
 | 
			
		||||
import com.google.gerrit.server.git.MergeUtil;
 | 
			
		||||
import com.google.gerrit.server.index.ChangeIndexer;
 | 
			
		||||
@@ -39,7 +40,6 @@ import org.eclipse.jgit.lib.PersonIdent;
 | 
			
		||||
import org.eclipse.jgit.lib.Repository;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevFlag;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
@@ -85,16 +85,15 @@ public class SubmitStrategyFactory {
 | 
			
		||||
    this.indexer = indexer;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public SubmitStrategy create(final SubmitType submitType, final ReviewDb db,
 | 
			
		||||
      final Repository repo, final RevWalk rw, final ObjectInserter inserter,
 | 
			
		||||
      final RevFlag canMergeFlag, final Set<RevCommit> alreadyAccepted,
 | 
			
		||||
      final Branch.NameKey destBranch, final IdentifiedUser caller)
 | 
			
		||||
  public SubmitStrategy create(SubmitType submitType, ReviewDb db,
 | 
			
		||||
      Repository repo, CodeReviewRevWalk rw, ObjectInserter inserter,
 | 
			
		||||
      RevFlag canMergeFlag, Set<RevCommit> alreadyAccepted,
 | 
			
		||||
      Branch.NameKey destBranch, IdentifiedUser caller)
 | 
			
		||||
      throws MergeException, NoSuchProjectException {
 | 
			
		||||
    ProjectState project = getProject(destBranch);
 | 
			
		||||
    final SubmitStrategy.Arguments args =
 | 
			
		||||
        new SubmitStrategy.Arguments(identifiedUserFactory, myIdent, db,
 | 
			
		||||
            changeControlFactory, repo, rw, inserter, canMergeFlag,
 | 
			
		||||
            alreadyAccepted, destBranch,approvalsUtil,
 | 
			
		||||
    SubmitStrategy.Arguments args = new SubmitStrategy.Arguments(
 | 
			
		||||
        identifiedUserFactory, myIdent, db, changeControlFactory, repo, rw,
 | 
			
		||||
        inserter, canMergeFlag, alreadyAccepted, destBranch,approvalsUtil,
 | 
			
		||||
        mergeUtilFactory.create(project), indexer, caller);
 | 
			
		||||
    switch (submitType) {
 | 
			
		||||
      case CHERRY_PICK:
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.client.SubmitType;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit;
 | 
			
		||||
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
 | 
			
		||||
import com.google.gerrit.server.git.MergeException;
 | 
			
		||||
import com.google.gerrit.server.git.strategy.SubmitStrategy;
 | 
			
		||||
import com.google.gerrit.server.project.NoSuchProjectException;
 | 
			
		||||
@@ -109,17 +110,15 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
 | 
			
		||||
          }
 | 
			
		||||
          try (Repository repo =
 | 
			
		||||
                args.repoManager.openRepository(otherChange.getProject());
 | 
			
		||||
              RevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
 | 
			
		||||
              CodeReviewRevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
 | 
			
		||||
            RevFlag canMergeFlag = rw.newFlag("CAN_MERGE");
 | 
			
		||||
            CodeReviewCommit commit =
 | 
			
		||||
                (CodeReviewCommit) rw.parseCommit(changeDataCache.getTestAgainst());
 | 
			
		||||
            SubmitStrategy strategy =
 | 
			
		||||
                args.submitStrategyFactory.create(submitType,
 | 
			
		||||
                    db.get(), repo, rw, null, canMergeFlag,
 | 
			
		||||
                    getAlreadyAccepted(repo, rw, commit),
 | 
			
		||||
                    otherChange.getDest(), null);
 | 
			
		||||
            CodeReviewCommit otherCommit =
 | 
			
		||||
                (CodeReviewCommit) rw.parseCommit(other);
 | 
			
		||||
                rw.parseCommit(changeDataCache.getTestAgainst());
 | 
			
		||||
            SubmitStrategy strategy = args.submitStrategyFactory.create(
 | 
			
		||||
                submitType, db.get(), repo, rw, null, canMergeFlag,
 | 
			
		||||
                getAlreadyAccepted(repo, rw, commit), otherChange.getDest(),
 | 
			
		||||
                null);
 | 
			
		||||
            CodeReviewCommit otherCommit = rw.parseCommit(other);
 | 
			
		||||
            otherCommit.add(canMergeFlag);
 | 
			
		||||
            conflicts = !strategy.dryRun(commit, otherCommit);
 | 
			
		||||
            args.conflictsCache.put(conflictsKey, conflicts);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user