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: I120b3b2cd3b1ddae88fce435285bae15cbf96f5etags/v2.0.0.201206130900-r
@@ -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 |
@@ -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 |
@@ -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); |
@@ -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); |
@@ -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. | |||
* |