* stable-5.6: Restore behavior of CloneCommand Change-Id: I3092bf214c41436b57e0ede9d2202f8aabf15471 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>tags/v5.7.0.202002241735-m3
Git git2 = command.call(); | Git git2 = command.call(); | ||||
addRepoToClose(git2.getRepository()); | addRepoToClose(git2.getRepository()); | ||||
assertNotNull(git2); | assertNotNull(git2); | ||||
assertTrue(git2.getRepository().isBare()); | |||||
assertNotNull(git2.getRepository().resolve("tag-for-blob")); | assertNotNull(git2.getRepository().resolve("tag-for-blob")); | ||||
assertNotNull(git2.getRepository().resolve("tag-initial")); | assertNotNull(git2.getRepository().resolve("tag-initial")); | ||||
assertEquals(git2.getRepository().getFullBranch(), "refs/heads/master"); | assertEquals(git2.getRepository().getFullBranch(), "refs/heads/master"); | ||||
specs.get(0)); | specs.get(0)); | ||||
} | } | ||||
@Test | |||||
public void testCloneRepositoryAllBranchesTakesPreference() | |||||
throws Exception { | |||||
File directory = createTempDirectory( | |||||
"testCloneRepositoryAllBranchesTakesPreference"); | |||||
CloneCommand command = Git.cloneRepository(); | |||||
command.setCloneAllBranches(true); | |||||
command.setBranchesToClone( | |||||
Collections.singletonList("refs/heads/test")); | |||||
command.setDirectory(directory); | |||||
command.setURI(fileUri()); | |||||
Git git2 = command.call(); | |||||
addRepoToClose(git2.getRepository()); | |||||
assertNotNull(git2); | |||||
assertEquals(git2.getRepository().getFullBranch(), "refs/heads/test"); | |||||
// Expect both remote branches to exist; setCloneAllBranches(true) | |||||
// should override any setBranchesToClone(). | |||||
assertNotNull( | |||||
git2.getRepository().resolve("refs/remotes/origin/master")); | |||||
assertNotNull(git2.getRepository().resolve("refs/remotes/origin/test")); | |||||
RemoteConfig cfg = new RemoteConfig(git2.getRepository().getConfig(), | |||||
Constants.DEFAULT_REMOTE_NAME); | |||||
List<RefSpec> specs = cfg.getFetchRefSpecs(); | |||||
assertEquals(1, specs.size()); | |||||
assertEquals(new RefSpec("+refs/heads/*:refs/remotes/origin/*"), | |||||
specs.get(0)); | |||||
} | |||||
@Test | |||||
public void testCloneRepositoryAllBranchesIndependent() throws Exception { | |||||
File directory = createTempDirectory( | |||||
"testCloneRepositoryAllBranchesIndependent"); | |||||
CloneCommand command = Git.cloneRepository(); | |||||
command.setCloneAllBranches(true); | |||||
command.setBranchesToClone( | |||||
Collections.singletonList("refs/heads/test")); | |||||
command.setCloneAllBranches(false); | |||||
command.setDirectory(directory); | |||||
command.setURI(fileUri()); | |||||
Git git2 = command.call(); | |||||
addRepoToClose(git2.getRepository()); | |||||
assertNotNull(git2); | |||||
assertEquals(git2.getRepository().getFullBranch(), "refs/heads/test"); | |||||
// Expect only the test branch; allBranches was re-set to false | |||||
assertNull(git2.getRepository().resolve("refs/remotes/origin/master")); | |||||
assertNotNull(git2.getRepository().resolve("refs/remotes/origin/test")); | |||||
RemoteConfig cfg = new RemoteConfig(git2.getRepository().getConfig(), | |||||
Constants.DEFAULT_REMOTE_NAME); | |||||
List<RefSpec> specs = cfg.getFetchRefSpecs(); | |||||
assertEquals(1, specs.size()); | |||||
assertEquals(new RefSpec("+refs/heads/test:refs/remotes/origin/test"), | |||||
specs.get(0)); | |||||
} | |||||
public static String allRefNames(List<Ref> refs) { | public static String allRefNames(List<Ref> refs) { | ||||
StringBuilder sb = new StringBuilder(); | StringBuilder sb = new StringBuilder(); | ||||
for (Ref f : refs) { | for (Ref f : refs) { |
private ProgressMonitor monitor = NullProgressMonitor.INSTANCE; | private ProgressMonitor monitor = NullProgressMonitor.INSTANCE; | ||||
private FETCH_TYPE fetchType = FETCH_TYPE.ALL_BRANCHES; | |||||
private boolean cloneAllBranches; | |||||
private boolean mirror; | |||||
private boolean cloneSubmodules; | private boolean cloneSubmodules; | ||||
private boolean gitDirExistsInitially; | private boolean gitDirExistsInitially; | ||||
private FETCH_TYPE fetchType; | |||||
private enum FETCH_TYPE { | private enum FETCH_TYPE { | ||||
MULTIPLE_BRANCHES, ALL_BRANCHES, MIRROR | MULTIPLE_BRANCHES, ALL_BRANCHES, MIRROR | ||||
} | } | ||||
throw new InvalidRemoteException( | throw new InvalidRemoteException( | ||||
MessageFormat.format(JGitText.get().invalidURL, uri), e); | MessageFormat.format(JGitText.get().invalidURL, uri), e); | ||||
} | } | ||||
setFetchType(); | |||||
@SuppressWarnings("resource") // Closed by caller | @SuppressWarnings("resource") // Closed by caller | ||||
Repository repository = init(); | Repository repository = init(); | ||||
FetchResult fetchResult = null; | FetchResult fetchResult = null; | ||||
return new Git(repository, true); | return new Git(repository, true); | ||||
} | } | ||||
private void setFetchType() { | |||||
if (mirror) { | |||||
fetchType = FETCH_TYPE.MIRROR; | |||||
setBare(true); | |||||
} else if (cloneAllBranches) { | |||||
fetchType = FETCH_TYPE.ALL_BRANCHES; | |||||
} else if (branchesToClone != null && !branchesToClone.isEmpty()) { | |||||
fetchType = FETCH_TYPE.MULTIPLE_BRANCHES; | |||||
} else { | |||||
// Default: neither mirror nor all nor specific refs given | |||||
fetchType = FETCH_TYPE.ALL_BRANCHES; | |||||
} | |||||
} | |||||
private static boolean isNonEmptyDirectory(File dir) { | private static boolean isNonEmptyDirectory(File dir) { | ||||
if (dir != null && dir.exists()) { | if (dir != null && dir.exists()) { | ||||
File[] files = dir.listFiles(); | File[] files = dir.listFiles(); | ||||
* @return {@code this} | * @return {@code this} | ||||
*/ | */ | ||||
public CloneCommand setCloneAllBranches(boolean cloneAllBranches) { | public CloneCommand setCloneAllBranches(boolean cloneAllBranches) { | ||||
this.fetchType = cloneAllBranches ? FETCH_TYPE.ALL_BRANCHES | |||||
: this.fetchType; | |||||
this.cloneAllBranches = cloneAllBranches; | |||||
return this; | return this; | ||||
} | } | ||||
* @since 5.6 | * @since 5.6 | ||||
*/ | */ | ||||
public CloneCommand setMirror(boolean mirror) { | public CloneCommand setMirror(boolean mirror) { | ||||
if (mirror) { | |||||
this.fetchType = FETCH_TYPE.MIRROR; | |||||
setBare(true); | |||||
} | |||||
this.mirror = mirror; | |||||
return this; | return this; | ||||
} | } | ||||
* Set the branches or tags to clone. | * Set the branches or tags to clone. | ||||
* <p> | * <p> | ||||
* This is ignored if {@link #setCloneAllBranches(boolean) | * This is ignored if {@link #setCloneAllBranches(boolean) | ||||
* setCloneAllBranches(true)} is used. If {@code branchesToClone} is | |||||
* {@code null} or empty, it's also ignored and all branches will be cloned. | |||||
* setCloneAllBranches(true)} or {@link #setMirror(boolean) setMirror(true)} | |||||
* is used. If {@code branchesToClone} is {@code null} or empty, it's also | |||||
* ignored. | |||||
* </p> | * </p> | ||||
* | * | ||||
* @param branchesToClone | * @param branchesToClone | ||||
* @return {@code this} | * @return {@code this} | ||||
*/ | */ | ||||
public CloneCommand setBranchesToClone(Collection<String> branchesToClone) { | public CloneCommand setBranchesToClone(Collection<String> branchesToClone) { | ||||
if (branchesToClone == null || branchesToClone.isEmpty()) { | |||||
// fallback to default | |||||
fetchType = FETCH_TYPE.ALL_BRANCHES; | |||||
} else { | |||||
this.fetchType = FETCH_TYPE.MULTIPLE_BRANCHES; | |||||
this.branchesToClone = branchesToClone; | |||||
} | |||||
this.branchesToClone = branchesToClone; | |||||
return this; | return this; | ||||
} | } | ||||