tag option for clone command

Allow explicitly setting the tag option for the remote configuration
when cloning a repository.

Bug: 561021
Change-Id: Iac43268a2bb231ae7599c3255bf555883d34fa32
Signed-off-by: Alexander Nittka <alex@nittka.de>
This commit is contained in:
Alexander Nittka 2020-03-11 11:58:03 +01:00
parent 04e16afb05
commit 769606d059
2 changed files with 81 additions and 1 deletions

View File

@ -44,6 +44,7 @@
import org.eclipse.jgit.submodule.SubmoduleWalk;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.TagOpt;
import org.eclipse.jgit.transport.URIish;
import org.eclipse.jgit.util.SystemReader;
import org.junit.Test;
@ -111,6 +112,7 @@ public void testCloneRepository() throws IOException,
.size());
assertEquals(new RefSpec("+refs/heads/*:refs/remotes/origin/*"),
fetchRefSpec(git2.getRepository()));
assertTagOption(git2.getRepository(), TagOpt.AUTO_FOLLOW);
}
@Test
@ -801,6 +803,50 @@ public void testCloneWithPullRebase() throws Exception {
}
}
@Test
public void testCloneNoTags() throws IOException, JGitInternalException,
GitAPIException, URISyntaxException {
File directory = createTempDirectory("testCloneRepository");
CloneCommand command = Git.cloneRepository();
command.setDirectory(directory);
command.setURI(fileUri());
command.setNoTags();
Git git2 = command.call();
addRepoToClose(git2.getRepository());
assertNotNull(git2);
assertNotNull(git2.getRepository().resolve("refs/heads/test"));
assertNull(git2.getRepository().resolve("tag-initial"));
assertNull(git2.getRepository().resolve("tag-for-blob"));
assertTagOption(git2.getRepository(), TagOpt.NO_TAGS);
}
@Test
public void testCloneFollowTags() throws IOException, JGitInternalException,
GitAPIException, URISyntaxException {
File directory = createTempDirectory("testCloneRepository");
CloneCommand command = Git.cloneRepository();
command.setDirectory(directory);
command.setURI(fileUri());
command.setBranch("refs/heads/master");
command.setBranchesToClone(
Collections.singletonList("refs/heads/master"));
command.setTagOption(TagOpt.FETCH_TAGS);
Git git2 = command.call();
addRepoToClose(git2.getRepository());
assertNotNull(git2);
assertNull(git2.getRepository().resolve("refs/heads/test"));
assertNotNull(git2.getRepository().resolve("tag-initial"));
assertNotNull(git2.getRepository().resolve("tag-for-blob"));
assertTagOption(git2.getRepository(), TagOpt.FETCH_TAGS);
}
private void assertTagOption(Repository repo, TagOpt expectedTagOption)
throws URISyntaxException {
RemoteConfig remoteConfig = new RemoteConfig(
repo.getConfig(), "origin");
assertEquals(expectedTagOption, remoteConfig.getTagOpt());
}
private String fileUri() {
return "file://" + git.getRepository().getWorkTree().getAbsolutePath();
}

View File

@ -89,6 +89,8 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
private FETCH_TYPE fetchType;
private TagOpt tagOption;
private enum FETCH_TYPE {
MULTIPLE_BRANCHES, ALL_BRANCHES, MIRROR
}
@ -278,6 +280,9 @@ private FetchResult fetch(Repository clonedRepo, URIish u)
config.setFetchRefSpecs(calculateRefSpecs(fetchType, config.getName()));
config.setMirror(fetchType == FETCH_TYPE.MIRROR);
if (tagOption != null) {
config.setTagOpt(tagOption);
}
config.update(clonedRepo.getConfig());
clonedRepo.getConfig().save();
@ -286,7 +291,12 @@ private FetchResult fetch(Repository clonedRepo, URIish u)
FetchCommand command = new FetchCommand(clonedRepo);
command.setRemote(remote);
command.setProgressMonitor(monitor);
command.setTagOpt(fetchAll ? TagOpt.FETCH_TAGS : TagOpt.AUTO_FOLLOW);
if (tagOption != null) {
command.setTagOpt(tagOption);
} else {
command.setTagOpt(
fetchAll ? TagOpt.FETCH_TAGS : TagOpt.AUTO_FOLLOW);
}
configure(command);
return command.call();
@ -663,6 +673,30 @@ public CloneCommand setBranchesToClone(Collection<String> branchesToClone) {
return this;
}
/**
* Set the tag option used for the remote configuration explicitly.
*
* @param tagOption
* tag option to be used for the remote config
* @return {@code this}
* @since 5.8
*/
public CloneCommand setTagOption(TagOpt tagOption) {
this.tagOption = tagOption;
return this;
}
/**
* Set the --no-tags option. Tags are not cloned now and the remote
* configuration is initialized with the --no-tags option as well.
*
* @return {@code this}
* @since 5.8
*/
public CloneCommand setNoTags() {
return setTagOption(TagOpt.NO_TAGS);
}
/**
* Set whether to skip checking out a branch
*