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 f2ad9e5f1..f21dc4a0b 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 @@ -48,7 +48,9 @@ import java.io.File; import java.io.IOException; +import java.util.Collections; +import org.eclipse.jgit.api.ListBranchCommand.ListMode; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.Constants; @@ -114,6 +116,8 @@ public void testCloneRepository() { .getConfig() .getString(ConfigConstants.CONFIG_BRANCH_SECTION, "test", ConfigConstants.CONFIG_KEY_MERGE)); + assertEquals(2, git2.branchList().setListMode(ListMode.REMOTE) + .call().size()); } catch (Exception e) { fail(e.getMessage()); } @@ -137,6 +141,28 @@ public void testCloneRepositoryWithBranch() { } } + @Test + public void testCloneRepositoryOnlyOneBranch() { + try { + File directory = createTempDirectory("testCloneRepositoryWithBranch"); + CloneCommand command = Git.cloneRepository(); + command.setBranch("refs/heads/master"); + command.setBranchesToClone(Collections + .singletonList("refs/heads/master")); + command.setDirectory(directory); + command.setURI("file://" + + git.getRepository().getWorkTree().getPath()); + Git git2 = command.call(); + assertNotNull(git2); + assertEquals(git2.getRepository().getFullBranch(), + "refs/heads/master"); + assertEquals(1, git2.branchList().setListMode(ListMode.REMOTE) + .call().size()); + } catch (Exception e) { + fail(e.getMessage()); + } + } + public static File createTempDirectory(String name) throws IOException { final File temp; temp = File.createTempFile(name, Long.toString(System.nanoTime())); 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 52d9e21b0..39652306b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java @@ -45,6 +45,9 @@ import java.io.File; import java.io.IOException; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.concurrent.Callable; import org.eclipse.jgit.api.errors.InvalidRemoteException; @@ -91,6 +94,12 @@ public class CloneCommand implements Callable { private CredentialsProvider credentialsProvider; + private int timeout; + + private boolean cloneAllBranches; + + private Collection branchesToClone; + /** * Executes the {@code Clone} command. * @@ -146,11 +155,32 @@ private FetchResult fetch(Repository repo, URIish u) command.setRemote(remote); command.setProgressMonitor(monitor); command.setTagOpt(TagOpt.FETCH_TAGS); + command.setTimeout(timeout); if (credentialsProvider != null) command.setCredentialsProvider(credentialsProvider); + + List specs = calculateRefSpecs(dst); + command.setRefSpecs(specs); + return command.call(); } + private List calculateRefSpecs(final String dst) { + RefSpec wcrs = new RefSpec(); + wcrs = wcrs.setForceUpdate(true); + wcrs = wcrs.setSourceDestination(Constants.R_HEADS + "*", dst + "/*"); //$NON-NLS-1$ //$NON-NLS-2$ + List specs = new ArrayList(); + if (cloneAllBranches) + specs.add(wcrs); + else if (branchesToClone != null + && branchesToClone.size() > 0) { + for (final String selectedRef : branchesToClone) + if (wcrs.matchSource(selectedRef)) + specs.add(wcrs.expandFromSource(selectedRef)); + } + return specs; + } + private void checkout(Repository repo, FetchResult result) throws JGitInternalException, MissingObjectException, IncorrectObjectTypeException, IOException { @@ -306,4 +336,36 @@ public CloneCommand setCredentialsProvider( return this; } + /** + * @param timeout + * the timeout used for the fetch step + * @return {@code this} + */ + public CloneCommand setTimeout(int timeout) { + this.timeout = timeout; + return this; + } + + /** + * @param cloneAllBranches + * true when all branches have to be fetched (indicates wildcard + * in created fetch refspec), false otherwise. + * @return {@code this} + */ + public CloneCommand setCloneAllBranches(boolean cloneAllBranches) { + this.cloneAllBranches = cloneAllBranches; + return this; + } + + /** + * @param branchesToClone + * collection of branches to clone. Ignored when allSelected is + * true. + * @return {@code this} + */ + public CloneCommand setBranchesToClone(Collection branchesToClone) { + this.branchesToClone = branchesToClone; + return this; + } + }