From 3a86868c0883d2a564db88bf9ae4a5fe235bb63f Mon Sep 17 00:00:00 2001 From: Sasa Zivkov Date: Fri, 25 Mar 2011 14:28:56 +0100 Subject: Detaching HEAD when checking out the same commit. Detaching HEAD didn't work in some corner checkout cases. If, for example, HEAD is symbolic ref to refs/heads/master, refs/heads/master is ref to commit c0ffee... then: checkout c0ffee... would leave the HEAD unchanged. The same symptom occurs when checking out a remote tracking branch or a tag that references the same commit as refs/heads/master. In the above case, the RefUpdate class didn't have enough information to decide if the update needed to detach symbolic ref because it dealt only with new/old objectIDs. Therefore, this fix introduced the RefUpdate.detachingSymbolicRef flag. Bug: 315166 Change-Id: I085c98b77ea8f9104a213978ea0d4ac6fd58f49b Signed-off-by: Sasa Zivkov --- .../tst/org/eclipse/jgit/api/CheckoutCommandTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'org.eclipse.jgit.test/tst/org/eclipse/jgit') diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java index 21fbe0a134..6e9f851793 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java @@ -47,6 +47,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -239,4 +240,20 @@ public class CheckoutCommandTest extends RepositoryTestCase { fail(e.getMessage()); } } + + @Test + public void testDetachedHeadOnCheckout() throws JGitInternalException, + RefAlreadyExistsException, RefNotFoundException, + InvalidRefNameException, IOException { + CheckoutCommand co = git.checkout(); + co.setName("master").call(); + + String commitId = db.getRef(Constants.MASTER).getObjectId().name(); + co = git.checkout(); + co.setName(commitId).call(); + + Ref head = db.getRef(Constants.HEAD); + assertFalse(head.isSymbolic()); + assertSame(head, head.getTarget()); + } } -- cgit v1.2.3