From d2ade728a131995c97a65bcb7610b4675682826c Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Wed, 10 Jun 2015 15:43:27 -0700 Subject: [PATCH] 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..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 --- .../eclipse/jgit/api/CloneCommandTest.java | 60 +++++++++++++++++++ .../org/eclipse/jgit/api/CloneCommand.java | 6 +- 2 files changed, 65 insertions(+), 1 deletion(-) 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 72cc51be9..ce11e1b1b 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 void testBareCloneRepository() throws IOException, 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 5ea839874..20d06331d 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 CloneCommand setBare(boolean bare) throws IllegalStateException { * * @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; }