]> source.dussan.org Git - jgit.git/commitdiff
Rebase interactive should finish if last step is edit 16/18116/1
authorStefan Lay <stefan.lay@sap.com>
Wed, 6 Nov 2013 08:43:31 +0000 (09:43 +0100)
committerStefan Lay <stefan.lay@sap.com>
Wed, 6 Nov 2013 08:43:31 +0000 (09:43 +0100)
When the last step was an edit step, rebase interactive did not finish
after continuing the rebase. Instead, it returned with the status
FAST_FORWARD.

Change-Id: Ib19857474ac089dfeaae665ad5e95c66c21099b0

org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java

index eb6c5f0a6b48388c2ccff534b903109add2a692f..531e1b0e2c352b9588ffd5eb8ec2434be30e8e5a 100644 (file)
@@ -2294,6 +2294,39 @@ public class RebaseCommandTest extends RepositoryTestCase {
                                }).call();
        }
 
+       @Test
+       public void testRebaseEndsIfLastStepIsEdit() throws Exception {
+               // create file1 on master
+               writeTrashFile(FILE1, FILE1);
+               git.add().addFilepattern(FILE1).call();
+               git.commit().setMessage("Add file1\nnew line").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\nnew line").call();
+               assertTrue(new File(db.getWorkTree(), "file2").exists());
+
+               git.rebase().setUpstream("HEAD~1")
+                               .runInteractively(new InteractiveHandler() {
+
+                                       public void prepareSteps(List<RebaseTodoLine> steps) {
+                                               steps.get(0).setAction(Action.EDIT);
+                                       }
+
+                                       public String modifyCommitMessage(String commit) {
+                                               return commit;
+                                       }
+                               }).call();
+               git.commit().setAmend(true)
+                               .setMessage("Add file2\nnew line\nanother line").call();
+               RebaseResult result = git.rebase().setOperation(Operation.CONTINUE)
+                               .call();
+               assertEquals(Status.OK, result.getStatus());
+
+       }
+
        private File getTodoFile() {
                File todoFile = new File(db.getDirectory(), GIT_REBASE_TODO);
                return todoFile;
index ef739bb050d70f17f64cf773b4b9804fe646b0ea..ea48688ff92495129ebb8a995c1d6cf3b26eacb4 100644 (file)
@@ -284,6 +284,9 @@ public class RebaseCommand extends GitCommand<RebaseResult> {
 
                        List<RebaseTodoLine> steps = repo.readRebaseTodo(
                                        rebaseState.getPath(GIT_REBASE_TODO), false);
+                       if (steps.size() == 0) {
+                               return finishRebase(walk.parseCommit(repo.resolve(Constants.HEAD)), false);
+                       }
                        if (isInteractive()) {
                                interactiveHandler.prepareSteps(steps);
                                repo.writeRebaseTodoFile(rebaseState.getPath(GIT_REBASE_TODO),
@@ -370,15 +373,7 @@ public class RebaseCommand extends GitCommand<RebaseResult> {
                                        monitor.endTask();
                                }
                        }
-                       if (newHead != null) {
-                               String headName = rebaseState.readFile(HEAD_NAME);
-                               updateHead(headName, newHead, upstreamCommit);
-                               FileUtils.delete(rebaseState.getDir(), FileUtils.RECURSIVE);
-                               if (lastStepWasForward)
-                                       return RebaseResult.FAST_FORWARD_RESULT;
-                               return RebaseResult.OK_RESULT;
-                       }
-                       return RebaseResult.FAST_FORWARD_RESULT;
+                       return finishRebase(newHead, lastStepWasForward);
                } catch (CheckoutConflictException cce) {
                        return new RebaseResult(cce.getConflictingPaths());
                } catch (IOException ioe) {
@@ -386,6 +381,16 @@ public class RebaseCommand extends GitCommand<RebaseResult> {
                }
        }
 
+       private RebaseResult finishRebase(RevCommit newHead,
+                       boolean lastStepWasForward) throws IOException {
+               String headName = rebaseState.readFile(HEAD_NAME);
+               updateHead(headName, newHead, upstreamCommit);
+               FileUtils.delete(rebaseState.getDir(), FileUtils.RECURSIVE);
+               if (lastStepWasForward || newHead == null)
+                       return RebaseResult.FAST_FORWARD_RESULT;
+               return RebaseResult.OK_RESULT;
+       }
+
        private void checkSteps(List<RebaseTodoLine> steps)
                        throws InvalidRebaseStepException, IOException {
                if (steps.isEmpty())