import org.eclipse.jgit.api.MergeResult.MergeStatus;
import org.eclipse.jgit.api.errors.InvalidMergeHeadsException;
import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
assertEquals(MergeStatus.ABORTED, result.getMergeStatus());
}
+
+ @Test
+ public void testRecursiveMergeWithConflict() throws Exception {
+ TestRepository<Repository> db_t = new TestRepository<Repository>(db);
+ BranchBuilder master = db_t.branch("master");
+ RevCommit m0 = master.commit().add("f", "1\n2\n3\n4\n5\n6\n7\n8\n9\n")
+ .message("m0").create();
+ RevCommit m1 = master.commit()
+ .add("f", "1-master\n2\n3\n4\n5\n6\n7\n8\n9\n").message("m1")
+ .create();
+ db_t.getRevWalk().parseCommit(m1);
+
+ BranchBuilder side = db_t.branch("side");
+ RevCommit s1 = side.commit().parent(m0)
+ .add("f", "1\n2\n3\n4\n5\n6\n7\n8\n9-side\n").message("s1")
+ .create();
+ RevCommit s2 = side.commit().parent(m1)
+ .add("f", "1-master\n2\n3\n4\n5\n6\n7-res(side)\n8\n9-side\n")
+ .message("s2(merge)").create();
+ master.commit().parent(s1)
+ .add("f", "1-master\n2\n3\n4\n5\n6\n7-conflict\n8\n9-side\n")
+ .message("m2(merge)").create();
+
+ Git git = Git.wrap(db);
+ git.checkout().setName("master").call();
+
+ MergeResult result = git.merge().setStrategy(MergeStrategy.RECURSIVE)
+ .include("side", s2).call();
+ assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus());
+ }
+
private static void setExecutable(Git git, String path, boolean executable) {
FS.DETECTED.setExecute(
new File(git.getRepository().getWorkTree(), path), executable);
if (failingPaths != null) {
repo.writeMergeCommitMsg(null);
repo.writeMergeHeads(null);
- return new MergeResult(null,
- merger.getBaseCommit(0, 1),
+ return new MergeResult(null, merger.getBaseCommitId(),
new ObjectId[] {
headCommit.getId(), srcCommit.getId() },
MergeStatus.FAILED, mergeStrategy,
.formatWithConflicts(mergeMessage,
unmergedPaths);
repo.writeMergeCommitMsg(mergeMessageWithConflicts);
- return new MergeResult(null,
- merger.getBaseCommit(0, 1),
+ return new MergeResult(null, merger.getBaseCommitId(),
new ObjectId[] { headCommit.getId(),
srcCommit.getId() },
MergeStatus.CONFLICTING, mergeStrategy,
.getFailingPaths();
if (failingPaths != null)
failingResult = new MergeResult(null,
- merger.getBaseCommit(0, 1),
+ merger.getBaseCommitId(),
new ObjectId[] { headCommit.getId(),
srcParent.getId() },
MergeStatus.FAILED, MergeStrategy.RECURSIVE,
merger.getMergeResults(), failingPaths, null);
else
failingResult = new MergeResult(null,
- merger.getBaseCommit(0, 1),
+ merger.getBaseCommitId(),
new ObjectId[] { headCommit.getId(),
srcParent.getId() },
MergeStatus.CONFLICTING,
/*
- * Copyright (C) 2008-2009, Google Inc.
+ * Copyright (C) 2008-2013, Google Inc.
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.filter.RevFilter;
import org.eclipse.jgit.treewalk.AbstractTreeIterator;
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
-import org.eclipse.jgit.treewalk.EmptyTreeIterator;
/**
* Instance of a specific {@link MergeStrategy} for a single {@link Repository}.
}
/**
- * Create an iterator to walk the merge base of two commits.
- *
- * @param a
- * the first commit in {@link #sourceObjects}.
- * @param b
- * the second commit in {@link #sourceObjects}.
- * @return the new iterator
- * @throws IncorrectObjectTypeException
- * one of the input objects is not a commit.
- * @throws IOException
- * objects are missing or multiple merge bases were found.
- * @since 3.0
+ * @return the ID of the commit that was used as merge base for merging, or
+ * null if no merge base was used or it was set manually
+ * @since 3.2
*/
- protected AbstractTreeIterator mergeBase(RevCommit a, RevCommit b)
- throws IOException {
- RevCommit base = getBaseCommit(a, b);
- return (base == null) ? new EmptyTreeIterator() : openTree(base.getTree());
- }
+ public abstract ObjectId getBaseCommitId();
/**
* Return the merge base of two commits.
* one of the input objects is not a commit.
* @throws IOException
* objects are missing or multiple merge bases were found.
+ * @deprecated use {@link #getBaseCommitId()} instead, as that does not
+ * require walking the commits again
*/
+ @Deprecated
public RevCommit getBaseCommit(final int aIdx, final int bIdx)
throws IncorrectObjectTypeException,
IOException {
public ObjectId getResultTreeId() {
return sourceTrees[treeIndex];
}
+
+ @Override
+ public ObjectId getBaseCommitId() {
+ return null;
+ }
}
}
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.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.treewalk.AbstractTreeIterator;
+import org.eclipse.jgit.treewalk.EmptyTreeIterator;
/** A merge of 2 trees, using a common base ancestor tree. */
public abstract class ThreeWayMerger extends Merger {
private RevTree baseTree;
+ private ObjectId baseCommitId;
+
/**
* Create a new merge instance for a repository.
*
return super.merge(tips);
}
+ @Override
+ public ObjectId getBaseCommitId() {
+ return baseCommitId;
+ }
+
/**
* Create an iterator to walk the merge base.
*
protected AbstractTreeIterator mergeBase() throws IOException {
if (baseTree != null)
return openTree(baseTree);
- return mergeBase(sourceCommits[0], sourceCommits[1]);
+ RevCommit baseCommit = (baseCommitId != null) ? walk
+ .parseCommit(baseCommitId) : getBaseCommit(sourceCommits[0],
+ sourceCommits[1]);
+ if (baseCommit == null) {
+ baseCommitId = null;
+ return new EmptyTreeIterator();
+ } else {
+ baseCommitId = baseCommit.toObjectId();
+ return openTree(baseCommit.getTree());
+ }
}
}