package com.github.danielflower.mavenplugins.release;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.StoredConfig;
import org.junit.Test;
import scaffolding.TestProject;
import java.util.ArrayList;
import java.util.List;
import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static scaffolding.TestProject.dirToGitScmReference;
import static com.github.danielflower.mavenplugins.release.GitHelper.scmUrlToRemote;
public class LocalGitRepoTest {
TestProject project = TestProject.singleModuleProject();
@Test
public void canDetectLocalTags() throws GitAPIException {
LocalGitRepo repo = new LocalGitRepo(project.local, null);
tag(project.local, "some-tag");
assertThat(repo.hasLocalTag("some-tag"), is(true));
assertThat(repo.hasLocalTag("some-ta"), is(false));
assertThat(repo.hasLocalTag("some-tagyo"), is(false));
}
@Test
public void canDetectRemoteTags() throws Exception {
LocalGitRepo repo = new LocalGitRepo(project.local, null);
tag(project.origin, "some-tag");
assertThat(repo.remoteTagsFrom(tags("blah", "some-tag")), equalTo(asList("some-tag")));
assertThat(repo.remoteTagsFrom(tags("blah", "some-taggart")), equalTo(emptyList()));
}
@Test
public void usesThePassedInScmUrlToFindRemote() throws Exception {
LocalGitRepo repo = new LocalGitRepo(project.local, scmUrlToRemote(dirToGitScmReference(project.originDir)));
tag(project.origin, "some-tag");
StoredConfig config = project.local.getRepository().getConfig();
config.unsetSection("remote", "origin");
config.save();
assertThat(repo.remoteTagsFrom(tags("blah", "some-tag")), equalTo(asList("some-tag")));
}
@Test
public void canHaveManyTags() throws GitAPIException {
int numberOfTags = 50; // setting this to 1000 works but takes too long
for (int i = 0; i < numberOfTags; i++) {
tag(project.local, "this-is-a-tag-" + i);
}
project.local.push().setPushTags().call();
LocalGitRepo repo = new LocalGitRepo(project.local, null);
for (int i = 0; i < numberOfTags; i++) {
String tagName = "this-is-a-tag-" + i;
assertThat(repo.hasLocalTag(tagName), is(true));
assertThat(repo.remoteTagsFrom(tags(tagName)).size(), is(1));
}
}
private static List<AnnotatedTag> tags(String... tagNames) {
List<AnnotatedTag> tags = new ArrayList<AnnotatedTag>();
for (String tagName : tagNames) {
tags.add(AnnotatedTag.create(tagName, "1", 0));
}
return tags;
}
private static List<String> emptyList() {
return new ArrayList<String>();
}
private static void tag(Git repo, String name) throws GitAPIException {
repo.tag().setAnnotated(true).setName(name).setMessage("Some message").call();
}
}