import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.submodule.SubmoduleStatus;
import org.eclipse.jgit.submodule.SubmoduleStatusType;
+import org.eclipse.jgit.submodule.SubmoduleWalk;
import org.eclipse.jgit.util.SystemReader;
import org.junit.Test;
assertEquals(commit, pathStatus.getIndexId());
}
+ @Test
+ public void testCloneRepositoryWithNestedSubmodules() throws Exception {
+ git.checkout().setName(Constants.MASTER).call();
+
+ // Create submodule 1
+ File submodule1 = createTempDirectory("testCloneRepositoryWithNestedSubmodules1");
+ Git sub1Git = Git.init().setDirectory(submodule1).call();
+ assertNotNull(sub1Git);
+ Repository sub1 = sub1Git.getRepository();
+ assertNotNull(sub1);
+ addRepoToClose(sub1);
+
+ String file = "file.txt";
+ String path = "sub";
+
+ write(new File(sub1.getWorkTree(), file), "content");
+ sub1Git.add().addFilepattern(file).call();
+ RevCommit commit = sub1Git.commit().setMessage("create file").call();
+ assertNotNull(commit);
+
+ // Create submodule 2
+ File submodule2 = createTempDirectory("testCloneRepositoryWithNestedSubmodules2");
+ Git sub2Git = Git.init().setDirectory(submodule2).call();
+ assertNotNull(sub2Git);
+ Repository sub2 = sub2Git.getRepository();
+ assertNotNull(sub2);
+ addRepoToClose(sub2);
+
+ write(new File(sub2.getWorkTree(), file), "content");
+ sub2Git.add().addFilepattern(file).call();
+ RevCommit sub2Head = sub2Git.commit().setMessage("create file").call();
+ assertNotNull(sub2Head);
+
+ // Add submodule 2 to submodule 1
+ assertNotNull(sub1Git.submoduleAdd().setPath(path)
+ .setURI(sub2.getDirectory().toURI().toString()).call());
+ RevCommit sub1Head = sub1Git.commit().setAll(true)
+ .setMessage("Adding submodule").call();
+ assertNotNull(sub1Head);
+
+ // Add submodule 1 to default repository
+ assertNotNull(git.submoduleAdd().setPath(path)
+ .setURI(sub1.getDirectory().toURI().toString()).call());
+ assertNotNull(git.commit().setAll(true).setMessage("Adding submodule")
+ .call());
+
+ // Clone default repository and include submodules
+ File directory = createTempDirectory("testCloneRepositoryWithNestedSubmodules");
+ CloneCommand clone = Git.cloneRepository();
+ clone.setDirectory(directory);
+ clone.setCloneSubmodules(true);
+ clone.setURI(git.getRepository().getDirectory().toURI().toString());
+ 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());
+ assertTrue(new File(git2.getRepository().getWorkTree(), path
+ + File.separatorChar + 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(sub1Head, pathStatus.getHeadId());
+ assertEquals(sub1Head, pathStatus.getIndexId());
+
+ SubmoduleWalk walk = SubmoduleWalk.forIndex(git2.getRepository());
+ assertTrue(walk.next());
+ Repository clonedSub1 = walk.getRepository();
+ assertNotNull(clonedSub1);
+ status = new SubmoduleStatusCommand(clonedSub1);
+ statuses = status.call();
+ pathStatus = statuses.get(path);
+ assertNotNull(pathStatus);
+ assertEquals(SubmoduleStatusType.INITIALIZED, pathStatus.getType());
+ assertEquals(sub2Head, pathStatus.getHeadId());
+ assertEquals(sub2Head, pathStatus.getIndexId());
+ assertFalse(walk.next());
+ }
+
@Test
public void testCloneWithAutoSetupRebase() throws Exception {
File directory = createTempDirectory("testCloneRepository1");
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.submodule.SubmoduleWalk;
import org.eclipse.jgit.transport.FetchResult;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig;
}
}
- private void cloneSubmodules(Repository clonedRepo) {
+ private void cloneSubmodules(Repository clonedRepo) throws IOException {
SubmoduleInitCommand init = new SubmoduleInitCommand(clonedRepo);
if (init.call().isEmpty())
return;
SubmoduleUpdateCommand update = new SubmoduleUpdateCommand(clonedRepo);
configure(update);
update.setProgressMonitor(monitor);
- update.call();
+ if (!update.call().isEmpty()) {
+ SubmoduleWalk walk = SubmoduleWalk.forIndex(clonedRepo);
+ while (walk.next()) {
+ Repository subRepo = walk.getRepository();
+ if (subRepo != null)
+ cloneSubmodules(subRepo);
+ }
+ }
}
private Ref findBranchToCheckout(FetchResult result) {