summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorMathias Kinzler <mathias.kinzler@sap.com>2010-12-09 19:22:11 +0100
committerMathias Kinzler <mathias.kinzler@sap.com>2010-12-09 19:22:11 +0100
commit2a7cd0086bf1bd614478c5722eac5142326e6f2b (patch)
tree3f69178bce922ebbb69c5a9307bf70dfc18a5084 /org.eclipse.jgit
parent1783749e169c57cef7131e1749a01ee269b89df8 (diff)
downloadjgit-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.java44
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;
}
/**