diff options
author | Mathias Kinzler <mathias.kinzler@sap.com> | 2010-12-09 19:22:11 +0100 |
---|---|---|
committer | Mathias Kinzler <mathias.kinzler@sap.com> | 2010-12-09 19:22:11 +0100 |
commit | 2a7cd0086bf1bd614478c5722eac5142326e6f2b (patch) | |
tree | 3f69178bce922ebbb69c5a9307bf70dfc18a5084 /org.eclipse.jgit | |
parent | 1783749e169c57cef7131e1749a01ee269b89df8 (diff) | |
download | jgit-2a7cd0086bf1bd614478c5722eac5142326e6f2b.tar.gz jgit-2a7cd0086bf1bd614478c5722eac5142326e6f2b.zip |
Rebase: fix wrong update if original HEAD after Merge+Skip
Rebase would update the original HEAD to the wrong commit when
"skipping" the last commit after a merged commit.
Includes a test for the specific situation.
Change-Id: I087314b1834a3f11a4561f04ca5c21411d54d993
Signed-off-by: Mathias Kinzler <mathias.kinzler@sap.com>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java index 6629c4f8ee..70cf702ec1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java @@ -218,14 +218,12 @@ public class RebaseCommand extends GitCommand<RebaseResult> { if (this.operation == Operation.CONTINUE) newHead = continueRebase(); - List<Step> steps = loadSteps(); - - if (this.operation == Operation.SKIP && !steps.isEmpty()) - checkoutCurrentHead(); + if (this.operation == Operation.SKIP) + newHead = checkoutCurrentHead(); ObjectReader or = repo.newObjectReader(); - int stepsToPop = 0; + List<Step> steps = loadSteps(); for (Step step : steps) { if (step.action != Action.PICK) continue; @@ -250,22 +248,32 @@ public class RebaseCommand extends GitCommand<RebaseResult> { if (newHead == null) { return stop(commitToPick); } - stepsToPop++; } - if (newHead != null || steps.isEmpty()) { + if (newHead != null) { // point the previous head (if any) to the new commit String headName = readFile(rebaseDir, HEAD_NAME); if (headName.startsWith(Constants.R_REFS)) { RefUpdate rup = repo.updateRef(headName); - if (newHead != null) { - rup.setNewObjectId(newHead); - rup.forceUpdate(); + rup.setNewObjectId(newHead); + Result res = rup.forceUpdate(); + switch (res) { + case FAST_FORWARD: + case FORCED: + case NO_CHANGE: + break; + default: + throw new JGitInternalException("Updating HEAD failed"); } rup = repo.updateRef(Constants.HEAD); - rup.link(headName); - } - if (this.operation == Operation.SKIP && steps.isEmpty()) { - checkoutCurrentHead(); + res = rup.link(headName); + switch (res) { + case FAST_FORWARD: + case FORCED: + case NO_CHANGE: + break; + default: + throw new JGitInternalException("Updating HEAD failed"); + } } FileUtils.delete(rebaseDir, FileUtils.RECURSIVE); return new RebaseResult(Status.OK); @@ -276,8 +284,8 @@ public class RebaseCommand extends GitCommand<RebaseResult> { } } - private void checkoutCurrentHead() throws IOException, NoHeadException, - JGitInternalException { + private RevCommit checkoutCurrentHead() throws IOException, + NoHeadException, JGitInternalException { ObjectId headTree = repo.resolve(Constants.HEAD + "^{tree}"); if (headTree == null) throw new NoHeadException( @@ -299,6 +307,10 @@ public class RebaseCommand extends GitCommand<RebaseResult> { } finally { dc.unlock(); } + RevWalk rw = new RevWalk(repo); + RevCommit commit = rw.parseCommit(repo.resolve(Constants.HEAD)); + rw.release(); + return commit; } /** |