MergeUtil: Use InMemoryInserter for dry runs
As in Ifd9d768d, making flush a no-op is not sufficient to ensure nothing gets written to the repo. Change-Id: If08e8184b484a0e7ba41fd3e11130d6fb26ed6c6
This commit is contained in:
		@@ -28,6 +28,7 @@ import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.cache.CacheModule;
 | 
			
		||||
import com.google.gerrit.server.config.GerritServerConfig;
 | 
			
		||||
import com.google.gerrit.server.git.GitRepositoryManager;
 | 
			
		||||
import com.google.gerrit.server.git.InMemoryInserter;
 | 
			
		||||
import com.google.gerrit.server.git.MergeUtil;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectCache;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectState;
 | 
			
		||||
@@ -40,6 +41,7 @@ import com.google.inject.name.Named;
 | 
			
		||||
import org.eclipse.jgit.errors.LargeObjectException;
 | 
			
		||||
import org.eclipse.jgit.lib.Config;
 | 
			
		||||
import org.eclipse.jgit.lib.ObjectId;
 | 
			
		||||
import org.eclipse.jgit.lib.ObjectInserter;
 | 
			
		||||
import org.eclipse.jgit.lib.Repository;
 | 
			
		||||
import org.eclipse.jgit.merge.ThreeWayMerger;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
@@ -221,10 +223,10 @@ public class ChangeKindCacheImpl implements ChangeKindCache {
 | 
			
		||||
        // A trivial rebase can be detected by looking for the next commit
 | 
			
		||||
        // having the same tree as would exist when the prior commit is
 | 
			
		||||
        // cherry-picked onto the next commit's new first parent.
 | 
			
		||||
        ThreeWayMerger merger = MergeUtil.newThreeWayMerger(
 | 
			
		||||
            repo, MergeUtil.createDryRunInserter(repo), key.strategyName);
 | 
			
		||||
        merger.setBase(prior.getParent(0));
 | 
			
		||||
        try {
 | 
			
		||||
        try (ObjectInserter ins = new InMemoryInserter(repo)) {
 | 
			
		||||
          ThreeWayMerger merger =
 | 
			
		||||
              MergeUtil.newThreeWayMerger(repo, ins, key.strategyName);
 | 
			
		||||
          merger.setBase(prior.getParent(0));
 | 
			
		||||
          if (merger.merge(next.getParent(0), prior)
 | 
			
		||||
              && merger.getResultTreeId().equals(next.getTree())) {
 | 
			
		||||
            if (prior.getParentCount() == 1) {
 | 
			
		||||
 
 | 
			
		||||
@@ -68,12 +68,10 @@ 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.eclipse.jgit.transport.PackParser;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
@@ -361,9 +359,9 @@ public class MergeUtil {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ThreeWayMerger m = newThreeWayMerger(repo, createDryRunInserter(repo));
 | 
			
		||||
    try {
 | 
			
		||||
      return m.merge(new AnyObjectId[] {mergeTip, toMerge});
 | 
			
		||||
    try (ObjectInserter ins = new InMemoryInserter(repo)) {
 | 
			
		||||
      return newThreeWayMerger(repo, ins)
 | 
			
		||||
          .merge(new AnyObjectId[] {mergeTip, toMerge});
 | 
			
		||||
    } catch (LargeObjectException e) {
 | 
			
		||||
      log.warn("Cannot merge due to LargeObjectException: " + toMerge.name());
 | 
			
		||||
      return false;
 | 
			
		||||
@@ -409,8 +407,8 @@ public class MergeUtil {
 | 
			
		||||
      // taking the delta relative to that one parent and redoing
 | 
			
		||||
      // that on the current merge tip.
 | 
			
		||||
      //
 | 
			
		||||
      try {
 | 
			
		||||
        ThreeWayMerger m = newThreeWayMerger(repo, createDryRunInserter(repo));
 | 
			
		||||
      try (ObjectInserter ins = new InMemoryInserter(repo)) {
 | 
			
		||||
        ThreeWayMerger m = newThreeWayMerger(repo, ins);
 | 
			
		||||
        m.setBase(toMerge.getParent(0));
 | 
			
		||||
        return m.merge(mergeTip, toMerge);
 | 
			
		||||
      } catch (IOException e) {
 | 
			
		||||
@@ -437,26 +435,6 @@ public class MergeUtil {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static ObjectInserter createDryRunInserter(Repository db) {
 | 
			
		||||
    final ObjectInserter delegate = db.newObjectInserter();
 | 
			
		||||
    return new ObjectInserter.Filter() {
 | 
			
		||||
      @Override
 | 
			
		||||
      protected ObjectInserter delegate() {
 | 
			
		||||
        return delegate;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @Override
 | 
			
		||||
      public PackParser newPackParser(InputStream in) throws IOException {
 | 
			
		||||
        throw new UnsupportedOperationException();
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @Override
 | 
			
		||||
      public void flush() throws IOException {
 | 
			
		||||
        // Do nothing.
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public CodeReviewCommit mergeOneCommit(PersonIdent author,
 | 
			
		||||
      PersonIdent committer, Repository repo, CodeReviewRevWalk rw,
 | 
			
		||||
      ObjectInserter inserter, Branch.NameKey destBranch,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user