Browse Source

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>
stable-4.1
Jonathan Nieder 10 years ago
parent
commit
d2ade728a1
  1. 60
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
  2. 6
      org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java

60
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);

6
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;
}

Loading…
Cancel
Save