package com.justrelease.git;
import com.jcraft.jsch.Session;
import com.justrelease.config.ReleaseConfig;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.TransportConfigCallback;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.SshSessionFactory;
import org.eclipse.jgit.transport.SshTransport;
import org.eclipse.jgit.transport.Transport;
import org.eclipse.jgit.transport.TransportHttp;
import org.kohsuke.github.GHRelease;
import org.kohsuke.github.GHReleaseBuilder;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GHUser;
import org.kohsuke.github.GitHub;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class GitOperations {
private static Git git;
private static void cloneMainRepo(GithubRepo repo) throws GitAPIException, IOException {
Git.cloneRepository()
.setURI(repo.getRepoUrl())
.setDirectory(new File(repo.getLocalDirectory()))
.setTransportConfigCallback(getTransportConfigCallback())
.setBranch(repo.getBranch())
.call();
}
public static void pushRepoWithTags() throws GitAPIException, IOException {
System.out.println("Pushing repository with tags...");
git.push().setTransportConfigCallback(getTransportConfigCallback()).call();
git.push().setTransportConfigCallback(getTransportConfigCallback()).setPushTags().call();
}
public static void commit(String commitMessage) throws IOException, GitAPIException {
git.add().addFilepattern(".").call();
git.commit().setMessage(commitMessage).call();
}
public static void tagAndCommit(String commitMessage, String tagName) throws IOException, GitAPIException {
git.tag().setName(tagName).call();
commit(commitMessage);
}
public static TransportConfigCallback getTransportConfigCallback() {
final SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host host, Session session) {
}
};
return new TransportConfigCallback() {
public void configure(Transport transport) {
if (transport instanceof TransportHttp) return;
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(sshSessionFactory);
}
};
}
public static void initializeLocalRepository(GithubRepo mainRepo) throws IOException, GitAPIException {
String localDirectory = mainRepo.getLocalDirectory();
//delete and clone the source
FileUtils.deleteDirectory(new File(localDirectory));
cloneMainRepo(mainRepo);
git = Git.open(new File(localDirectory));
}
public static void createGithubReleasePage(ReleaseConfig releaseConfig, String latestTag) throws IOException, InterruptedException {
System.out.println("Connecting to GitHub for uploading artifacts");
GitHub github = GitHub.connect();
GHUser user = github.getUser(releaseConfig.getMainRepo().getUsername());
GHRepository releaseRepository = user.getRepository(releaseConfig.getMainRepo().getRepository());
GHReleaseBuilder ghReleaseBuilder = new GHReleaseBuilder(releaseRepository, releaseConfig.getConfig().getTagName());
ghReleaseBuilder.name(releaseConfig.getConfig().getTagName());
if (releaseConfig.getConfig().getDescription() == null) {
String command2;
if (!latestTag.equals("")) {
command2 = "git log " + latestTag + "..HEAD --oneline";
} else {
command2 = "git log --oneline";
}
Process p2 = Runtime.getRuntime().exec(command2, null, releaseConfig.getMainRepo().getFolderToExecute());
p2.waitFor();
String output = IOUtils.toString(p2.getInputStream());
ghReleaseBuilder.body(output);
} else {
System.out.println("Tag Description File Name: " + releaseConfig.getConfig().getDescription());
InputStream fis = new FileInputStream(releaseConfig.getMainRepo().getLocalDirectory() +
File.separator +
releaseConfig.getConfig().getDescription());
InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr);
String line;
String out = "";
while ((line = br.readLine()) != null) {
out += line;
out += "\n";
}
ghReleaseBuilder.body(out);
}
GHRelease ghRelease = ghReleaseBuilder.create();
if (releaseConfig.getConfig().getAttachment() != null)
ghRelease.uploadAsset(new File((releaseConfig.getMainRepo().getLocalDirectory() +
File.separator +
releaseConfig.getConfig().getAttachment())), "Project Artifact");
}
}