@ -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 ;
}
}