summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Nittka <alex@nittka.de>2020-03-11 11:58:03 +0100
committerAlexander Nittka <alex@nittka.de>2020-03-15 15:34:21 +0100
commit769606d0597431b96a45378ede6824729190315a (patch)
tree62f3753d9ecbc909874cc38637c3e14b914e6ed1
parent04e16afb05912f3a163d8cda3560a5b2f1ea997f (diff)
downloadjgit-769606d0597431b96a45378ede6824729190315a.tar.gz
jgit-769606d0597431b96a45378ede6824729190315a.zip
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>
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CloneCommandTest.java46
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java36
2 files changed, 81 insertions, 1 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 3d0dacab3d..b737bbec0e 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
@@ -44,6 +44,7 @@ import org.eclipse.jgit.submodule.SubmoduleStatusType;
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 class CloneCommandTest extends RepositoryTestCase {
.size());
assertEquals(new RefSpec("+refs/heads/*:refs/remotes/origin/*"),
fetchRefSpec(git2.getRepository()));
+ assertTagOption(git2.getRepository(), TagOpt.AUTO_FOLLOW);
}
@Test
@@ -801,6 +803,50 @@ public class CloneCommandTest extends RepositoryTestCase {
}
}
+ @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();
}
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 78afe18f39..30d7f9adc4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java
@@ -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 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
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 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
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();
@@ -664,6 +674,30 @@ public class CloneCommand extends TransportCommand<CloneCommand, Git> {
}
/**
+ * 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
*
* @param noCheckout