Browse Source

Fix CloneCommand not to fetch into remote tracking branches when bare

When cloning into a bare repository we should not create remote
tracking branches (e.g refs/remotes/origin/testX). Branches of the
remote repository should but fetched into into branches of the same
name (e.g refs/heads/testX). Also add the noCheckout option which
would prevent checkout after fetch.

Change-Id: I5d4cc0389f3f30c53aa0065f38119af2a1430909
Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
stable-1.0
Christian Halstrick 14 years ago committed by Shawn O. Pearce
parent
commit
cc2197ed9c
  1. 70
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
  2. 4
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GitConstructionTest.java
  3. 18
      org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java

70
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java

@ -49,12 +49,14 @@ import static org.junit.Assert.fail;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import org.eclipse.jgit.api.ListBranchCommand.ListMode; import org.eclipse.jgit.api.ListBranchCommand.ListMode;
import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.lib.RepositoryTestCase;
@ -136,6 +138,42 @@ public class CloneCommandTest extends RepositoryTestCase {
assertNotNull(git2); assertNotNull(git2);
assertEquals(git2.getRepository().getFullBranch(), assertEquals(git2.getRepository().getFullBranch(),
"refs/heads/master"); "refs/heads/master");
assertEquals(
"refs/heads/master, refs/remotes/origin/master, refs/remotes/origin/test",
allRefNames(git2.branchList().setListMode(ListMode.ALL)
.call()));
// Same thing, but now without checkout
directory = createTempDirectory("testCloneRepositoryWithBranch_bare");
command = Git.cloneRepository();
command.setBranch("refs/heads/master");
command.setDirectory(directory);
command.setURI("file://"
+ git.getRepository().getWorkTree().getPath());
command.setNoCheckout(true);
git2 = command.call();
assertNotNull(git2);
assertEquals(git2.getRepository().getFullBranch(),
"refs/heads/master");
assertEquals(
"refs/remotes/origin/master, refs/remotes/origin/test",
allRefNames(git2.branchList().setListMode(ListMode.ALL)
.call()));
// Same thing, but now test with bare repo
directory = createTempDirectory("testCloneRepositoryWithBranch_bare");
command = Git.cloneRepository();
command.setBranch("refs/heads/master");
command.setDirectory(directory);
command.setURI("file://"
+ git.getRepository().getWorkTree().getPath());
command.setBare(true);
git2 = command.call();
assertNotNull(git2);
assertEquals(git2.getRepository().getFullBranch(),
"refs/heads/master");
assertEquals("refs/heads/master, refs/heads/test", allRefNames(git2
.branchList().setListMode(ListMode.ALL).call()));
} catch (Exception e) { } catch (Exception e) {
fail(e.getMessage()); fail(e.getMessage());
} }
@ -156,13 +194,41 @@ public class CloneCommandTest extends RepositoryTestCase {
assertNotNull(git2); assertNotNull(git2);
assertEquals(git2.getRepository().getFullBranch(), assertEquals(git2.getRepository().getFullBranch(),
"refs/heads/master"); "refs/heads/master");
assertEquals(1, git2.branchList().setListMode(ListMode.REMOTE) assertEquals("refs/remotes/origin/master",
.call().size()); allRefNames(git2.branchList()
.setListMode(ListMode.REMOTE).call()));
// Same thing, but now test with bare repo
directory = createTempDirectory("testCloneRepositoryWithBranch_bare");
command = Git.cloneRepository();
command.setBranch("refs/heads/master");
command.setBranchesToClone(Collections
.singletonList("refs/heads/master"));
command.setDirectory(directory);
command.setURI("file://"
+ git.getRepository().getWorkTree().getPath());
command.setBare(true);
git2 = command.call();
assertNotNull(git2);
assertEquals(git2.getRepository().getFullBranch(),
"refs/heads/master");
assertEquals("refs/heads/master", allRefNames(git2
.branchList().setListMode(ListMode.ALL).call()));
} catch (Exception e) { } catch (Exception e) {
fail(e.getMessage()); fail(e.getMessage());
} }
} }
public static String allRefNames(List<Ref> refs) {
StringBuilder sb = new StringBuilder();
for (Ref f : refs) {
if (sb.length() > 0)
sb.append(", ");
sb.append(f.getName());
}
return sb.toString();
}
public static File createTempDirectory(String name) throws IOException { public static File createTempDirectory(String name) throws IOException {
final File temp; final File temp;
temp = File.createTempFile(name, Long.toString(System.nanoTime())); temp = File.createTempFile(name, Long.toString(System.nanoTime()));

4
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/GitConstructionTest.java

@ -79,7 +79,7 @@ public class GitConstructionTest extends RepositoryTestCase {
assertEquals(1, git.branchList().call().size()); assertEquals(1, git.branchList().call().size());
git = Git.wrap(bareRepo); git = Git.wrap(bareRepo);
assertEquals(2, git.branchList().setListMode(ListMode.ALL).call() assertEquals(1, git.branchList().setListMode(ListMode.ALL).call()
.size()); .size());
try { try {
@ -96,7 +96,7 @@ public class GitConstructionTest extends RepositoryTestCase {
assertEquals(1, git.branchList().call().size()); assertEquals(1, git.branchList().call().size());
git = Git.open(bareRepo.getDirectory()); git = Git.open(bareRepo.getDirectory());
assertEquals(2, git.branchList().setListMode(ListMode.ALL).call() assertEquals(1, git.branchList().setListMode(ListMode.ALL).call()
.size()); .size());
git = Git.open(db.getWorkTree()); git = Git.open(db.getWorkTree());

18
org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java

@ -98,6 +98,8 @@ public class CloneCommand implements Callable<Git> {
private boolean cloneAllBranches; private boolean cloneAllBranches;
private boolean noCheckout;
private Collection<String> branchesToClone; private Collection<String> branchesToClone;
/** /**
@ -112,6 +114,7 @@ public class CloneCommand implements Callable<Git> {
URIish u = new URIish(uri); URIish u = new URIish(uri);
Repository repository = init(u); Repository repository = init(u);
FetchResult result = fetch(repository, u); FetchResult result = fetch(repository, u);
if (!noCheckout)
checkout(repository, result); checkout(repository, result);
return new Git(repository); return new Git(repository);
} catch (IOException ioe) { } catch (IOException ioe) {
@ -140,7 +143,8 @@ public class CloneCommand implements Callable<Git> {
RemoteConfig config = new RemoteConfig(repo.getConfig(), remote); RemoteConfig config = new RemoteConfig(repo.getConfig(), remote);
config.addURI(u); config.addURI(u);
final String dst = Constants.R_REMOTES + config.getName(); final String dst = bare ? Constants.R_HEADS : Constants.R_REMOTES
+ config.getName();
RefSpec refSpec = new RefSpec(); RefSpec refSpec = new RefSpec();
refSpec = refSpec.setForceUpdate(true); refSpec = refSpec.setForceUpdate(true);
refSpec = refSpec.setSourceDestination(Constants.R_HEADS + "*", dst + "/*"); //$NON-NLS-1$ //$NON-NLS-2$ refSpec = refSpec.setSourceDestination(Constants.R_HEADS + "*", dst + "/*"); //$NON-NLS-1$ //$NON-NLS-2$
@ -368,4 +372,16 @@ public class CloneCommand implements Callable<Git> {
return this; return this;
} }
/**
* @param noCheckout
* if set to <code>true</code> no branch will be checked out
* after the clone. This enhances performance of the clone
* command when there is no need for a checked out branch.
* @return {@code this}
*/
public CloneCommand setNoCheckout(boolean noCheckout) {
this.noCheckout = noCheckout;
return this;
}
} }

Loading…
Cancel
Save