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
@@ -1581,6 +1581,58 @@ public class RebaseCommandTest extends RepositoryTestCase { | |||
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"); |
@@ -143,6 +143,8 @@ public class RebaseCommand extends GitCommand<RebaseResult> { | |||
private static final String REBASE_HEAD = "head"; | |||
private static final String AMEND = "amend"; | |||
/** | |||
* The available operations | |||
*/ | |||
@@ -240,7 +242,12 @@ public class RebaseCommand extends GitCommand<RebaseResult> { | |||
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 | |||
@@ -331,6 +338,9 @@ public class RebaseCommand extends GitCommand<RebaseResult> { | |||
newHead = new Git(repo).commit().setMessage(newMessage) | |||
.setAmend(true).call(); | |||
continue; | |||
case EDIT: | |||
createFile(rebaseDir, AMEND, commitToPick.name()); | |||
return stop(commitToPick); | |||
} | |||
} finally { | |||
monitor.endTask(); | |||
@@ -1070,7 +1080,9 @@ public class RebaseCommand extends GitCommand<RebaseResult> { | |||
/** 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; | |||
@@ -1094,13 +1106,14 @@ public class RebaseCommand extends GitCommand<RebaseResult> { | |||
} | |||
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())); | |||
} | |||
} | |||