assertEquals("rewritten commit message", actualCommitMag);
}
+ @Test
+ public void testRebaseInteractiveEdit() throws Exception {
+ // create file1 on master
+ writeTrashFile(FILE1, FILE1);
+ git.add().addFilepattern(FILE1).call();
+ git.commit().setMessage("Add file1").call();
+ assertTrue(new File(db.getWorkTree(), FILE1).exists());
+
+ // create file2 on master
+ writeTrashFile("file2", "file2");
+ git.add().addFilepattern("file2").call();
+ git.commit().setMessage("Add file2").call();
+ assertTrue(new File(db.getWorkTree(), "file2").exists());
+
+ // update FILE1 on master
+ writeTrashFile(FILE1, "blah");
+ git.add().addFilepattern(FILE1).call();
+ git.commit().setMessage("updated file1 on master").call();
+
+ writeTrashFile("file2", "more change");
+ git.add().addFilepattern("file2").call();
+ git.commit().setMessage("update file2 on side").call();
+
+ RebaseResult res = git.rebase().setUpstream("HEAD~2")
+ .runInteractively(new InteractiveHandler() {
+ public void prepareSteps(List<Step> steps) {
+ steps.get(0).action = Action.EDIT;
+ }
+
+ public String modifyCommitMessage(String commit) {
+ return ""; // not used
+ }
+ }).call();
+ assertEquals(Status.STOPPED, res.getStatus());
+ RevCommit toBeEditted = git.log().call().iterator().next();
+ assertEquals("updated file1 on master", toBeEditted.getFullMessage());
+
+ // change file and commit with new commit message
+ writeTrashFile("file1", "edited");
+ git.commit().setAll(true).setAmend(true)
+ .setMessage("edited commit message").call();
+ // resume rebase
+ res = git.rebase().setOperation(Operation.CONTINUE).call();
+
+ checkFile(new File(db.getWorkTree(), "file1"), "edited");
+ assertEquals(Status.OK, res.getStatus());
+ Iterator<RevCommit> logIterator = git.log().all().call().iterator();
+ logIterator.next(); // skip first commit;
+ String actualCommitMag = logIterator.next().getShortMessage();
+ assertEquals("edited commit message", actualCommitMag);
+ }
+
private File getTodoFile() {
File todoFile = new File(db.getDirectory(),
"rebase-merge/git-rebase-todo");
private static final String REBASE_HEAD = "head";
+ private static final String AMEND = "amend";
+
/**
* The available operations
*/
if (operation == Operation.CONTINUE) {
newHead = continueRebase();
- if (newHead == null) {
+ File amendFile = new File(rebaseDir, AMEND);
+ boolean amendExists = amendFile.exists();
+ if (amendExists) {
+ FileUtils.delete(amendFile);
+ }
+ if (newHead == null && !amendExists) {
// 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
newHead = new Git(repo).commit().setMessage(newMessage)
.setAmend(true).call();
continue;
+ case EDIT:
+ createFile(rebaseDir, AMEND, commitToPick.name());
+ return stop(commitToPick);
}
} finally {
monitor.endTask();
/** Use commit */
PICK("pick", "p"),
/** Use commit, but edit the commit message */
- REWORD("reword", "r"); // later add SQUASH, EDIT, etc.
+ REWORD("reword", "r"),
+ /** Use commit, but stop for amending */
+ EDIT("edit", "e"); // later add SQUASH, FIXUP, etc.
private final String token;
}
static Action parse(String token) {
- if (token.equals(PICK.token) || token.equals(PICK.shortToken))
- return PICK;
- if (token.equals(REWORD.token) || token.equals(REWORD.shortToken))
- return REWORD;
+ for (Action action : Action.values()) {
+ if (action.token.equals(token)
+ || action.shortToken.equals(token))
+ return action;
+ }
throw new JGitInternalException(MessageFormat.format(
JGitText.get().unknownOrUnsupportedCommand, token,
- PICK.toToken()));
+ Action.values()));
}
}