aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Nieder <jrn@google.com>2015-06-10 15:43:27 -0700
committerJonathan Nieder <jrn@google.com>2015-06-11 11:54:44 -0700
commitd2ade728a131995c97a65bcb7610b4675682826c (patch)
tree7446ab7c8dd32efcf6b3a208402afa33a977142c
parent24ab79ccaf5e3e8b3c2ef612afc398126b7c2d93 (diff)
downloadjgit-d2ade728a131995c97a65bcb7610b4675682826c.tar.gz
jgit-d2ade728a131995c97a65bcb7610b4675682826c.zip
Treat CloneCommand.setRemote(null) as setRemote("origin")
A non-bare clone command with null remote produces a NullPointerException when trying to produce a refspec to fetch against. In a bare repository, a null remote name is accepted by mistake, producing a configuration with items like 'remote.url' instead of 'remote.<remote>.url'. This was never meant to work. Instead, let's make setRemote(null) undo any previous setRemote calls and re-set the remote name to DEFAULT_REMOTE, imitating C git clone's --no-origin option. While we're here, add some tests for setRemote working normally. Change-Id: I76f502da5e677df501d3ef387e7f61f42a7ca238 Signed-off-by: Jonathan Nieder <jrn@google.com>
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java60
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java6
2 files changed, 65 insertions, 1 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 72cc51be98..ce11e1b1bc 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
@@ -202,6 +202,66 @@ public class CloneCommandTest extends RepositoryTestCase {
fetchRefSpec(git2.getRepository()));
}
+ @Test
+ public void testCloneRepositoryCustomRemote() throws Exception {
+ File directory = createTempDirectory("testCloneRemoteUpstream");
+ CloneCommand command = Git.cloneRepository();
+ command.setDirectory(directory);
+ command.setRemote("upstream");
+ command.setURI(fileUri());
+ Git git2 = command.call();
+ addRepoToClose(git2.getRepository());
+ assertEquals("+refs/heads/*:refs/remotes/upstream/*",
+ git2.getRepository()
+ .getConfig()
+ .getStringList("remote", "upstream",
+ "fetch")[0]);
+ assertEquals("upstream",
+ git2.getRepository()
+ .getConfig()
+ .getString("branch", "test", "remote"));
+ assertEquals(db.resolve("test"),
+ git2.getRepository().resolve("upstream/test"));
+ }
+
+ @Test
+ public void testBareCloneRepositoryCustomRemote() throws Exception {
+ File directory = createTempDirectory("testCloneRemoteUpstream_bare");
+ CloneCommand command = Git.cloneRepository();
+ command.setBare(true);
+ command.setDirectory(directory);
+ command.setRemote("upstream");
+ command.setURI(fileUri());
+ Git git2 = command.call();
+ addRepoToClose(git2.getRepository());
+ assertEquals("+refs/heads/*:refs/heads/*",
+ git2.getRepository()
+ .getConfig()
+ .getStringList("remote", "upstream",
+ "fetch")[0]);
+ assertEquals("upstream",
+ git2.getRepository()
+ .getConfig()
+ .getString("branch", "test", "remote"));
+ assertNull(git2.getRepository().resolve("upstream/test"));
+ }
+
+ @Test
+ public void testBareCloneRepositoryNullRemote() throws Exception {
+ File directory = createTempDirectory("testCloneRemoteNull_bare");
+ CloneCommand command = Git.cloneRepository();
+ command.setBare(true);
+ command.setDirectory(directory);
+ command.setRemote(null);
+ command.setURI(fileUri());
+ Git git2 = command.call();
+ addRepoToClose(git2.getRepository());
+ assertEquals("+refs/heads/*:refs/heads/*", git2.getRepository()
+ .getConfig().getStringList("remote", "origin", "fetch")[0]);
+ assertEquals("origin", git2.getRepository().getConfig()
+ .getString("branch", "test", "remote"));
+ }
+
public static RefSpec fetchRefSpec(Repository r) throws URISyntaxException {
RemoteConfig remoteConfig =
new RemoteConfig(r.getConfig(), Constants.DEFAULT_REMOTE_NAME);
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 5ea8398741..20d06331d2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
@@ -403,10 +403,14 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
*
* @see Constants#DEFAULT_REMOTE_NAME
* @param remote
- * name that keeps track of the upstream repository
+ * name that keeps track of the upstream repository.
+ * {@code null} means to use DEFAULT_REMOTE_NAME.
* @return this instance
*/
public CloneCommand setRemote(String remote) {
+ if (remote == null) {
+ remote = Constants.DEFAULT_REMOTE_NAME;
+ }
this.remote = remote;
return this;
}