Browse Source

Update HEAD in cherry-picking several commits

Without update, index is wrongly detected to be dirty
when picking the second commit.

Change-Id: Idf47ecb33e8bd38340d760806d629f67be92d2d5
Signed-off-by: Hiroshi Tomita <tomykaira@gmail.com>
Bug: 411963
stable-3.1
Hiroshi Tomita 12 years ago
parent
commit
6845bb5b3e
  1. 36
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java
  2. 9
      org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java

36
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java

@ -111,6 +111,42 @@ public class CherryPickCommandTest extends RepositoryTestCase {
assertFalse(history.hasNext());
}
@Test
public void testSequentialCherryPick() throws IOException, JGitInternalException,
GitAPIException {
Git git = new Git(db);
writeTrashFile("a", "first line\nsec. line\nthird line\n");
git.add().addFilepattern("a").call();
RevCommit firstCommit = git.commit().setMessage("create a").call();
writeTrashFile("a", "first line\nsec. line\nthird line\nfourth line\n");
git.add().addFilepattern("a").call();
RevCommit enlargingA = git.commit().setMessage("enlarged a").call();
writeTrashFile("a",
"first line\nsecond line\nthird line\nfourth line\n");
git.add().addFilepattern("a").call();
RevCommit fixingA = git.commit().setMessage("fixed a").call();
git.branchCreate().setName("side").setStartPoint(firstCommit).call();
checkoutBranch("refs/heads/side");
writeTrashFile("b", "nothing to do with a");
git.add().addFilepattern("b").call();
git.commit().setMessage("create b").call();
CherryPickResult result = git.cherryPick().include(enlargingA).include(fixingA).call();
assertEquals(CherryPickResult.CherryPickStatus.OK, result.getStatus());
Iterator<RevCommit> history = git.log().call().iterator();
assertEquals("fixed a", history.next().getFullMessage());
assertEquals("enlarged a", history.next().getFullMessage());
assertEquals("create b", history.next().getFullMessage());
assertEquals("create a", history.next().getFullMessage());
assertFalse(history.hasNext());
}
@Test
public void testCherryPickDirtyIndex() throws Exception {
Git git = new Git(db);

9
org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java

@ -122,9 +122,8 @@ public class CherryPickCommand extends GitCommand<CherryPickResult> {
if (headRef == null)
throw new NoHeadException(
JGitText.get().commitOnRepoWithoutHEADCurrentlyNotSupported);
RevCommit headCommit = revWalk.parseCommit(headRef.getObjectId());
newHead = headCommit;
newHead = revWalk.parseCommit(headRef.getObjectId());
// loop through all refs to be cherry-picked
for (Ref src : commits) {
@ -156,12 +155,12 @@ public class CherryPickCommand extends GitCommand<CherryPickResult> {
merger.setBase(srcParent.getTree());
merger.setCommitNames(new String[] { "BASE", ourName,
cherryPickName });
if (merger.merge(headCommit, srcCommit)) {
if (AnyObjectId.equals(headCommit.getTree().getId(), merger
if (merger.merge(newHead, srcCommit)) {
if (AnyObjectId.equals(newHead.getTree().getId(), merger
.getResultTreeId()))
continue;
DirCacheCheckout dco = new DirCacheCheckout(repo,
headCommit.getTree(), repo.lockDirCache(),
newHead.getTree(), repo.lockDirCache(),
merger.getResultTreeId());
dco.setFailOnConflict(true);
dco.checkout();

Loading…
Cancel
Save