package com.tw.go.plugin.provider.github;
import com.tw.go.plugin.provider.DefaultProvider;
import com.tw.go.plugin.setting.DefaultPluginConfigurationView;
import com.tw.go.plugin.setting.PluginSettings;
import com.tw.go.plugin.util.StringUtils;
import org.kohsuke.github.GHCommitState;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GitHub;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class GitHubProvider extends DefaultProvider {
public static final String PLUGIN_ID = "github.pr.status";
public static final String GITHUB_PR_POLLER_PLUGIN_ID = "github.pr";
public GitHubProvider() {
super(new DefaultPluginConfigurationView());
}
@Override
public String pluginId() {
return PLUGIN_ID;
}
@Override
public String pollerPluginId() {
return GITHUB_PR_POLLER_PLUGIN_ID;
}
@Override
public void updateStatus(String url, PluginSettings pluginSettings, String prIdStr, String revision, String pipelineStage,
String result, String trackbackURL) throws Exception {
String repository = getRepository(url);
GHCommitState state = getState(result);
String endPointToUse = pluginSettings.getEndPoint();
String usernameToUse = pluginSettings.getUsername();
String passwordToUse = pluginSettings.getPassword();
String oauthAccessTokenToUse = pluginSettings.getOauthToken();
if (StringUtils.isEmpty(endPointToUse)) {
endPointToUse = System.getProperty("go.plugin.build.status.github.endpoint");
}
if (StringUtils.isEmpty(usernameToUse)) {
usernameToUse = System.getProperty("go.plugin.build.status.github.username");
}
if (StringUtils.isEmpty(passwordToUse)) {
passwordToUse = System.getProperty("go.plugin.build.status.github.password");
}
if (StringUtils.isEmpty(oauthAccessTokenToUse)) {
oauthAccessTokenToUse = System.getProperty("go.plugin.build.status.github.oauth");
}
updateCommitStatus(revision, pipelineStage, trackbackURL, repository, state, usernameToUse, passwordToUse, oauthAccessTokenToUse, endPointToUse);
}
@Override
public List<Map<String, Object>> validateConfig(Map<String, Object> fields) {
return new ArrayList<Map<String, Object>>();
}
void updateCommitStatus(String revision, String pipelineStage, String trackbackURL, String repository, GHCommitState state,
String usernameToUse, String passwordToUse, String oauthAccessTokenToUse, String endPointToUse) throws Exception {
GitHub github = createGitHubClient(usernameToUse, passwordToUse, oauthAccessTokenToUse, endPointToUse);
GHRepository ghRepository = github.getRepository(repository);
ghRepository.createCommitStatus(revision, state, trackbackURL, "", pipelineStage);
}
GitHub createGitHubClient(String usernameToUse, String passwordToUse, String oauthAccessTokenToUse, String endPointToUse) throws Exception {
GitHub github = null;
if (usernameAndPasswordIsAvailable(usernameToUse, passwordToUse)) {
if (endPointIsAvailable(endPointToUse)) {
github = GitHub.connectToEnterprise(endPointToUse, usernameToUse, passwordToUse);
} else {
github = GitHub.connectUsingPassword(usernameToUse, passwordToUse);
}
}
if (oAuthTokenIsAvailable(oauthAccessTokenToUse)) {
if (endPointIsAvailable(endPointToUse)) {
github = GitHub.connectUsingOAuth(endPointToUse, oauthAccessTokenToUse);
} else {
github = GitHub.connectUsingOAuth(oauthAccessTokenToUse);
}
}
if (github == null) {
github = GitHub.connect();
}
return github;
}
String getRepository(String url) {
String[] urlParts = url.split("/");
String repo = urlParts[urlParts.length - 1];
String usernameWithSSHPrefix = urlParts[urlParts.length - 2];
int positionOfColon = usernameWithSSHPrefix.lastIndexOf(":");
if (positionOfColon > 0) {
usernameWithSSHPrefix = usernameWithSSHPrefix.substring(positionOfColon + 1);
}
String urlWithoutPrefix = String.format("%s/%s", usernameWithSSHPrefix, repo);
if (urlWithoutPrefix.endsWith(".git")) return urlWithoutPrefix.substring(0, urlWithoutPrefix.length() - 4);
else return urlWithoutPrefix;
}
GHCommitState getState(String result) {
result = result == null ? "" : result;
GHCommitState state = GHCommitState.PENDING;
if (result.equalsIgnoreCase("Passed")) {
state = GHCommitState.SUCCESS;
} else if (result.equalsIgnoreCase("Failed")) {
state = GHCommitState.FAILURE;
} else if (result.equalsIgnoreCase("Cancelled")) {
state = GHCommitState.ERROR;
}
return state;
}
private boolean usernameAndPasswordIsAvailable(String usernameToUse, String passwordToUse) {
return !isEmpty(usernameToUse) && !isEmpty(passwordToUse);
}
private boolean oAuthTokenIsAvailable(String oauthAccessTokenToUse) {
return !isEmpty(oauthAccessTokenToUse);
}
private boolean endPointIsAvailable(String endPointToUse) {
return !isEmpty(endPointToUse);
}
private boolean isEmpty(String str) {
return str == null || str.trim().isEmpty();
}
}