Browse Source

Set TagOpt.AUTO_FOLLOW when not cloning all branches

Otherwise fetching all tags may pull in commits not on the
specified branches. Canonical git also does this.[1]

[1] https://github.com/git/git/blob/b160b6e69/builtin/clone.c#L1124

Bug: 538768
Change-Id: If0ac75fb9fae0c95d1a48b22954c54d4c3c09a47
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
stable-5.2
Thomas Wolf 6 years ago committed by Matthias Sohn
parent
commit
50deacdd57
  1. 4
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java
  2. 16
      org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java

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

@ -381,6 +381,8 @@ public class CloneCommandTest extends RepositoryTestCase {
Git git2 = command.call(); Git git2 = command.call();
addRepoToClose(git2.getRepository()); addRepoToClose(git2.getRepository());
assertNotNull(git2); assertNotNull(git2);
assertNull(git2.getRepository().resolve("tag-for-blob"));
assertNotNull(git2.getRepository().resolve("tag-initial"));
assertEquals(git2.getRepository().getFullBranch(), "refs/heads/master"); assertEquals(git2.getRepository().getFullBranch(), "refs/heads/master");
assertEquals("refs/remotes/origin/master", allRefNames(git2 assertEquals("refs/remotes/origin/master", allRefNames(git2
.branchList().setListMode(ListMode.REMOTE).call())); .branchList().setListMode(ListMode.REMOTE).call()));
@ -408,6 +410,8 @@ public class CloneCommandTest extends RepositoryTestCase {
Git git2 = command.call(); Git git2 = command.call();
addRepoToClose(git2.getRepository()); addRepoToClose(git2.getRepository());
assertNotNull(git2); assertNotNull(git2);
assertNull(git2.getRepository().resolve("tag-for-blob"));
assertNotNull(git2.getRepository().resolve("tag-initial"));
assertEquals(git2.getRepository().getFullBranch(), "refs/heads/master"); assertEquals(git2.getRepository().getFullBranch(), "refs/heads/master");
assertEquals("refs/heads/master", allRefNames(git2.branchList() assertEquals("refs/heads/master", allRefNames(git2.branchList()
.setListMode(ListMode.ALL).call())); .setListMode(ListMode.ALL).call()));

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

@ -283,10 +283,11 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
config.addURI(u); config.addURI(u);
final String dst = (bare ? Constants.R_HEADS : Constants.R_REMOTES final String dst = (bare ? Constants.R_HEADS : Constants.R_REMOTES
+ config.getName() + "/") + "*"; //$NON-NLS-1$//$NON-NLS-2$ + config.getName() + '/') + '*';
List<RefSpec> refSpecs = calculateRefSpecs(dst); boolean fetchAll = cloneAllBranches || branchesToClone == null
|| branchesToClone.isEmpty();
config.setFetchRefSpecs(refSpecs); config.setFetchRefSpecs(calculateRefSpecs(fetchAll, dst));
config.update(clonedRepo.getConfig()); config.update(clonedRepo.getConfig());
clonedRepo.getConfig().save(); clonedRepo.getConfig().save();
@ -295,19 +296,18 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
FetchCommand command = new FetchCommand(clonedRepo); FetchCommand command = new FetchCommand(clonedRepo);
command.setRemote(remote); command.setRemote(remote);
command.setProgressMonitor(monitor); command.setProgressMonitor(monitor);
command.setTagOpt(TagOpt.FETCH_TAGS); command.setTagOpt(fetchAll ? TagOpt.FETCH_TAGS : TagOpt.AUTO_FOLLOW);
configure(command); configure(command);
return command.call(); return command.call();
} }
private List<RefSpec> calculateRefSpecs(String dst) { private List<RefSpec> calculateRefSpecs(boolean fetchAll, String dst) {
RefSpec wcrs = new RefSpec(); RefSpec wcrs = new RefSpec();
wcrs = wcrs.setForceUpdate(true); wcrs = wcrs.setForceUpdate(true);
wcrs = wcrs.setSourceDestination(Constants.R_HEADS + "*", dst); //$NON-NLS-1$ wcrs = wcrs.setSourceDestination(Constants.R_HEADS + '*', dst);
List<RefSpec> specs = new ArrayList<>(); List<RefSpec> specs = new ArrayList<>();
if (!cloneAllBranches && branchesToClone != null if (!fetchAll) {
&& !branchesToClone.isEmpty()) {
for (String selectedRef : branchesToClone) { for (String selectedRef : branchesToClone) {
if (wcrs.matchSource(selectedRef)) { if (wcrs.matchSource(selectedRef)) {
specs.add(wcrs.expandFromSource(selectedRef)); specs.add(wcrs.expandFromSource(selectedRef));

Loading…
Cancel
Save