}
@Test
- @SuppressWarnings("null")
public void testRebaseWithUnstagedTopicChange() throws Exception {
// create file1, add and commit
writeTrashFile(FILE1, "file1");
writeTrashFile("file2", "unstaged file2");
// rebase
- JGitInternalException exception = null;
- try {
- git.rebase().setUpstream("refs/heads/master").call();
- } catch (JGitInternalException e) {
- exception = e;
- }
- assertNotNull(exception);
- assertEquals("Checkout conflict with files: \nfile2",
- exception.getMessage());
+ RebaseResult result = git.rebase().setUpstream("refs/heads/master")
+ .call();
+ assertEquals(Status.CONFLICTS, result.getStatus());
+ assertEquals(1, result.getConflicts().size());
+ assertEquals("file2", result.getConflicts().get(0));
}
@Test
- @SuppressWarnings("null")
public void testRebaseWithUncommittedTopicChange() throws Exception {
// create file1, add and commit
writeTrashFile(FILE1, "file1");
git.add().addFilepattern("file2").call();
// do not commit
- // rebase
- JGitInternalException exception = null;
- try {
- git.rebase().setUpstream("refs/heads/master").call();
- } catch (JGitInternalException e) {
- exception = e;
- }
- assertNotNull(exception);
- assertEquals("Checkout conflict with files: \nfile2",
- exception.getMessage());
+ RebaseResult result = git.rebase().setUpstream("refs/heads/master")
+ .call();
+ assertEquals(Status.CONFLICTS, result.getStatus());
+ assertEquals(1, result.getConflicts().size());
+ assertEquals("file2", result.getConflicts().get(0));
checkFile(uncommittedFile, "uncommitted file2");
assertEquals(RepositoryState.SAFE, git.getRepository().getRepositoryState());
}
@Test
- @SuppressWarnings("null")
public void testRebaseWithUnstagedMasterChange() throws Exception {
// create file1, add and commit
writeTrashFile(FILE1, "file1");
writeTrashFile(FILE1, "unstaged modified file1");
// rebase
- JGitInternalException exception = null;
- try {
- git.rebase().setUpstream("refs/heads/master").call();
- } catch (JGitInternalException e) {
- exception = e;
- }
- assertNotNull(exception);
- assertEquals("Checkout conflict with files: \nfile1",
- exception.getMessage());
+ RebaseResult result = git.rebase().setUpstream("refs/heads/master")
+ .call();
+ assertEquals(Status.CONFLICTS, result.getStatus());
+ assertEquals(1, result.getConflicts().size());
+ assertEquals(FILE1, result.getConflicts().get(0));
}
@Test
- @SuppressWarnings("null")
public void testRebaseWithUncommittedMasterChange() throws Exception {
// create file1, add and commit
writeTrashFile(FILE1, "file1");
// do not commit
// rebase
- JGitInternalException exception = null;
- try {
- git.rebase().setUpstream("refs/heads/master").call();
- } catch (JGitInternalException e) {
- exception = e;
- }
- assertNotNull(exception);
- assertEquals("Checkout conflict with files: \nfile1",
- exception.getMessage());
+ RebaseResult result = git.rebase().setUpstream("refs/heads/master")
+ .call();
+ assertEquals(Status.CONFLICTS, result.getStatus());
+ assertEquals(1, result.getConflicts().size());
+ assertEquals(FILE1, result.getConflicts().get(0));
}
@Test
File theFile = writeTrashFile(FILE1, "dirty the file");
// and attempt to rebase
- try {
- RebaseResult rebaseResult = git.rebase()
+ RebaseResult rebaseResult = git.rebase()
.setUpstream("refs/heads/master").call();
- fail("Checkout with conflict should have occured, not "
- + rebaseResult.getStatus());
- } catch (JGitInternalException e) {
- checkFile(theFile, "dirty the file");
- }
+ assertEquals(Status.CONFLICTS, rebaseResult.getStatus());
+ assertEquals(1, rebaseResult.getConflicts().size());
+ assertEquals(FILE1, rebaseResult.getConflicts().get(0));
+
+ checkFile(theFile, "dirty the file");
assertEquals(RepositoryState.SAFE, git.getRepository()
.getRepositoryState());
import java.text.MessageFormat;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.eclipse.jgit.internal.JGitText;
return "Not-yet-supported";
}
+ @Override
+ public boolean isSuccessful() {
+ return false;
+ }
+ },
+ /**
+ * Status representing a checkout conflict, meaning that nothing could
+ * be merged, as the pre-scan for the trees already failed for certain
+ * files (i.e. local modifications prevent checkout of files).
+ */
+ CHECKOUT_CONFLICT {
+ public String toString() {
+ return "Checkout Conflict";
+ }
+
@Override
public boolean isSuccessful() {
return false;
private Map<String, MergeFailureReason> failingPaths;
+ private List<String> checkoutConflicts;
+
/**
* @param newHead
* the object the head points at after the merge
addConflict(result.getKey(), result.getValue());
}
+ /**
+ * Creates a new result that represents a checkout conflict before the
+ * operation even started for real.
+ *
+ * @param checkoutConflicts
+ * the conflicting files
+ */
+ public MergeResult(List<String> checkoutConflicts) {
+ this.checkoutConflicts = checkoutConflicts;
+ this.mergeStatus = MergeStatus.CHECKOUT_CONFLICT;
+ }
+
/**
* @return the object the head points at after the merge
*/
public Map<String, MergeFailureReason> getFailingPaths() {
return failingPaths;
}
+
+ /**
+ * Returns a list of paths that cause a checkout conflict. These paths
+ * prevent the operation from even starting.
+ *
+ * @return the list of files that caused the checkout conflict.
+ */
+ public List<String> getCheckoutConflicts() {
+ return checkoutConflicts;
+ }
}
return RebaseResult.OK_RESULT;
}
return RebaseResult.FAST_FORWARD_RESULT;
+ } catch (CheckoutConflictException cce) {
+ return new RebaseResult(cce.getConflictingPaths());
} catch (IOException ioe) {
throw new JGitInternalException(ioe.getMessage(), ioe);
}
return RawParseUtils.decode(content, 0, end);
}
- private boolean checkoutCommit(RevCommit commit) throws IOException {
+ private boolean checkoutCommit(RevCommit commit) throws IOException,
+ CheckoutConflictException {
try {
RevCommit head = walk.parseCommit(repo.resolve(Constants.HEAD));
DirCacheCheckout dco = new DirCacheCheckout(repo, head.getTree(),
repo.lockDirCache(), commit.getTree());
dco.setFailOnConflict(true);
- dco.checkout();
+ try {
+ dco.checkout();
+ } catch (org.eclipse.jgit.errors.CheckoutConflictException cce) {
+ throw new CheckoutConflictException(dco.getConflicts(), cce);
+ }
// update the HEAD
RefUpdate refUpdate = repo.updateRef(Constants.HEAD, true);
refUpdate.setExpectedOldObjectId(head);
*/
package org.eclipse.jgit.api;
+import java.util.List;
import java.util.Map;
import org.eclipse.jgit.merge.ResolveMerger;
return false;
}
},
+ /**
+ * Conflicts: checkout of target HEAD failed
+ */
+ CONFLICTS {
+ @Override
+ public boolean isSuccessful() {
+ return false;
+ }
+ },
/**
* Already up-to-date
*/
private Map<String, MergeFailureReason> failingPaths;
+ private List<String> conflicts;
+
private RebaseResult(Status status) {
this.status = status;
currentCommit = null;
this.failingPaths = failingPaths;
}
+ /**
+ * Create <code>RebaseResult</code> with status {@link Status#CONFLICTS}
+ *
+ * @param conflicts
+ * the list of conflicting paths
+ */
+ RebaseResult(List<String> conflicts) {
+ status = Status.CONFLICTS;
+ currentCommit = null;
+ this.conflicts = conflicts;
+ }
+
/**
* @return the overall status
*/
public Map<String, MergeFailureReason> getFailingPaths() {
return failingPaths;
}
+
+ /**
+ * @return the list of conflicts if status is {@link Status#CONFLICTS}
+ */
+ public List<String> getConflicts() {
+ return conflicts;
+ }
}