aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse
diff options
context:
space:
mode:
authorChristian Halstrick <christian.halstrick@sap.com>2014-12-10 17:45:52 +0100
committerMatthias Sohn <matthias.sohn@sap.com>2014-12-15 00:22:51 +0100
commit6e05d98cce318056f95700e562cec6b68fcf7475 (patch)
tree4d95b3b1ed1786209db30af5946371973dd26a8c /org.eclipse.jgit/src/org/eclipse
parent03e860a7b7245e2b128d4614f7b5bd04b556a0c4 (diff)
downloadjgit-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
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java63
1 files changed, 59 insertions, 4 deletions
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));
+ }
+ }
+ }
}