From 7bb2a1b8440386dead8b72c329b92e2473e89e32 Mon Sep 17 00:00:00 2001 From: Robin Stocker Date: Sat, 25 May 2013 15:56:50 +0200 Subject: [PATCH] Handle short branch/tag name for setBranch in CloneCommand Before, it was not clear from the documentation what kind of branch name was accepted. Users specifying "branch" (instead of "refs/heads/branch") got no error message and ended up with a repository without HEAD and no checkout. With this, CloneCommand now tries "$branch", then "refs/heads/$branch" and then "refs/tags/$branch". C Git only does the last two, but for compatibility we should still allow "refs/heads/branch". Bug: 390994 Change-Id: I4be13144f2a21a6583e0942f0c7c40da32f2247a Signed-off-by: Matthias Sohn --- .../eclipse/jgit/api/CloneCommandTest.java | 40 ++++++++++++++++--- .../org/eclipse/jgit/api/CloneCommand.java | 18 +++++++-- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java index 7422951920..31f909a5f2 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011, Chris Aniszczyk + * Copyright (C) 2011, 2013 Chris Aniszczyk * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -64,7 +64,6 @@ import org.eclipse.jgit.lib.ConfigConstants; 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.revwalk.RevBlob; import org.eclipse.jgit.revwalk.RevCommit; @@ -92,11 +91,10 @@ public class CloneCommandTest extends RepositoryTestCase { writeTrashFile("Test.txt", "Hello world"); git.add().addFilepattern("Test.txt").call(); git.commit().setMessage("Initial commit").call(); + git.tag().setName("tag-initial").setMessage("Tag initial").call(); - // create a master branch and switch to it - git.branchCreate().setName("test").call(); - RefUpdate rup = db.updateRef(Constants.HEAD); - rup.link("refs/heads/test"); + // create a test branch and switch to it + git.checkout().setCreateBranch(true).setName("test").call(); // commit something on the test branch writeTrashFile("Test.txt", "Some change"); @@ -205,6 +203,36 @@ public class CloneCommandTest extends RepositoryTestCase { .branchList().setListMode(ListMode.ALL).call())); } + @Test + public void testCloneRepositoryWithBranchShortName() throws Exception { + File directory = createTempDirectory("testCloneRepositoryWithBranch"); + CloneCommand command = Git.cloneRepository(); + command.setBranch("test"); + command.setDirectory(directory); + command.setURI("file://" + git.getRepository().getWorkTree().getPath()); + Git git2 = command.call(); + addRepoToClose(git2.getRepository()); + + assertNotNull(git2); + assertEquals("refs/heads/test", git2.getRepository().getFullBranch()); + } + + @Test + public void testCloneRepositoryWithTagName() throws Exception { + File directory = createTempDirectory("testCloneRepositoryWithBranch"); + CloneCommand command = Git.cloneRepository(); + command.setBranch("tag-initial"); + command.setDirectory(directory); + command.setURI("file://" + git.getRepository().getWorkTree().getPath()); + Git git2 = command.call(); + addRepoToClose(git2.getRepository()); + + assertNotNull(git2); + ObjectId taggedCommit = db.resolve("tag-initial^{commit}"); + assertEquals(taggedCommit.name(), git2 + .getRepository().getFullBranch()); + } + @Test public void testCloneRepositoryOnlyOneBranch() throws IOException, JGitInternalException, GitAPIException { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java index 65af216ae8..645d3e7815 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011, Chris Aniszczyk + * Copyright (C) 2011, 2013 Chris Aniszczyk * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -198,12 +198,19 @@ public class CloneCommand extends TransportCommand { throws MissingObjectException, IncorrectObjectTypeException, IOException, GitAPIException { - Ref head = result.getAdvertisedRef(branch); + Ref head = null; if (branch.equals(Constants.HEAD)) { Ref foundBranch = findBranchToCheckout(result); if (foundBranch != null) head = foundBranch; } + if (head == null) { + head = result.getAdvertisedRef(branch); + if (head == null) + head = result.getAdvertisedRef(Constants.R_HEADS + branch); + if (head == null) + head = result.getAdvertisedRef(Constants.R_TAGS + branch); + } if (head == null || head.getObjectId() == null) return; // throw exception? @@ -362,7 +369,9 @@ public class CloneCommand extends TransportCommand { /** * @param branch - * the initial branch to check out when cloning the repository + * the initial branch to check out when cloning the repository. + * Can be specified as ref name (refs/heads/master), + * branch name (master) or tag name (v1.2.3). * @return this instance */ public CloneCommand setBranch(String branch) { @@ -409,7 +418,8 @@ public class CloneCommand extends TransportCommand { /** * @param branchesToClone * collection of branches to clone. Ignored when allSelected is - * true. + * true. Must be specified as full ref names (e.g. + * refs/heads/master). * @return {@code this} */ public CloneCommand setBranchesToClone(Collection branchesToClone) { -- 2.39.5