import java.io.File;
import java.io.IOException;
import java.util.Collections;
+import java.util.List;
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;
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.lib.RepositoryTestCase;
assertNotNull(git2);
assertEquals(git2.getRepository().getFullBranch(),
"refs/heads/master");
+ assertEquals(
+ "refs/heads/master, refs/remotes/origin/master, refs/remotes/origin/test",
+ allRefNames(git2.branchList().setListMode(ListMode.ALL)
+ .call()));
+
+ // Same thing, but now without checkout
+ directory = createTempDirectory("testCloneRepositoryWithBranch_bare");
+ command = Git.cloneRepository();
+ command.setBranch("refs/heads/master");
+ command.setDirectory(directory);
+ command.setURI("file://"
+ + git.getRepository().getWorkTree().getPath());
+ command.setNoCheckout(true);
+ git2 = command.call();
+ assertNotNull(git2);
+ assertEquals(git2.getRepository().getFullBranch(),
+ "refs/heads/master");
+ assertEquals(
+ "refs/remotes/origin/master, refs/remotes/origin/test",
+ allRefNames(git2.branchList().setListMode(ListMode.ALL)
+ .call()));
+
+ // Same thing, but now test with bare repo
+ directory = createTempDirectory("testCloneRepositoryWithBranch_bare");
+ command = Git.cloneRepository();
+ command.setBranch("refs/heads/master");
+ command.setDirectory(directory);
+ command.setURI("file://"
+ + git.getRepository().getWorkTree().getPath());
+ command.setBare(true);
+ git2 = command.call();
+ assertNotNull(git2);
+ assertEquals(git2.getRepository().getFullBranch(),
+ "refs/heads/master");
+ assertEquals("refs/heads/master, refs/heads/test", allRefNames(git2
+ .branchList().setListMode(ListMode.ALL).call()));
} catch (Exception e) {
fail(e.getMessage());
}
assertNotNull(git2);
assertEquals(git2.getRepository().getFullBranch(),
"refs/heads/master");
- assertEquals(1, git2.branchList().setListMode(ListMode.REMOTE)
- .call().size());
+ assertEquals("refs/remotes/origin/master",
+ allRefNames(git2.branchList()
+ .setListMode(ListMode.REMOTE).call()));
+
+ // Same thing, but now test with bare repo
+ directory = createTempDirectory("testCloneRepositoryWithBranch_bare");
+ 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());
+ command.setBare(true);
+ git2 = command.call();
+ assertNotNull(git2);
+ assertEquals(git2.getRepository().getFullBranch(),
+ "refs/heads/master");
+ assertEquals("refs/heads/master", allRefNames(git2
+ .branchList().setListMode(ListMode.ALL).call()));
} catch (Exception e) {
fail(e.getMessage());
}
}
+ public static String allRefNames(List<Ref> refs) {
+ StringBuilder sb = new StringBuilder();
+ for (Ref f : refs) {
+ if (sb.length() > 0)
+ sb.append(", ");
+ sb.append(f.getName());
+ }
+ return sb.toString();
+ }
+
public static File createTempDirectory(String name) throws IOException {
final File temp;
temp = File.createTempFile(name, Long.toString(System.nanoTime()));
private boolean cloneAllBranches;
+ private boolean noCheckout;
+
private Collection<String> branchesToClone;
/**
URIish u = new URIish(uri);
Repository repository = init(u);
FetchResult result = fetch(repository, u);
- checkout(repository, result);
+ if (!noCheckout)
+ checkout(repository, result);
return new Git(repository);
} catch (IOException ioe) {
throw new JGitInternalException(ioe.getMessage(), ioe);
RemoteConfig config = new RemoteConfig(repo.getConfig(), remote);
config.addURI(u);
- final String dst = Constants.R_REMOTES + config.getName();
+ final String dst = bare ? Constants.R_HEADS : Constants.R_REMOTES
+ + config.getName();
RefSpec refSpec = new RefSpec();
refSpec = refSpec.setForceUpdate(true);
refSpec = refSpec.setSourceDestination(Constants.R_HEADS + "*", dst + "/*"); //$NON-NLS-1$ //$NON-NLS-2$
return this;
}
+ /**
+ * @param noCheckout
+ * if set to <code>true</code> no branch will be checked out
+ * after the clone. This enhances performance of the clone
+ * command when there is no need for a checked out branch.
+ * @return {@code this}
+ */
+ public CloneCommand setNoCheckout(boolean noCheckout) {
+ this.noCheckout = noCheckout;
+ return this;
+ }
+
}