From 1d4a1fe772745e80312543c0e4bf36974df49d4e Mon Sep 17 00:00:00 2001 From: Sasa Zivkov Date: Tue, 5 Jul 2011 14:06:49 +0200 Subject: [PATCH] Fixed creation of branch from a tag Creation of a branch X from an annotated tag, as the starting point, resulted into .git/refs/heads/X containing the ID of the annotated tag instead of the ID of the tagged commit. This fix peels the tag ref before using it as the starting point for the newly created branch. Bug: 340836 Change-Id: I01c7325770ecb37f5bf8ddb2a22f802466524f24 Signed-off-by: Chris Aniszczyk --- .../eclipse/jgit/api/BranchCommandTest.java | 24 +++++++++++++++++++ .../eclipse/jgit/api/CreateBranchCommand.java | 6 ++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java index 7464a5ea3..7760ec02d 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java @@ -60,12 +60,14 @@ import org.eclipse.jgit.api.errors.NotMergedException; import org.eclipse.jgit.api.errors.RefAlreadyExistsException; import org.eclipse.jgit.api.errors.RefNotFoundException; import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevTag; import org.eclipse.jgit.transport.FetchResult; import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.transport.RemoteConfig; @@ -247,6 +249,28 @@ public class BranchCommandTest extends RepositoryTestCase { assertEquals(newBranch.getTarget().getObjectId(), initialCommit.getId()); } + @Test + public void testCreateFromLightweightTag() throws Exception { + RefUpdate rup = db.updateRef("refs/tags/V10"); + rup.setNewObjectId(initialCommit); + rup.setExpectedOldObjectId(ObjectId.zeroId()); + rup.update(); + + Ref branch = git.branchCreate().setName("FromLightweightTag") + .setStartPoint("refs/tags/V10").call(); + assertEquals(initialCommit.getId(), branch.getObjectId()); + + } + + @Test + public void testCreateFromAnnotatetdTag() throws Exception { + RevTag tag = git.tag().setName("V10").setObjectId(secondCommit).call(); + Ref branch = git.branchCreate().setName("FromAnnotatedTag") + .setStartPoint("refs/tags/V10").call(); + assertFalse(tag.getId().equals(branch.getObjectId())); + assertEquals(secondCommit.getId(), branch.getObjectId()); + } + @Test public void testDelete() throws Exception { createBranch(git, "ForDelete", false, "master", null); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java index beee9a4ad..ece16489f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java @@ -123,6 +123,7 @@ public class CreateBranchCommand extends GitCommand { RefNotFoundException, InvalidRefNameException { checkCallable(); processOptions(); + RevWalk revWalk = new RevWalk(repo); try { Ref refToCheck = repo.getRef(name); boolean exists = refToCheck != null @@ -148,7 +149,7 @@ public class CreateBranchCommand extends GitCommand { if (startCommit != null) baseCommit = startCommit.getShortMessage(); else { - RevCommit commit = new RevWalk(repo).parseCommit(repo + RevCommit commit = revWalk.parseCommit(repo .resolve(startPoint)); baseCommit = commit.getShortMessage(); } @@ -167,6 +168,7 @@ public class CreateBranchCommand extends GitCommand { else refLogMessage = "branch: Created from branch " + baseBranch; } else { + startAt = revWalk.peel(revWalk.parseAny(startAt)); if (exists) refLogMessage = "branch: Reset start-point to tag " + startPointFullName; @@ -268,6 +270,8 @@ public class CreateBranchCommand extends GitCommand { return result; } catch (IOException ioe) { throw new JGitInternalException(ioe.getMessage(), ioe); + } finally { + revWalk.release(); } }