Support the new repository layout for submodules

When updating a submodule (e.g. during recursive clone) the repository
for the submodule should be located at <gitdir>/modules/<submodule-path>
whereas the working tree of the submodule should be located at
<working-tree>/<submodule-path> (<gitdir> and <working-tree> are
associated to the containing repository). Since CloneCommand has learned
about specifying a separate gitdir this is easy to implement in
SubmoduleUpdateCommand.

Change-Id: I9b56a3dfa50f97f6975c2bb7c97b36296f331b64
This commit is contained in:
Christian Halstrick 2014-12-10 17:54:28 +01:00 committed by Matthias Sohn
parent 6e05d98cce
commit 53ff052998
3 changed files with 28 additions and 0 deletions

View File

@ -410,6 +410,18 @@ public void testCloneRepositoryWithSubmodules() throws Exception {
assertEquals(SubmoduleStatusType.INITIALIZED, pathStatus.getType());
assertEquals(commit, pathStatus.getHeadId());
assertEquals(commit, pathStatus.getIndexId());
SubmoduleWalk walk = SubmoduleWalk.forIndex(git2.getRepository());
assertTrue(walk.next());
Repository clonedSub1 = walk.getRepository();
addRepoToClose(clonedSub1);
assertNotNull(clonedSub1);
assertEquals(
new File(git2.getRepository().getWorkTree(), walk.getPath()),
clonedSub1.getWorkTree());
assertEquals(new File(new File(git2.getRepository().getDirectory(),
"modules"), walk.getPath()), clonedSub1.getDirectory());
walk.release();
}
@Test
@ -492,6 +504,12 @@ public void testCloneRepositoryWithNestedSubmodules() throws Exception {
assertTrue(walk.next());
Repository clonedSub1 = walk.getRepository();
assertNotNull(clonedSub1);
assertEquals(
new File(git2.getRepository().getWorkTree(), walk.getPath()),
clonedSub1.getWorkTree());
assertEquals(new File(new File(git2.getRepository().getDirectory(),
"modules"), walk.getPath()),
clonedSub1.getDirectory());
status = new SubmoduleStatusCommand(clonedSub1);
statuses = status.call();
clonedSub1.close();

View File

@ -42,6 +42,7 @@
*/
package org.eclipse.jgit.api;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
@ -163,6 +164,8 @@ public Collection<String> call() throws InvalidConfigurationException,
configure(clone);
clone.setURI(url);
clone.setDirectory(generator.getDirectory());
clone.setGitDir(new File(new File(repo.getDirectory(),
Constants.MODULES), generator.getPath()));
if (monitor != null)
clone.setProgressMonitor(monitor);
submoduleRepo = clone.call().getRepository();

View File

@ -372,6 +372,13 @@ public final class Constants {
*/
public static final String GITDIR = "gitdir: ";
/**
* Name of the folder (inside gitDir) where submodules are stored
*
* @since 3.6
*/
public static final String MODULES = "modules";
/**
* Create a new digest function for objects.
*