From 50deacdd57cd348554264fe26f3fd8177830071d Mon Sep 17 00:00:00 2001 From: Thomas Wolf Date: Sat, 8 Sep 2018 14:59:08 +0200 Subject: [PATCH] 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 --- .../org/eclipse/jgit/api/CloneCommandTest.java | 4 ++++ .../src/org/eclipse/jgit/api/CloneCommand.java | 16 ++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) 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 0ad067f6a..6b5fe502b 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 @@ -381,6 +381,8 @@ public class CloneCommandTest extends RepositoryTestCase { Git git2 = command.call(); addRepoToClose(git2.getRepository()); assertNotNull(git2); + assertNull(git2.getRepository().resolve("tag-for-blob")); + assertNotNull(git2.getRepository().resolve("tag-initial")); assertEquals(git2.getRepository().getFullBranch(), "refs/heads/master"); assertEquals("refs/remotes/origin/master", allRefNames(git2 .branchList().setListMode(ListMode.REMOTE).call())); @@ -408,6 +410,8 @@ public class CloneCommandTest extends RepositoryTestCase { Git git2 = command.call(); addRepoToClose(git2.getRepository()); assertNotNull(git2); + assertNull(git2.getRepository().resolve("tag-for-blob")); + assertNotNull(git2.getRepository().resolve("tag-initial")); assertEquals(git2.getRepository().getFullBranch(), "refs/heads/master"); assertEquals("refs/heads/master", allRefNames(git2.branchList() .setListMode(ListMode.ALL).call())); 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 5ea7cf871..73af8ba16 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java @@ -283,10 +283,11 @@ public class CloneCommand extends TransportCommand { config.addURI(u); final String dst = (bare ? Constants.R_HEADS : Constants.R_REMOTES - + config.getName() + "/") + "*"; //$NON-NLS-1$//$NON-NLS-2$ - List refSpecs = calculateRefSpecs(dst); + + config.getName() + '/') + '*'; + boolean fetchAll = cloneAllBranches || branchesToClone == null + || branchesToClone.isEmpty(); - config.setFetchRefSpecs(refSpecs); + config.setFetchRefSpecs(calculateRefSpecs(fetchAll, dst)); config.update(clonedRepo.getConfig()); clonedRepo.getConfig().save(); @@ -295,19 +296,18 @@ public class CloneCommand extends TransportCommand { FetchCommand command = new FetchCommand(clonedRepo); command.setRemote(remote); command.setProgressMonitor(monitor); - command.setTagOpt(TagOpt.FETCH_TAGS); + command.setTagOpt(fetchAll ? TagOpt.FETCH_TAGS : TagOpt.AUTO_FOLLOW); configure(command); return command.call(); } - private List calculateRefSpecs(String dst) { + private List calculateRefSpecs(boolean fetchAll, String dst) { RefSpec wcrs = new RefSpec(); wcrs = wcrs.setForceUpdate(true); - wcrs = wcrs.setSourceDestination(Constants.R_HEADS + "*", dst); //$NON-NLS-1$ + wcrs = wcrs.setSourceDestination(Constants.R_HEADS + '*', dst); List specs = new ArrayList<>(); - if (!cloneAllBranches && branchesToClone != null - && !branchesToClone.isEmpty()) { + if (!fetchAll) { for (String selectedRef : branchesToClone) { if (wcrs.matchSource(selectedRef)) { specs.add(wcrs.expandFromSource(selectedRef));