]> source.dussan.org Git - jgit.git/commitdiff
Add support for rebase interactive 'edit' command 81/7881/5
authorDariusz Luksza <dariusz@luksza.org>
Wed, 3 Oct 2012 08:01:54 +0000 (10:01 +0200)
committerChris Aniszczyk <zx@twitter.com>
Mon, 19 Nov 2012 16:02:25 +0000 (10:02 -0600)
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>
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java

index 07ce7606b185ba49b94995eec2f96277ce985f0a..ba97e905b3226f63daf4b8ea39fcb62658158161 100644 (file)
@@ -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");
index ece861f7f55c22fde63c5f2011d70d06a6c3fa3f..3f99057f9fbcc5b3a8bddb4597e40bf92d1f77a4 100644 (file)
@@ -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()));
                }
        }