package it.com.atlassian.labs.speakeasy.util;
import com.atlassian.pageobjects.ProductInstance;
import com.atlassian.pageobjects.TestedProduct;
import com.atlassian.plugin.util.zip.FileUnzipper;
import it.com.atlassian.labs.speakeasy.util.jgit.FixedTransportHttp;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.NoMessageException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.transport.*;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import static it.com.atlassian.labs.speakeasy.ExtensionBuilder.buildSimpleExtensionFile;
import static it.com.atlassian.labs.speakeasy.util.TempHelp.getTempDir;
/**
*
*/
public class GitUtils
{
static {
Transport.register(FixedTransportHttp.PROTO_HTTP);
}
public static Git gitClone(ProductInstance product, String extensionKey) throws URISyntaxException, IOException
{
String sourceUri = getGitRepositoryUrl(product, extensionKey);
Git git = Git.cloneRepository()
.setDirectory(getTempDir(extensionKey))
.setBare(false)
.setURI(sourceUri)
.setCredentialsProvider(new UsernamePasswordCredentialsProvider("admin", "admin"))
.call();
return git;
}
public static String getGitRepositoryUrl(ProductInstance product, String extensionKey)
{
return product.getBaseUrl() + "/plugins/servlet/git/" + extensionKey + ".git";
}
public static void push(Git git, String remote) throws InvalidRemoteException
{
System.out.println("Pushing " + remote);
Iterable<PushResult> results = git.push()
.setRemote(remote)
.setCredentialsProvider(new UsernamePasswordCredentialsProvider("admin", "admin"))
.setForce(true)
.call();
for (PushResult result : results)
{
System.out.println("git output: " + result.getMessages());
}
}
public static Git createNewLocalRepository(ProductInstance product, String key) throws IOException, NoFilepatternException, NoHeadException, NoMessageException, ConcurrentRefUpdateException, WrongRepositoryStateException, InvalidRemoteException, URISyntaxException
{
File pluginJar = buildSimpleExtensionFile("gitTest");
File dir = getTempDir(key);
new FileUnzipper(pluginJar, dir).unzip();
Git git = Git.init()
.setDirectory(dir)
.setBare(false)
.call();
git.add()
.addFilepattern(".")
.call();
git.commit()
.setAll(true)
.setMessage("initial")
.setCommitter("admin", "admin@example.com")
.call();
addRemote(product, key, "origin", git);
return git;
}
public static Git addRemote(ProductInstance product, String key, String remoteName, Git git) throws IOException
{
StoredConfig config = git.getRepository().getConfig();
config.setString("remote", remoteName, "url", getGitRepositoryUrl(product, key));
config.setString("remote", remoteName, "fetch", "+refs/heads/*:refs/remotes/origin/*");
config.save();
return git;
}
}