Procházet zdrojové kódy

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>
tags/v4.1.0.201509280440-r
Jonathan Nieder před 9 roky
rodič
revize
d2ade728a1

+ 60
- 0
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java Zobrazit soubor

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

+ 5
- 1
org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java Zobrazit soubor

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

Načítá se…
Zrušit
Uložit