Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Lay2011-04-06 12:08:25 +0000
committerStefan Lay2011-04-06 13:00:22 +0000
commitfbf35fea4ec254339f9b0eee7865eb6ccfe22700 (patch)
treeb9c1ef896e2058a66cb4f8bb9f17dda5b7679df5
parent792b93bc62bb3714eb04ccf6e0c800d3b5b85f5b (diff)
downloadjgit-fbf35fea4ec254339f9b0eee7865eb6ccfe22700.tar.gz
jgit-fbf35fea4ec254339f9b0eee7865eb6ccfe22700.tar.xz
jgit-fbf35fea4ec254339f9b0eee7865eb6ccfe22700.zip
Add parameters for timeout and branches to clone
The timeout is also used in the FetchCommand called by the CloneCommand. The possibility to provide a list of branches to fetch initially is a feature offered by EGit. To implement it here is a prerequisite for EGit to be able to use the CloneCommand. Change-Id: I21453de22e9ca61919a7c3386fcc526024742f5f Signed-off-by: Stefan Lay <stefan.lay@sap.com>
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java26
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java62
2 files changed, 88 insertions, 0 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 f2ad9e5f11..f21dc4a0be 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 static org.junit.Assert.fail;
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 class CloneCommandTest extends RepositoryTestCase {
.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 class CloneCommandTest extends RepositoryTestCase {
}
}
+ @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 52d9e21b09..39652306b0 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 @@ package org.eclipse.jgit.api;
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<Git> {
private CredentialsProvider credentialsProvider;
+ private int timeout;
+
+ private boolean cloneAllBranches;
+
+ private Collection<String> branchesToClone;
+
/**
* Executes the {@code Clone} command.
*
@@ -146,11 +155,32 @@ public class CloneCommand implements Callable<Git> {
command.setRemote(remote);
command.setProgressMonitor(monitor);
command.setTagOpt(TagOpt.FETCH_TAGS);
+ command.setTimeout(timeout);
if (credentialsProvider != null)
command.setCredentialsProvider(credentialsProvider);
+
+ List<RefSpec> specs = calculateRefSpecs(dst);
+ command.setRefSpecs(specs);
+
return command.call();
}
+ private List<RefSpec> 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<RefSpec> specs = new ArrayList<RefSpec>();
+ 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 class CloneCommand implements Callable<Git> {
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<String> branchesToClone) {
+ this.branchesToClone = branchesToClone;
+ return this;
+ }
+
}

Back to the top