]> source.dussan.org Git - jgit.git/commitdiff
Update ORIG_HEAD when resetting 40/6140/5
authorKevin Sawicki <kevin@github.com>
Thu, 10 May 2012 22:56:21 +0000 (15:56 -0700)
committerRobin Rosenberg <robin.rosenberg@dewire.com>
Thu, 31 May 2012 19:52:31 +0000 (21:52 +0200)
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

org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java
org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java

index 648ef6f01bba62f811b3ade664cda21a3d476025..cf2dead5a44c7332864d88d46f228f5c1c47de40 100644 (file)
@@ -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
index f16d436d94f78b9fc0b079c82cd9cd7e90eb76f6..0806cf0dd0590cba0d26ab3f2ea0f022f1bb343d 100644 (file)
@@ -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
index 5b73657ea79818d5029b840ee18d64dfdd4dfbb5..ecf85932e95b398aab34cc72eb0266a34443c459 100644 (file)
@@ -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);
index 2f46b7faf3ccb47ffc5b3300ee5f49e767b5dcd2..a6d425ea310e935b3051759da84be0322e992628 100644 (file)
@@ -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);
index 5d9488ae95e600cb05a096caf90b791809d392e1..7b9d453aa298e3b6aeb0a58b242fd6fcaef64531 100644 (file)
@@ -1247,6 +1247,39 @@ public abstract class Repository {
                writeHeadsFile(heads, Constants.CHERRY_PICK_HEAD);
        }
 
+       /**
+        * 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.
         *