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>
This commit is contained in:
parent
792b93bc62
commit
fbf35fea4e
|
@ -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()));
|
||||
|
|
|
@ -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<Git> {
|
|||
|
||||
private CredentialsProvider credentialsProvider;
|
||||
|
||||
private int timeout;
|
||||
|
||||
private boolean cloneAllBranches;
|
||||
|
||||
private Collection<String> 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<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 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<String> branchesToClone) {
|
||||
this.branchesToClone = branchesToClone;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue