aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Sawicki <kevin@github.com>2012-05-10 15:56:21 -0700
committerRobin Rosenberg <robin.rosenberg@dewire.com>2012-05-31 21:52:31 +0200
commit058c74d8adcfb5ef0eed203a64b7f9ff65e87c8c (patch)
tree50046b907a23fc800fea35858f6b861e3ea6c8b1
parent9bd9d9a698a0f2adf858b5dd25d44db9af9a84d4 (diff)
downloadjgit-058c74d8adcfb5ef0eed203a64b7f9ff65e87c8c.tar.gz
jgit-058c74d8adcfb5ef0eed203a64b7f9ff65e87c8c.zip
Update ORIG_HEAD when resetting
Write the old object id from the RefUpdate to the ORIG_HEAD file after the update completes. Add two new convenience methods to Repository to read and write the ORIG_HEAD reference similar to the methods for reading/writing CHERRY_PICK_HEAD and MERGE_HEAD. Bug: 375525 Change-Id: I120b3b2cd3b1ddae88fce435285bae15cbf96f5e
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java4
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java3
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java5
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java4
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java33
5 files changed, 46 insertions, 3 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
index 648ef6f01b..cf2dead5a4 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
@@ -293,7 +293,8 @@ public class RebaseCommandTest extends RepositoryTestCase {
// change third line in topic branch
writeTrashFile(FILE1, "1\n2\n3\ntopic\n");
git.add().addFilepattern(FILE1).call();
- git.commit().setMessage("change file1 in topic").call();
+ RevCommit origHead = git.commit().setMessage("change file1 in topic")
+ .call();
RebaseResult res = git.rebase().setUpstream("refs/heads/master").call();
assertEquals(Status.OK, res.getStatus());
@@ -302,6 +303,7 @@ public class RebaseCommandTest extends RepositoryTestCase {
assertEquals("refs/heads/topic", db.getFullBranch());
assertEquals(lastMasterChange, new RevWalk(db).parseCommit(
db.resolve(Constants.HEAD)).getParent(0));
+ assertEquals(origHead, db.readOrigHead());
}
@Test
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java
index f16d436d94..0806cf0dd0 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java
@@ -149,6 +149,7 @@ public class ResetCommandTest extends RepositoryTestCase {
assertFalse(inHead(fileInIndexPath));
assertFalse(inIndex(indexFile.getName()));
assertReflog(prevHead, head);
+ assertEquals(prevHead, db.readOrigHead());
}
@Test
@@ -185,6 +186,7 @@ public class ResetCommandTest extends RepositoryTestCase {
assertFalse(inHead(fileInIndexPath));
assertTrue(inIndex(indexFile.getName()));
assertReflog(prevHead, head);
+ assertEquals(prevHead, db.readOrigHead());
}
@Test
@@ -206,6 +208,7 @@ public class ResetCommandTest extends RepositoryTestCase {
assertFalse(inIndex(indexFile.getName()));
assertReflog(prevHead, head);
+ assertEquals(prevHead, db.readOrigHead());
}
@Test
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 5b73657ea7..ecf85932e9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
@@ -575,7 +575,7 @@ public class RebaseCommand extends GitCommand<RebaseResult> {
// create the folder for the meta information
FileUtils.mkdir(rebaseDir);
- createFile(repo.getDirectory(), Constants.ORIG_HEAD, headId.name());
+ repo.writeOrigHead(headId);
createFile(rebaseDir, REBASE_HEAD, headId.name());
createFile(rebaseDir, HEAD_NAME, headName);
createFile(rebaseDir, ONTO, upstreamCommit.name());
@@ -732,7 +732,8 @@ public class RebaseCommand extends GitCommand<RebaseResult> {
private RebaseResult abort(RebaseResult result) throws IOException {
try {
- String commitId = readFile(repo.getDirectory(), Constants.ORIG_HEAD);
+ ObjectId origHead = repo.readOrigHead();
+ String commitId = origHead != null ? origHead.name() : null;
monitor.beginTask(MessageFormat.format(
JGitText.get().abortingRebase, commitId),
ProgressMonitor.UNKNOWN);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
index 2f46b7faf3..a6d425ea31 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
@@ -195,6 +195,10 @@ public class ResetCommand extends GitCommand<Ref> {
throw new JGitInternalException(MessageFormat.format(
JGitText.get().cannotLock, ru.getName()));
+ ObjectId origHead = ru.getOldObjectId();
+ if (origHead != null)
+ repo.writeOrigHead(origHead);
+
switch (mode) {
case HARD:
checkoutIndex(commit);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
index 5d9488ae95..7b9d453aa2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
@@ -1248,6 +1248,39 @@ public abstract class Repository {
}
/**
+ * Write original HEAD commit into $GIT_DIR/ORIG_HEAD.
+ *
+ * @param head
+ * an object id of the original HEAD commit or <code>null</code>
+ * to delete the file
+ * @throws IOException
+ */
+ public void writeOrigHead(ObjectId head) throws IOException {
+ List<ObjectId> heads = head != null ? Collections.singletonList(head)
+ : null;
+ writeHeadsFile(heads, Constants.ORIG_HEAD);
+ }
+
+ /**
+ * Return the information stored in the file $GIT_DIR/ORIG_HEAD.
+ *
+ * @return object id from ORIG_HEAD file or {@code null} if this file
+ * doesn't exist. Also if the file exists but is empty {@code null}
+ * will be returned
+ * @throws IOException
+ * @throws NoWorkTreeException
+ * if this is bare, which implies it has no working directory.
+ * See {@link #isBare()}.
+ */
+ public ObjectId readOrigHead() throws IOException, NoWorkTreeException {
+ if (isBare() || getDirectory() == null)
+ throw new NoWorkTreeException();
+
+ byte[] raw = readGitDirectoryFile(Constants.ORIG_HEAD);
+ return raw != null ? ObjectId.fromString(raw, 0) : null;
+ }
+
+ /**
* Read a file from the git directory.
*
* @param filename