summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test
diff options
context:
space:
mode:
authorChristian Halstrick <christian.halstrick@sap.com>2014-12-10 17:42:42 +0100
committerMatthias Sohn <matthias.sohn@sap.com>2014-12-15 00:22:50 +0100
commit03e860a7b7245e2b128d4614f7b5bd04b556a0c4 (patch)
tree38275f14183835487c287c6c20e648ce23695fa6 /org.eclipse.jgit.test
parentca7c928eae842b8e9881e42ffe7e5fee81983e13 (diff)
downloadjgit-03e860a7b7245e2b128d4614f7b5bd04b556a0c4.tar.gz
jgit-03e860a7b7245e2b128d4614f7b5bd04b556a0c4.zip
Allow explicit configuration of git directory in InitCommand
Native git's "init" command allows to specify the location of the .git folder with the option "--separate-git-dir". This allows for example to setup repositories with a non-standard layout. E.g. .git folder under /repos/a.git and the worktree under /home/git/a. Both directories contain pointers to the other side: /repos/a.git/config contains core.worktree=/home/git/a . And /home/git/a/.git is a file containing "gitdir: /repos/a.git". This commit adds that option to InitCommand. This feature is needed to support the new submodule layout where the .git folder of the submodules is under .git/modules/<submodule>. Change-Id: I0208f643808bf8f28e2c979d6e33662607775f1f
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/InitCommandTest.java110
1 files changed, 110 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/InitCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/InitCommandTest.java
index 3296717c0e..e850223762 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/InitCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/InitCommandTest.java
@@ -43,6 +43,7 @@
package org.eclipse.jgit.api;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
@@ -50,8 +51,12 @@ import java.io.IOException;
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.MockSystemReader;
import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.util.SystemReader;
import org.junit.Before;
import org.junit.Test;
@@ -101,4 +106,109 @@ public class InitCommandTest extends RepositoryTestCase {
assertNotNull(repository);
assertTrue(repository.isBare());
}
+
+ // non-bare repos where gitDir and directory is set. Same as
+ // "git init --separate-git-dir /tmp/a /tmp/b"
+ @Test
+ public void testInitWithExplicitGitDir() throws IOException,
+ JGitInternalException, GitAPIException {
+ File wt = createTempDirectory("testInitRepositoryWT");
+ File gitDir = createTempDirectory("testInitRepositoryGIT");
+ InitCommand command = new InitCommand();
+ command.setDirectory(wt);
+ command.setGitDir(gitDir);
+ Repository repository = command.call().getRepository();
+ addRepoToClose(repository);
+ assertNotNull(repository);
+ assertEqualsFile(wt, repository.getWorkTree());
+ assertEqualsFile(gitDir, repository.getDirectory());
+ }
+
+ // non-bare repos where only gitDir is set. Same as
+ // "git init --separate-git-dir /tmp/a"
+ @Test
+ public void testInitWithOnlyExplicitGitDir() throws IOException,
+ JGitInternalException, GitAPIException {
+ MockSystemReader reader = (MockSystemReader) SystemReader.getInstance();
+ reader.setProperty(Constants.OS_USER_DIR, getTemporaryDirectory()
+ .getAbsolutePath());
+ File gitDir = createTempDirectory("testInitRepository/.git");
+ InitCommand command = new InitCommand();
+ command.setGitDir(gitDir);
+ Repository repository = command.call().getRepository();
+ addRepoToClose(repository);
+ assertNotNull(repository);
+ assertEqualsFile(gitDir, repository.getDirectory());
+ assertEqualsFile(new File(reader.getProperty("user.dir")),
+ repository.getWorkTree());
+ }
+
+ // Bare repos where gitDir and directory is set will only work if gitDir and
+ // directory is pointing to same dir. Same as
+ // "git init --bare --separate-git-dir /tmp/a /tmp/b"
+ // (works in native git but I guess that's more a bug)
+ @Test(expected = IllegalStateException.class)
+ public void testInitBare_DirAndGitDirMustBeEqual() throws IOException,
+ JGitInternalException, GitAPIException {
+ File gitDir = createTempDirectory("testInitRepository.git");
+ InitCommand command = new InitCommand();
+ command.setBare(true);
+ command.setDirectory(gitDir);
+ command.setGitDir(new File(gitDir, ".."));
+ command.call();
+ }
+
+ // If neither directory nor gitDir is set in a non-bare repo make sure
+ // worktree and gitDir are set correctly. Standard case. Same as
+ // "git init"
+ @Test
+ public void testInitWithDefaultsNonBare() throws JGitInternalException,
+ GitAPIException, IOException {
+ MockSystemReader reader = (MockSystemReader) SystemReader.getInstance();
+ reader.setProperty(Constants.OS_USER_DIR, getTemporaryDirectory()
+ .getAbsolutePath());
+ InitCommand command = new InitCommand();
+ command.setBare(false);
+ Repository repository = command.call().getRepository();
+ addRepoToClose(repository);
+ assertNotNull(repository);
+ assertEqualsFile(new File(reader.getProperty("user.dir"), ".git"),
+ repository.getDirectory());
+ assertEqualsFile(new File(reader.getProperty("user.dir")),
+ repository.getWorkTree());
+ }
+
+ // If neither directory nor gitDir is set in a bare repo make sure
+ // worktree and gitDir are set correctly. Standard case. Same as
+ // "git init --bare"
+ @Test(expected = NoWorkTreeException.class)
+ public void testInitWithDefaultsBare() throws JGitInternalException,
+ GitAPIException, IOException {
+ MockSystemReader reader = (MockSystemReader) SystemReader.getInstance();
+ reader.setProperty(Constants.OS_USER_DIR, getTemporaryDirectory()
+ .getAbsolutePath());
+ InitCommand command = new InitCommand();
+ command.setBare(true);
+ Repository repository = command.call().getRepository();
+ addRepoToClose(repository);
+ assertNotNull(repository);
+ assertEqualsFile(new File(reader.getProperty("user.dir")),
+ repository.getDirectory());
+ assertNull(repository.getWorkTree());
+ }
+
+ // In a non-bare repo when directory and gitDir is set then they shouldn't
+ // point to the same dir. Same as
+ // "git init --separate-git-dir /tmp/a /tmp/a"
+ // (works in native git but I guess that's more a bug)
+ @Test(expected = IllegalStateException.class)
+ public void testInitNonBare_GitdirAndDirShouldntBeSame()
+ throws JGitInternalException, GitAPIException, IOException {
+ File gitDir = createTempDirectory("testInitRepository.git");
+ InitCommand command = new InitCommand();
+ command.setBare(false);
+ command.setGitDir(gitDir);
+ command.setDirectory(gitDir);
+ command.call().getRepository();
+ }
}