Browse Source

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 <caniszczyk@gmail.com>
stable-1.1
Sasa Zivkov 14 years ago committed by Chris Aniszczyk
parent
commit
1d4a1fe772
  1. 24
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java
  2. 6
      org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java

24
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);

6
org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java

@ -123,6 +123,7 @@ public class CreateBranchCommand extends GitCommand<Ref> {
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<Ref> {
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<Ref> {
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<Ref> {
return result;
} catch (IOException ioe) {
throw new JGitInternalException(ioe.getMessage(), ioe);
} finally {
revWalk.release();
}
}

Loading…
Cancel
Save