Merge "Fix rebase > continue when nothing left to commit."
This commit is contained in:
commit
d725ecb80e
|
@ -502,6 +502,55 @@ public void testStopOnConflictAndContinue() throws Exception {
|
||||||
.getFullMessage());
|
.getFullMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStopOnConflictAndContinueWithNoDeltaToMaster()
|
||||||
|
throws Exception {
|
||||||
|
// create file1 on master
|
||||||
|
RevCommit firstInMaster = writeFileAndCommit(FILE1, "Add file1", "1",
|
||||||
|
"2", "3");
|
||||||
|
// change in master
|
||||||
|
writeFileAndCommit(FILE1, "change file1 in master", "1master", "2", "3");
|
||||||
|
|
||||||
|
checkFile(FILE1, "1master", "2", "3");
|
||||||
|
// create a topic branch based on the first commit
|
||||||
|
createBranch(firstInMaster, "refs/heads/topic");
|
||||||
|
checkoutBranch("refs/heads/topic");
|
||||||
|
// we have the old content again
|
||||||
|
checkFile(FILE1, "1", "2", "3");
|
||||||
|
|
||||||
|
// change first line (conflicting)
|
||||||
|
writeFileAndCommit(FILE1,
|
||||||
|
"change file1 in topic\n\nThis is conflicting", "1topic", "2",
|
||||||
|
"3", "4topic");
|
||||||
|
|
||||||
|
RebaseResult res = git.rebase().setUpstream("refs/heads/master").call();
|
||||||
|
assertEquals(Status.STOPPED, res.getStatus());
|
||||||
|
|
||||||
|
// continue should throw a meaningful exception
|
||||||
|
try {
|
||||||
|
res = git.rebase().setOperation(Operation.CONTINUE).call();
|
||||||
|
fail("Expected Exception not thrown");
|
||||||
|
} catch (UnmergedPathsException e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge the file; the second topic commit should go through
|
||||||
|
writeFileAndAdd(FILE1, "1master", "2", "3");
|
||||||
|
|
||||||
|
res = git.rebase().setOperation(Operation.CONTINUE).call();
|
||||||
|
assertNotNull(res);
|
||||||
|
assertEquals(Status.NOTHING_TO_COMMIT, res.getStatus());
|
||||||
|
assertEquals(RepositoryState.REBASING_INTERACTIVE,
|
||||||
|
db.getRepositoryState());
|
||||||
|
|
||||||
|
git.rebase().setOperation(Operation.SKIP).call();
|
||||||
|
|
||||||
|
ObjectId headId = db.resolve(Constants.HEAD);
|
||||||
|
RevWalk rw = new RevWalk(db);
|
||||||
|
RevCommit rc = rw.parseCommit(headId);
|
||||||
|
assertEquals("change file1 in master", rc.getFullMessage());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStopOnConflictAndFailContinueIfFileIsDirty()
|
public void testStopOnConflictAndFailContinueIfFileIsDirty()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
|
@ -775,8 +824,15 @@ public void testStopOnConflictCommitAndContinue() throws Exception {
|
||||||
|
|
||||||
res = git.rebase().setOperation(Operation.CONTINUE).call();
|
res = git.rebase().setOperation(Operation.CONTINUE).call();
|
||||||
assertNotNull(res);
|
assertNotNull(res);
|
||||||
assertEquals(Status.OK, res.getStatus());
|
|
||||||
assertEquals(RepositoryState.SAFE, db.getRepositoryState());
|
// nothing to commit. this leaves the repo state in rebase, so that the
|
||||||
|
// user can decide what to do. if he accidentally committed, reset soft,
|
||||||
|
// and continue, if he really has nothing to commit, skip.
|
||||||
|
assertEquals(Status.NOTHING_TO_COMMIT, res.getStatus());
|
||||||
|
assertEquals(RepositoryState.REBASING_INTERACTIVE,
|
||||||
|
db.getRepositoryState());
|
||||||
|
|
||||||
|
git.rebase().setOperation(Operation.SKIP).call();
|
||||||
|
|
||||||
ObjectId headId = db.resolve(Constants.HEAD);
|
ObjectId headId = db.resolve(Constants.HEAD);
|
||||||
RevWalk rw = new RevWalk(db);
|
RevWalk rw = new RevWalk(db);
|
||||||
|
|
|
@ -220,9 +220,19 @@ public RebaseResult call() throws NoHeadException, RefNotFoundException,
|
||||||
if (monitor.isCancelled())
|
if (monitor.isCancelled())
|
||||||
return abort(RebaseResult.ABORTED_RESULT);
|
return abort(RebaseResult.ABORTED_RESULT);
|
||||||
|
|
||||||
if (operation == Operation.CONTINUE)
|
if (operation == Operation.CONTINUE) {
|
||||||
newHead = continueRebase();
|
newHead = continueRebase();
|
||||||
|
|
||||||
|
if (newHead == null) {
|
||||||
|
// continueRebase() returns null only if no commit was
|
||||||
|
// neccessary. This means that no changes where left over
|
||||||
|
// after resolving all conflicts. In this case, cgit stops
|
||||||
|
// and displays a nice message to the user, telling him to
|
||||||
|
// either do changes or skip the commit instead of continue.
|
||||||
|
return RebaseResult.NOTHING_TO_COMMIT_RESULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (operation == Operation.SKIP)
|
if (operation == Operation.SKIP)
|
||||||
newHead = checkoutCurrentHead();
|
newHead = checkoutCurrentHead();
|
||||||
|
|
||||||
|
|
|
@ -109,6 +109,16 @@ public boolean isSuccessful() {
|
||||||
public boolean isSuccessful() {
|
public boolean isSuccessful() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Continue with nothing left to commit (possibly want skip).
|
||||||
|
*/
|
||||||
|
NOTHING_TO_COMMIT {
|
||||||
|
@Override
|
||||||
|
public boolean isSuccessful() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -127,6 +137,9 @@ public boolean isSuccessful() {
|
||||||
static final RebaseResult FAST_FORWARD_RESULT = new RebaseResult(
|
static final RebaseResult FAST_FORWARD_RESULT = new RebaseResult(
|
||||||
Status.FAST_FORWARD);
|
Status.FAST_FORWARD);
|
||||||
|
|
||||||
|
static final RebaseResult NOTHING_TO_COMMIT_RESULT = new RebaseResult(
|
||||||
|
Status.NOTHING_TO_COMMIT);
|
||||||
|
|
||||||
private final Status status;
|
private final Status status;
|
||||||
|
|
||||||
private final RevCommit currentCommit;
|
private final RevCommit currentCommit;
|
||||||
|
|
Loading…
Reference in New Issue