diff options
author | Christian Halstrick <christian.halstrick@sap.com> | 2014-12-10 17:45:52 +0100 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2014-12-15 00:22:51 +0100 |
commit | 6e05d98cce318056f95700e562cec6b68fcf7475 (patch) | |
tree | 4d95b3b1ed1786209db30af5946371973dd26a8c | |
parent | 03e860a7b7245e2b128d4614f7b5bd04b556a0c4 (diff) | |
download | jgit-6e05d98cce318056f95700e562cec6b68fcf7475.tar.gz jgit-6e05d98cce318056f95700e562cec6b68fcf7475.zip |
Allow explicit configuration of git directory in CloneCommand
This feature is needed to support the new submodule layout where the
.git folder of the submodules is under .git/modules/<submodule>.
Change-Id: If5f13426cfd09b7677e23478e9700c8c25a6dae5
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java | 50 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java | 63 |
2 files changed, 109 insertions, 4 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java index de430fc94f..06829fa4db 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java @@ -45,6 +45,7 @@ package org.eclipse.jgit.api; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -58,6 +59,7 @@ import java.util.Map; import org.eclipse.jgit.api.ListBranchCommand.ListMode; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.JGitInternalException; +import org.eclipse.jgit.errors.NoWorkTreeException; import org.eclipse.jgit.junit.RepositoryTestCase; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ConfigConstants; @@ -136,6 +138,54 @@ public class CloneCommandTest extends RepositoryTestCase { } @Test + public void testCloneRepositoryExplicitGitDir() throws IOException, + JGitInternalException, GitAPIException { + File directory = createTempDirectory("testCloneRepository"); + CloneCommand command = Git.cloneRepository(); + command.setDirectory(directory); + command.setGitDir(new File(directory, ".git")); + command.setURI(fileUri()); + Git git2 = command.call(); + assertEquals(directory, git2.getRepository().getWorkTree()); + assertEquals(new File(directory, ".git"), git2.getRepository() + .getDirectory()); + } + + @Test + public void testCloneRepositoryExplicitGitDirNonStd() throws IOException, + JGitInternalException, GitAPIException { + File directory = createTempDirectory("testCloneRepository"); + File gDir = createTempDirectory("testCloneRepository.git"); + CloneCommand command = Git.cloneRepository(); + command.setDirectory(directory); + command.setGitDir(gDir); + command.setURI(fileUri()); + Git git2 = command.call(); + assertEquals(directory, git2.getRepository().getWorkTree()); + assertEquals(gDir, git2.getRepository() + .getDirectory()); + assertTrue(new File(directory, ".git").isFile()); + assertFalse(new File(gDir, ".git").exists()); + } + + @Test + public void testCloneRepositoryExplicitGitDirBare() throws IOException, + JGitInternalException, GitAPIException { + File gDir = createTempDirectory("testCloneRepository.git"); + CloneCommand command = Git.cloneRepository(); + command.setBare(true); + command.setGitDir(gDir); + command.setURI(fileUri()); + Git git2 = command.call(); + try { + assertNull(null, git2.getRepository().getWorkTree()); + fail("Expected NoWorkTreeException"); + } catch (NoWorkTreeException e) { + assertEquals(gDir, git2.getRepository().getDirectory()); + } + } + + @Test public void testBareCloneRepository() throws IOException, JGitInternalException, GitAPIException, URISyntaxException { File directory = createTempDirectory("testCloneRepository_bare"); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java index 645d3e7815..de24dadff6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java @@ -86,6 +86,8 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> { private File directory; + private File gitDir; + private boolean bare; private String remote = Constants.DEFAULT_REMOTE_NAME; @@ -137,12 +139,19 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> { private Repository init(URIish u) throws GitAPIException { InitCommand command = Git.init(); command.setBare(bare); - if (directory == null) + if (directory == null && gitDir == null) directory = new File(u.getHumanishName(), Constants.DOT_GIT); - if (directory.exists() && directory.listFiles().length != 0) + if (directory != null && directory.exists() + && directory.listFiles().length != 0) throw new JGitInternalException(MessageFormat.format( JGitText.get().cloneNonEmptyDirectory, directory.getName())); - command.setDirectory(directory); + if (gitDir != null && gitDir.exists() && gitDir.listFiles().length != 0) + throw new JGitInternalException(MessageFormat.format( + JGitText.get().cloneNonEmptyDirectory, gitDir.getName())); + if (directory != null) + command.setDirectory(directory); + if (gitDir != null) + command.setGitDir(gitDir); return command.call().getRepository(); } @@ -336,18 +345,47 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> { * @param directory * the directory to clone to * @return this instance + * @throws IllegalStateException + * if the combination of directory, gitDir and bare is illegal. + * E.g. if for a non-bare repository directory and gitDir point + * to the same directory of if for a bare repository both + * directory and gitDir are specified */ public CloneCommand setDirectory(File directory) { + validateDirs(directory, gitDir, bare); this.directory = directory; return this; } /** + * @param gitDir + * the repository meta directory + * @return this instance + * @throws IllegalStateException + * if the combination of directory, gitDir and bare is illegal. + * E.g. if for a non-bare repository directory and gitDir point + * to the same directory of if for a bare repository both + * directory and gitDir are specified + * @since 3.6 + */ + public CloneCommand setGitDir(File gitDir) { + validateDirs(directory, gitDir, bare); + this.gitDir = gitDir; + return this; + } + + /** * @param bare * whether the cloned repository is bare or not * @return this instance + * @throws IllegalStateException + * if the combination of directory, gitDir and bare is illegal. + * E.g. if for a non-bare repository directory and gitDir point + * to the same directory of if for a bare repository both + * directory and gitDir are specified */ - public CloneCommand setBare(boolean bare) { + public CloneCommand setBare(boolean bare) throws IllegalStateException { + validateDirs(directory, gitDir, bare); this.bare = bare; return this; } @@ -438,4 +476,21 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> { this.noCheckout = noCheckout; return this; } + + private static void validateDirs(File directory, File gitDir, boolean bare) + throws IllegalStateException { + if (directory != null) { + if (bare) { + if (gitDir != null && !gitDir.equals(directory)) + throw new IllegalStateException(MessageFormat.format( + JGitText.get().initFailedBareRepoDifferentDirs, + gitDir, directory)); + } else { + if (gitDir != null && gitDir.equals(directory)) + throw new IllegalStateException(MessageFormat.format( + JGitText.get().initFailedNonBareRepoSameDirs, + gitDir, directory)); + } + } + } } |