package ru.yandex.jenkins.plugins.debuilder;
import hudson.EnvVars;
import hudson.model.TaskListener;
import hudson.model.AbstractBuild;
import hudson.plugins.git.GitSCM;
import hudson.remoting.VirtualChannel;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import jenkins.model.Jenkins;
import jenkins.SlaveToMasterFileCallable;
import org.eclipse.jgit.lib.PersonIdent;
import org.jenkinsci.plugins.gitclient.Git;
import org.jenkinsci.plugins.gitclient.GitClient;
import ru.yandex.jenkins.plugins.debuilder.DebUtils.Runner;
import ru.yandex.jenkins.plugins.debuilder.DebianPackageBuilder.DescriptorImpl;
/**
* Performs git commiting actions in a remote WS, namely, commiting changelog to the current branch
* Note to future self: all the fields should be serializable
*
* @author pupssman
*
*/
public class GitCommitHelper extends SlaveToMasterFileCallable<Boolean> {
private static final long serialVersionUID = 1L;
private final EnvVars environment;
private final TaskListener listener;
private final String gitExe;
private final String gitPrefix;
private final String accountName;
private final String accountEmail;
private final String commitMessage;
private Collection<String> modules;
public GitCommitHelper(AbstractBuild<?, ?> build, GitSCM scm, Runner runner, String commitMessage, Collection<String> modules) throws IOException, InterruptedException {
this.commitMessage = commitMessage;
this.modules = modules;
this.environment = build.getEnvironment(runner.getListener());
this.listener = runner.getListener();
this.gitExe = scm.getGitExe(build.getBuiltOn(), listener);
this.gitPrefix = scm.getRelativeTargetDir();
DescriptorImpl descriptor = (DescriptorImpl) Jenkins.getInstance().getDescriptor(DebianPackageBuilder.class);
this.accountName = descriptor.getAccountName();
this.accountEmail = descriptor.getAccountEmail();
}
@Override
public Boolean invoke(File localWorkspace, VirtualChannel channel) throws IOException,
InterruptedException {
File gitClonePath = localWorkspace;
if (gitPrefix != null) {
gitClonePath = new File(localWorkspace, gitPrefix);
}
GitClient git = Git.with(listener, environment)
.in(gitClonePath).using(gitExe)
.getClient();
if (git.hasGitRepo()) {
PersonIdent person = new PersonIdent(accountName, accountEmail);
for (String module: modules) {
git.add(new File(module, "debian/changelog").getCanonicalPath());
}
git.setAuthor(person);
git.setCommitter(person);
git.commit(commitMessage);
return true;
} else {
return false;
}
}
}