com.liferay.jenkins.results.parser.BaseWorkspaceGitRepository Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com.liferay.jenkins.results.parser
Show all versions of com.liferay.jenkins.results.parser
Liferay Jenkins Results Parser
The newest version!
/**
* SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
*/
package com.liferay.jenkins.results.parser;
import com.google.common.collect.Lists;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* @author Michael Hashimoto
*/
public abstract class BaseWorkspaceGitRepository
extends BaseLocalGitRepository implements WorkspaceGitRepository {
@Override
public void addPropertyOption(String propertyOption) {
if (JenkinsResultsParserUtil.isNullOrEmpty(propertyOption)) {
return;
}
_propertyOptions.add(propertyOption);
}
@Override
public String getBaseBranchSHA() {
return getString("base_branch_sha");
}
@Override
public String getBranchName() {
if (_branchName != null) {
return _branchName;
}
_branchName = JenkinsResultsParserUtil.combine(
getUpstreamBranchName(), "-temp-",
String.valueOf(JenkinsResultsParserUtil.getCurrentTimeMillis()));
return _branchName;
}
@Override
public String getFileContent(String filePath) {
File file = new File(getDirectory(), filePath);
if (!file.exists()) {
return null;
}
try {
String fileContent = JenkinsResultsParserUtil.read(file);
return fileContent.trim();
}
catch (IOException ioException) {
throw new RuntimeException(ioException);
}
}
@Override
public String getGitHubDevBranchName() {
String baseBranchSHA = _getBaseBranchHeadSHA();
String senderBranchSHA = _getSenderBranchHeadSHA();
if (_isPullRequest()) {
baseBranchSHA = getBaseBranchSHA();
senderBranchSHA = getSenderBranchSHA();
}
return GitHubDevSyncUtil.getCacheBranchName(
_getBaseBranchUsername(), getSenderBranchUsername(),
senderBranchSHA, baseBranchSHA);
}
@Override
public String getGitHubURL() {
return getString("git_hub_url");
}
@Override
public List getHistoricalLocalGitCommits() {
if (_historicalLocalGitCommits != null) {
return _historicalLocalGitCommits;
}
if (!has("commits")) {
return new ArrayList<>();
}
_historicalLocalGitCommits = new ArrayList<>();
JSONArray commitsJSONArray = getJSONArray("commits");
GitWorkingDirectory gitWorkingDirectory = getGitWorkingDirectory();
for (int i = 0; i < commitsJSONArray.length(); i++) {
JSONObject commitJSONObject = commitsJSONArray.getJSONObject(i);
_historicalLocalGitCommits.add(
GitCommitFactory.newLocalGitCommit(
commitJSONObject.getString("emailAddress"),
gitWorkingDirectory, commitJSONObject.getString("message"),
commitJSONObject.getString("sha"),
commitJSONObject.getLong("commitTime")));
}
return _historicalLocalGitCommits;
}
@Override
public String getSenderBranchName() {
return getString("sender_branch_name");
}
@Override
public String getSenderBranchSHA() {
return getString("sender_branch_sha");
}
@Override
public String getSenderBranchUsername() {
return getString("sender_branch_username");
}
@Override
public List> partitionLocalGitCommits(
List localGitCommits, int count) {
if (count <= 0) {
throw new IllegalArgumentException("Invalid count " + count);
}
if ((localGitCommits == null) || localGitCommits.isEmpty()) {
return Collections.emptyList();
}
int localGitCommitsSize = localGitCommits.size();
if (count > localGitCommitsSize) {
List> partitionedLocalGitCommits =
new ArrayList<>(localGitCommitsSize);
for (LocalGitCommit localGitCommit : localGitCommits) {
partitionedLocalGitCommits.add(
Lists.newArrayList(localGitCommit));
}
return partitionedLocalGitCommits;
}
List> partitionedLocalGitCommits = new ArrayList<>(
count);
LocalGitCommit lastLocalGitCommit = localGitCommits.remove(
localGitCommits.size() - 1);
if (!localGitCommits.isEmpty()) {
partitionedLocalGitCommits.addAll(
JenkinsResultsParserUtil.partitionByCount(
localGitCommits, count - 1));
}
partitionedLocalGitCommits.add(Lists.newArrayList(lastLocalGitCommit));
return partitionedLocalGitCommits;
}
@Override
public void setBaseBranchSHA(String branchSHA) {
if (!JenkinsResultsParserUtil.isSHA(branchSHA)) {
throw new RuntimeException("Invalid base branch SHA " + branchSHA);
}
put("base_branch_sha", branchSHA);
}
@Override
public void setGitHubURL(String gitHubURL) {
if (gitHubURL == null) {
throw new RuntimeException("GitHub URL is null");
}
if (gitHubURL.equals(optString("git_hub_url")) && !_rebase) {
return;
}
_localGitBranch = null;
_setGitHubURL(gitHubURL);
if (PullRequest.isValidGitHubPullRequestURL(gitHubURL)) {
PullRequest pullRequest = PullRequestFactory.newPullRequest(
gitHubURL);
_upstreamRemoteGitRef = pullRequest.getUpstreamRemoteGitBranch();
_setBaseBranchHeadSHA(_upstreamRemoteGitRef.getSHA());
setBaseBranchSHA(_upstreamRemoteGitRef.getSHA());
_setBaseBranchUsername(_upstreamRemoteGitRef.getUsername());
_senderRemoteGitRef = pullRequest.getSenderRemoteGitBranch();
_setSenderBranchHeadSHA(_senderRemoteGitRef.getSHA());
_setSenderBranchName(_senderRemoteGitRef.getName());
setSenderBranchSHA(_senderRemoteGitRef.getSHA());
_setSenderBranchUsername(_senderRemoteGitRef.getUsername());
}
else if (GitUtil.isValidGitHubRefURL(gitHubURL)) {
_upstreamRemoteGitRef = _getUpstreamRemoteGitRef();
_setBaseBranchHeadSHA(_upstreamRemoteGitRef.getSHA());
setBaseBranchSHA(_upstreamRemoteGitRef.getSHA());
_setBaseBranchUsername(_upstreamRemoteGitRef.getUsername());
_senderRemoteGitRef = GitUtil.getRemoteGitRef(gitHubURL);
_setSenderBranchHeadSHA(_senderRemoteGitRef.getSHA());
_setSenderBranchName(_senderRemoteGitRef.getName());
setSenderBranchSHA(_senderRemoteGitRef.getSHA());
_setSenderBranchUsername(_senderRemoteGitRef.getUsername());
if (_rebase) {
_setBaseBranchHeadSHA(_upstreamRemoteGitRef.getSHA());
setBaseBranchSHA(_upstreamRemoteGitRef.getSHA());
_setBaseBranchUsername(_upstreamRemoteGitRef.getUsername());
}
}
else {
throw new RuntimeException("Invalid GitHub URL " + gitHubURL);
}
validateKeys(_REQUIRED_KEYS);
BuildDatabase buildDatabase = BuildDatabaseUtil.getBuildDatabase();
buildDatabase.putWorkspaceGitRepository(getDirectoryName(), this);
}
@Override
public void setRebase(boolean rebase) {
_rebase = rebase;
}
@Override
public void setSenderBranchSHA(String branchSHA) {
if (!JenkinsResultsParserUtil.isSHA(branchSHA)) {
throw new RuntimeException(
"Invalid sender branch SHA " + branchSHA);
}
put("sender_branch_sha", branchSHA);
if (!_isPullRequest()) {
setBaseBranchSHA(branchSHA);
}
}
@Override
public synchronized void setUp() {
if (_setUp) {
return;
}
System.out.println(toString());
GitWorkingDirectory gitWorkingDirectory = getGitWorkingDirectory();
if (_rebase) {
gitWorkingDirectory.createLocalGitBranch(
getUpstreamBranchName(), true, getBaseBranchSHA());
}
LocalGitBranch localGitBranch = getLocalGitBranch();
gitWorkingDirectory.checkoutLocalGitBranch(localGitBranch);
LocalGitBranch baseLocalGitBranch =
gitWorkingDirectory.createLocalGitBranch(
getUpstreamBranchName(), true, getBaseBranchSHA());
if (_rebase) {
gitWorkingDirectory.rebase(
true, baseLocalGitBranch, localGitBranch);
}
gitWorkingDirectory.reset("--hard " + localGitBranch.getSHA());
gitWorkingDirectory.clean();
gitWorkingDirectory.displayLog();
_setUp = true;
}
@Override
public void storeCommitHistory(List commitSHAs) {
List historicalLocalGitCommits =
getHistoricalLocalGitCommits();
List requiredCommitSHAs = new ArrayList<>();
requiredCommitSHAs.addAll(commitSHAs);
JSONArray commitsJSONArray = new JSONArray();
GitWorkingDirectory gitWorkingDirectory = getGitWorkingDirectory();
int index = 0;
while (index < COMMITS_HISTORY_SIZE_MAX) {
int currentGroupSize = COMMITS_HISTORY_GROUP_SIZE;
if (index >
(COMMITS_HISTORY_SIZE_MAX - COMMITS_HISTORY_GROUP_SIZE)) {
currentGroupSize =
COMMITS_HISTORY_SIZE_MAX % COMMITS_HISTORY_GROUP_SIZE;
}
List localGitCommits = gitWorkingDirectory.log(
index, currentGroupSize);
for (LocalGitCommit localGitCommit : localGitCommits) {
historicalLocalGitCommits.add(localGitCommit);
commitsJSONArray.put(localGitCommit.toJSONObject());
String sha = localGitCommit.getSHA();
if (requiredCommitSHAs.contains(sha)) {
requiredCommitSHAs.remove(sha);
}
if (requiredCommitSHAs.isEmpty()) {
break;
}
}
if (requiredCommitSHAs.isEmpty()) {
break;
}
index += COMMITS_HISTORY_GROUP_SIZE;
}
if (!requiredCommitSHAs.isEmpty()) {
throw new RuntimeException(
"Unable to find the following SHAs: " + requiredCommitSHAs);
}
put("commits", commitsJSONArray);
}
@Override
public void synchronizeToGitHubDev() {
GitHubDevSyncUtil.synchronizeToGitHubDev(getLocalGitBranch(), this);
}
@Override
public void tearDown() {
GitWorkingDirectory gitWorkingDirectory = getGitWorkingDirectory();
gitWorkingDirectory.deleteLockFiles();
LocalGitBranch upstreamLocalGitBranch =
gitWorkingDirectory.getUpstreamLocalGitBranch();
System.out.println(upstreamLocalGitBranch);
gitWorkingDirectory.checkoutLocalGitBranch(upstreamLocalGitBranch);
gitWorkingDirectory.reset("--hard " + upstreamLocalGitBranch.getSHA());
gitWorkingDirectory.clean();
gitWorkingDirectory.cleanTempBranches();
gitWorkingDirectory.displayLog();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getDirectory());
sb.append(" - ");
sb.append(getGitHubURL());
sb.append(" - ");
sb.append(getSenderBranchName());
sb.append(" (");
sb.append(getSenderBranchSHA(), 0, 7);
sb.append(")");
if (_isPullRequest()) {
sb.append(" - ");
sb.append(getUpstreamBranchName());
sb.append(" (");
sb.append(getBaseBranchSHA(), 0, 7);
sb.append(")");
}
return sb.toString();
}
@Override
public void writePropertiesFiles() {
}
protected BaseWorkspaceGitRepository(JSONObject jsonObject) {
super(jsonObject);
validateKeys(_REQUIRED_KEYS);
}
protected BaseWorkspaceGitRepository(
PullRequest pullRequest, String upstreamBranchName) {
super(
pullRequest.getGitHubRemoteGitRepositoryName(), upstreamBranchName);
setGitHubURL(pullRequest.getHtmlURL());
validateKeys(_REQUIRED_KEYS);
}
protected BaseWorkspaceGitRepository(
RemoteGitRef remoteGitRef, String upstreamBranchName) {
super(remoteGitRef.getRepositoryName(), upstreamBranchName);
setGitHubURL(remoteGitRef.getHtmlURL());
validateKeys(_REQUIRED_KEYS);
}
protected synchronized LocalGitBranch getLocalGitBranch() {
if (_localGitBranch != null) {
return _localGitBranch;
}
if (_isPullRequest()) {
_localGitBranch = _createPullRequestLocalGitBranch();
}
else {
_localGitBranch = _createRemoteGitRefLocalGitBranch();
}
return _localGitBranch;
}
protected Properties getProperties(String propertyType) {
Properties buildProperties = new Properties();
Map envMap = System.getenv();
for (Map.Entry envEntry : envMap.entrySet()) {
buildProperties.setProperty(
"env." + envEntry.getKey(), envEntry.getValue());
}
buildProperties.putAll(System.getenv());
try {
buildProperties.putAll(
JenkinsResultsParserUtil.getBuildProperties());
}
catch (IOException ioException) {
throw new RuntimeException(ioException);
}
Properties properties = new Properties();
for (String buildPropertyName : buildProperties.stringPropertyNames()) {
if (!buildPropertyName.startsWith(propertyType)) {
continue;
}
List buildPropertyOptions =
JenkinsResultsParserUtil.getPropertyOptions(buildPropertyName);
if (buildPropertyOptions.isEmpty()) {
continue;
}
String propertyName = buildPropertyOptions.get(0);
List propertyOptions = new ArrayList<>(
getPropertyOptions());
propertyOptions.removeAll(Collections.singleton(null));
String propertyValue = JenkinsResultsParserUtil.getProperty(
buildProperties, propertyType + "[" + propertyName + "]",
propertyOptions.toArray(new String[0]));
if (propertyValue == null) {
continue;
}
if (JenkinsResultsParserUtil.isWindows() &&
propertyValue.startsWith("/") &&
!propertyValue.startsWith("/c/")) {
propertyValue = "C:" + propertyValue;
}
properties.put(propertyName, propertyValue);
}
return properties;
}
protected Set getPropertyOptions() {
return _propertyOptions;
}
private LocalGitBranch _createPullRequestLocalGitBranch() {
GitWorkingDirectory gitWorkingDirectory = getGitWorkingDirectory();
List gitHubDevGitRemotes =
GitHubDevSyncUtil.getGitHubDevGitRemotes(gitWorkingDirectory);
for (int i = 0; i < 3; i++) {
if (gitHubDevGitRemotes.isEmpty()) {
break;
}
GitRemote randomGitRemote =
JenkinsResultsParserUtil.getRandomListItem(gitHubDevGitRemotes);
gitHubDevGitRemotes.remove(randomGitRemote);
String remoteGitBranchSHA = null;
try {
RemoteGitBranch remoteGitBranch =
gitWorkingDirectory.getRemoteGitBranch(
getGitHubDevBranchName(), randomGitRemote);
if (remoteGitBranch == null) {
continue;
}
remoteGitBranchSHA = remoteGitBranch.getSHA();
gitWorkingDirectory.fetch(remoteGitBranch);
}
catch (Exception exception) {
continue;
}
if (JenkinsResultsParserUtil.isNullOrEmpty(remoteGitBranchSHA) ||
!gitWorkingDirectory.localSHAExists(remoteGitBranchSHA)) {
continue;
}
return gitWorkingDirectory.createLocalGitBranch(
getBranchName(), true, remoteGitBranchSHA);
}
String senderBranchSHA = getSenderBranchSHA();
if (!gitWorkingDirectory.localSHAExists(senderBranchSHA)) {
gitWorkingDirectory.fetch(_getSenderRemoteGitRef());
}
String baseBranchSHA = getBaseBranchSHA();
if (!gitWorkingDirectory.localSHAExists(baseBranchSHA)) {
gitWorkingDirectory.fetch(_getUpstreamRemoteGitRef());
}
gitWorkingDirectory.createLocalGitBranch(
getUpstreamBranchName(), true, baseBranchSHA);
return gitWorkingDirectory.getRebasedLocalGitBranch(
getBranchName(), getSenderBranchName(),
JenkinsResultsParserUtil.combine(
"[email protected]:", getSenderBranchUsername(), "/", getName()),
senderBranchSHA, getUpstreamBranchName(), baseBranchSHA);
}
private LocalGitBranch _createRemoteGitRefLocalGitBranch() {
String senderBranchSHA = getSenderBranchSHA();
GitWorkingDirectory gitWorkingDirectory = getGitWorkingDirectory();
if (!gitWorkingDirectory.localSHAExists(senderBranchSHA)) {
List gitHubDevGitRemotes =
GitHubDevSyncUtil.getGitHubDevGitRemotes(gitWorkingDirectory);
for (int i = 0; i < 3; i++) {
if (gitHubDevGitRemotes.isEmpty()) {
break;
}
GitRemote randomGitRemote =
JenkinsResultsParserUtil.getRandomListItem(
gitHubDevGitRemotes);
gitHubDevGitRemotes.remove(randomGitRemote);
RemoteGitBranch remoteGitBranch =
gitWorkingDirectory.getRemoteGitBranch(
getGitHubDevBranchName(), randomGitRemote);
if (remoteGitBranch == null) {
continue;
}
try {
gitWorkingDirectory.fetch(remoteGitBranch);
}
catch (Exception exception) {
continue;
}
if (!gitWorkingDirectory.localSHAExists(senderBranchSHA)) {
continue;
}
break;
}
if (!gitWorkingDirectory.localSHAExists(senderBranchSHA)) {
gitWorkingDirectory.fetch(_getSenderRemoteGitRef());
}
}
return gitWorkingDirectory.createLocalGitBranch(
getBranchName(), true, getSenderBranchSHA());
}
private String _getBaseBranchHeadSHA() {
return getString("base_branch_head_sha");
}
private String _getBaseBranchUsername() {
return getString("base_branch_username");
}
private String _getSenderBranchHeadSHA() {
return getString("sender_branch_head_sha");
}
private RemoteGitRef _getSenderRemoteGitRef() {
if (_senderRemoteGitRef != null) {
return _senderRemoteGitRef;
}
_senderRemoteGitRef = GitUtil.getRemoteGitRef(
JenkinsResultsParserUtil.combine(
"https://github.com/", getSenderBranchUsername(), "/",
getName(), "/tree/", getSenderBranchName()));
return _senderRemoteGitRef;
}
private RemoteGitRef _getUpstreamRemoteGitRef() {
if (_upstreamRemoteGitRef != null) {
return _upstreamRemoteGitRef;
}
String name = getName();
String upstreamBranchName = getUpstreamBranchName();
_upstreamRemoteGitRef = GitUtil.getRemoteGitRef(
JenkinsResultsParserUtil.combine(
"https://github.com/",
JenkinsResultsParserUtil.getUpstreamUserName(
name, upstreamBranchName),
"/", name, "/tree/", upstreamBranchName));
return _upstreamRemoteGitRef;
}
private boolean _isPullRequest() {
return PullRequest.isValidGitHubPullRequestURL(getGitHubURL());
}
private void _setBaseBranchHeadSHA(String branchSHA) {
if (!JenkinsResultsParserUtil.isSHA(branchSHA)) {
throw new RuntimeException(
"Invalid base branch head SHA " + branchSHA);
}
put("base_branch_head_sha", branchSHA);
}
private void _setBaseBranchUsername(String username) {
put("base_branch_username", username);
}
private void _setGitHubURL(String gitHubURL) {
if (gitHubURL == null) {
throw new RuntimeException("GitHub URL is null");
}
put("git_hub_url", gitHubURL);
}
private void _setSenderBranchHeadSHA(String branchSHA) {
if (!JenkinsResultsParserUtil.isSHA(branchSHA)) {
throw new RuntimeException(
"Invalid sender branch head SHA " + branchSHA);
}
put("sender_branch_head_sha", branchSHA);
}
private void _setSenderBranchName(String branchName) {
put("sender_branch_name", branchName);
}
private void _setSenderBranchUsername(String username) {
put("sender_branch_username", username);
}
private static final String[] _REQUIRED_KEYS = {
"base_branch_head_sha", "base_branch_sha", "base_branch_username",
"git_hub_url", "sender_branch_head_sha", "sender_branch_name",
"sender_branch_sha", "sender_branch_username"
};
private String _branchName;
private List _historicalLocalGitCommits;
private LocalGitBranch _localGitBranch;
private final Set _propertyOptions = new HashSet<>();
private boolean _rebase;
private RemoteGitRef _senderRemoteGitRef;
private boolean _setUp;
private RemoteGitRef _upstreamRemoteGitRef;
}