The 'edit' command allows you to change arbitrary commit content and the message of any commit in the repository. Bug: 394577 Change-Id: I43a44782cdb10b29f13784fa75ab37fe5d4da01b Signed-off-by: Dariusz Luksza <dariusz@luksza.org> Signed-off-by: Chris Aniszczyk <zx@twitter.com>tags/v2.2.0.201212191850-r
assertEquals("rewritten commit message", actualCommitMag); | 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() { | private File getTodoFile() { | ||||
File todoFile = new File(db.getDirectory(), | File todoFile = new File(db.getDirectory(), | ||||
"rebase-merge/git-rebase-todo"); | "rebase-merge/git-rebase-todo"); |
private static final String REBASE_HEAD = "head"; | private static final String REBASE_HEAD = "head"; | ||||
private static final String AMEND = "amend"; | |||||
/** | /** | ||||
* The available operations | * The available operations | ||||
*/ | */ | ||||
if (operation == Operation.CONTINUE) { | if (operation == Operation.CONTINUE) { | ||||
newHead = continueRebase(); | 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 | // continueRebase() returns null only if no commit was | ||||
// neccessary. This means that no changes where left over | // neccessary. This means that no changes where left over | ||||
// after resolving all conflicts. In this case, cgit stops | // after resolving all conflicts. In this case, cgit stops | ||||
newHead = new Git(repo).commit().setMessage(newMessage) | newHead = new Git(repo).commit().setMessage(newMessage) | ||||
.setAmend(true).call(); | .setAmend(true).call(); | ||||
continue; | continue; | ||||
case EDIT: | |||||
createFile(rebaseDir, AMEND, commitToPick.name()); | |||||
return stop(commitToPick); | |||||
} | } | ||||
} finally { | } finally { | ||||
monitor.endTask(); | monitor.endTask(); | ||||
/** Use commit */ | /** Use commit */ | ||||
PICK("pick", "p"), | PICK("pick", "p"), | ||||
/** Use commit, but edit the commit message */ | /** 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; | private final String token; | ||||
} | } | ||||
static Action parse(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( | throw new JGitInternalException(MessageFormat.format( | ||||
JGitText.get().unknownOrUnsupportedCommand, token, | JGitText.get().unknownOrUnsupportedCommand, token, | ||||
PICK.toToken())); | |||||
Action.values())); | |||||
} | } | ||||
} | } | ||||