Add support for cloning submodules to CloneCommand

Change-Id: Ib1f82206fa14be75e2080f95db9f2d178e876453
This commit is contained in:
Kevin Sawicki 2012-01-02 09:38:21 -08:00
parent dea4511572
commit d57c00e036
2 changed files with 73 additions and 0 deletions

View File

@ -51,6 +51,7 @@
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
import org.eclipse.jgit.api.errors.JGitInternalException;
@ -63,6 +64,9 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase;
import org.eclipse.jgit.revwalk.RevBlob;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.submodule.SubmoduleStatus;
import org.eclipse.jgit.submodule.SubmoduleStatusType;
import org.junit.Test;
public class CloneCommandTest extends RepositoryTestCase {
@ -252,4 +256,47 @@ public void testCloneRepositoryWithMultipleHeadBranches() throws Exception {
assertEquals(Constants.MASTER, git2.getRepository().getBranch());
}
@Test
public void testCloneRepositoryWithSubmodules() throws Exception {
git.checkout().setName(Constants.MASTER).call();
String file = "file.txt";
writeTrashFile(file, "content");
git.add().addFilepattern(file).call();
RevCommit commit = git.commit().setMessage("create file").call();
SubmoduleAddCommand command = new SubmoduleAddCommand(db);
String path = "sub";
command.setPath(path);
String uri = db.getDirectory().toURI().toString();
command.setURI(uri);
Repository repo = command.call();
assertNotNull(repo);
git.add().addFilepattern(path)
.addFilepattern(Constants.DOT_GIT_MODULES).call();
git.commit().setMessage("adding submodule").call();
File directory = createTempDirectory("testCloneRepositoryWithSubmodules");
CloneCommand clone = Git.cloneRepository();
clone.setDirectory(directory);
clone.setCloneSubmodules(true);
clone.setURI("file://" + git.getRepository().getWorkTree().getPath());
Git git2 = clone.call();
addRepoToClose(git2.getRepository());
assertNotNull(git2);
assertEquals(Constants.MASTER, git2.getRepository().getBranch());
assertTrue(new File(git2.getRepository().getWorkTree(), path
+ File.separatorChar + file).exists());
SubmoduleStatusCommand status = new SubmoduleStatusCommand(
git2.getRepository());
Map<String, SubmoduleStatus> statuses = status.call();
SubmoduleStatus pathStatus = statuses.get(path);
assertNotNull(pathStatus);
assertEquals(SubmoduleStatusType.INITIALIZED, pathStatus.getType());
assertEquals(commit, pathStatus.getHeadId());
assertEquals(commit, pathStatus.getIndexId());
}
}

View File

@ -94,6 +94,8 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
private boolean cloneAllBranches;
private boolean cloneSubmodules;
private boolean noCheckout;
private Collection<String> branchesToClone;
@ -222,9 +224,22 @@ private void checkout(Repository clonedRepo, FetchResult result)
DirCacheCheckout co = new DirCacheCheckout(clonedRepo, dc,
commit.getTree());
co.checkout();
if (cloneSubmodules)
cloneSubmodules(clonedRepo);
}
}
private void cloneSubmodules(Repository clonedRepo) {
SubmoduleInitCommand init = new SubmoduleInitCommand(clonedRepo);
if (init.call().isEmpty())
return;
SubmoduleUpdateCommand update = new SubmoduleUpdateCommand(clonedRepo);
configure(update);
update.setProgressMonitor(monitor);
update.call();
}
private Ref findBranchToCheckout(FetchResult result) {
final Ref idHEAD = result.getAdvertisedRef(Constants.HEAD);
if (idHEAD == null)
@ -356,6 +371,17 @@ public CloneCommand setCloneAllBranches(boolean cloneAllBranches) {
return this;
}
/**
* @param cloneSubmodules
* true to initialize and update submodules. Ignored when
* {@link #setBare(boolean)} is set to true.
* @return {@code this}
*/
public CloneCommand setCloneSubmodules(boolean cloneSubmodules) {
this.cloneSubmodules = cloneSubmodules;
return this;
}
/**
* @param branchesToClone
* collection of branches to clone. Ignored when allSelected is