package zielu.gittoolbox.tag;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import git4idea.commands.GitCommand;
import git4idea.commands.GitHandlerUtil;
import git4idea.commands.GitSimpleHandler;
import git4idea.util.StringScanner;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jetbrains.annotations.NotNull;
import zielu.gittoolbox.ResBundle;
public class GitTagCalculator {
private static final Pattern singleTagPattern = Pattern.compile(".*?\\(tag: (.+?)\\).*");
private static final Pattern tagPattern = Pattern.compile("tag: (.+?)");
private final Project myProject;
private GitTagCalculator(Project project) {
myProject = project;
}
public static GitTagCalculator create(@NotNull Project project) {
return new GitTagCalculator(Preconditions.checkNotNull(project));
}
public List<String> tagsForBranch(@NotNull VirtualFile gitRoot, @NotNull String branch) {
GitSimpleHandler h = new GitSimpleHandler(myProject, Preconditions.checkNotNull(gitRoot), GitCommand.LOG);
h.addParameters("--simplify-by-decoration", "--pretty=format:%d", "--encoding=UTF-8", Preconditions.checkNotNull(branch));
h.setSilent(true);
String output = GitHandlerUtil.doSynchronously(h, ResBundle.getString("tag.getting.existing.tags"), h.printableCommandLine());
List<String> tags = Lists.newArrayList();
for (StringScanner s = new StringScanner(output); s.hasMoreData(); ) {
String line = s.line();
Matcher match = singleTagPattern.matcher(line);
if (match.matches()) {
tags.add(match.group(1));
} else if (line.contains("tag: ")) {
tags.addAll(parseMultipleTags(line));
}
}
return tags;
}
private List<String> parseMultipleTags(String line) {
List<String> tags = Lists.newArrayList();
for (String spec : Splitter.on(", ").split(line)) {
Matcher match = tagPattern.matcher(spec);
if (match.matches()) {
tags.add(match.group(1));
}
}
return tags;
}
public List<String> allTags(@NotNull VirtualFile gitRoot) {
GitSimpleHandler h = new GitSimpleHandler(myProject, Preconditions.checkNotNull(gitRoot), GitCommand.TAG);
h.setSilent(true);
String output = GitHandlerUtil.doSynchronously(h, ResBundle.getString("tag.getting.tags.for.branch"), h.printableCommandLine());
LinkedList<String> tags = Lists.newLinkedList();
for (StringScanner s = new StringScanner(output); s.hasMoreData(); ) {
String line = s.line();
if (line.length() == 0) {
continue;
}
tags.addFirst(line);
}
return Lists.newArrayList(tags);
}
}