Merge branch 'master' into add-create-repo-with-template-support

This commit is contained in:
Liam Newman
2020-08-04 16:05:02 -07:00
committed by GitHub
67 changed files with 4873 additions and 27 deletions

View File

@@ -9,6 +9,8 @@ import java.net.URL;
import java.util.Collection;
import java.util.Objects;
import javax.annotation.CheckForNull;
/**
* A branch in a repository.
*
@@ -165,6 +167,59 @@ public class GHBranch {
}
}
/**
* Merge a branch into this branch.
*
* @param headBranch
* the branch whose head will be merged
*
* @param commitMessage
* the commit message
*
* @return the merge {@link GHCommit} created, or {@code null} if the base already contains the head (nothing to
* merge).
*
* @throws IOException
* if merging fails
*/
@CheckForNull
public GHCommit merge(GHBranch headBranch, String commitMessage) throws IOException {
return merge(headBranch.getName(), commitMessage);
}
/**
* Merge a ref into this branch.
*
* @param head
* the ref name that will be merged into this branch. Follows the usual ref naming rules, could be a
* branch name, tag, or commit sha.
*
* @param commitMessage
* the commit message
*
* @return the merge {@link GHCommit} created, or {@code null} if the base already contains the head (nothing to
* merge).
*
* @throws IOException
* if merging fails
*/
@CheckForNull
public GHCommit merge(String head, String commitMessage) throws IOException {
GHCommit result = root.createRequest()
.withUrlPath(owner.getApiTailUrl("merges"))
.method("POST")
.with("commit_message", commitMessage)
.with("base", this.name)
.with("head", head)
.fetch(GHCommit.class);
if (result != null) {
result.wrapUp(owner);
}
return result;
}
String getApiRoute() {
return owner.getApiTailUrl("/branches/" + name);
}

View File

@@ -1,10 +1,14 @@
package org.kohsuke.github;
import com.fasterxml.jackson.annotation.JsonProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/**
* Represents a check run.
@@ -14,6 +18,8 @@ import java.util.Date;
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD", "URF_UNREAD_FIELD" },
justification = "JSON API")
public class GHCheckRun extends GHObject {
@JsonProperty("repository")
GHRepository owner;
GitHub root;
@@ -34,7 +40,7 @@ public class GHCheckRun extends GHObject {
GHCheckRun wrap(GHRepository owner) {
this.owner = owner;
this.root = owner.root;
wrap(owner.root);
return this;
}
@@ -42,7 +48,24 @@ public class GHCheckRun extends GHObject {
this.root = root;
if (owner != null) {
owner.wrap(root);
if (pullRequests != null && pullRequests.length != 0) {
for (GHPullRequest singlePull : pullRequests) {
singlePull.wrap(owner);
}
}
}
if (checkSuite != null) {
if (owner != null) {
checkSuite.wrap(owner);
} else {
checkSuite.wrap(root);
}
}
if (app != null) {
app.wrapUp(root);
}
return this;
}
@@ -105,15 +128,22 @@ public class GHCheckRun extends GHObject {
/**
* Gets the pull requests participated in this check run.
*
* @return Pull requests of this check run
* Note this field is only populated for events. When getting a {@link GHCheckRun} outside of an event, this is
* always empty.
*
* @return the list of {@link GHPullRequest}s for this check run. Only populated for events.
* @throws IOException
* the io exception
*/
GHPullRequest[] getPullRequests() throws IOException {
public List<GHPullRequest> getPullRequests() throws IOException {
if (pullRequests != null && pullRequests.length != 0) {
for (GHPullRequest singlePull : pullRequests) {
singlePull.refresh();
// Only refresh if we haven't do so before
singlePull.refresh(singlePull.getTitle());
}
return Collections.unmodifiableList(Arrays.asList(pullRequests));
}
return pullRequests;
return Collections.emptyList();
}
/**

View File

@@ -1,10 +1,14 @@
package org.kohsuke.github;
import com.fasterxml.jackson.annotation.JsonProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/**
* Represents a check suite.
@@ -14,6 +18,8 @@ import java.util.Date;
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD", "URF_UNREAD_FIELD" },
justification = "JSON API")
public class GHCheckSuite extends GHObject {
@JsonProperty("repository")
GHRepository owner;
GitHub root;
@@ -32,7 +38,7 @@ public class GHCheckSuite extends GHObject {
GHCheckSuite wrap(GHRepository owner) {
this.owner = owner;
this.root = owner.root;
this.wrap(owner.root);
return this;
}
@@ -40,6 +46,14 @@ public class GHCheckSuite extends GHObject {
this.root = root;
if (owner != null) {
owner.wrap(root);
if (pullRequests != null && pullRequests.length != 0) {
for (GHPullRequest singlePull : pullRequests) {
singlePull.wrap(owner);
}
}
}
if (app != null) {
app.wrapUp(root);
}
return this;
}
@@ -153,15 +167,22 @@ public class GHCheckSuite extends GHObject {
/**
* Gets the pull requests participated in this check suite.
*
* @return Pull requests
* Note this field is only populated for events. When getting a {@link GHCheckSuite} outside of an event, this is
* always empty.
*
* @return the list of {@link GHPullRequest}s for this check suite. Only populated for events.
* @throws IOException
* the io exception
*/
GHPullRequest[] getPullRequests() throws IOException {
public List<GHPullRequest> getPullRequests() throws IOException {
if (pullRequests != null && pullRequests.length != 0) {
for (GHPullRequest singlePull : pullRequests) {
singlePull.refresh();
// Only refresh if we haven't do so before
singlePull.refresh(singlePull.getTitle());
}
return Collections.unmodifiableList(Arrays.asList(pullRequests));
}
return pullRequests;
return Collections.emptyList();
}
/**

View File

@@ -63,6 +63,7 @@ public enum GHEvent {
TEAM_ADD,
WATCH,
WORKFLOW_DISPATCH,
WORKFLOW_RUN,
/**
* Special event type that means "every possible event"

View File

@@ -239,7 +239,7 @@ public class GHIssue extends GHObject implements Reactable {
}
private void editIssue(String key, Object value) throws IOException {
root.createRequest().with(key, value).method("PATCH").withUrlPath(getIssuesApiRoute()).send();
root.createRequest().withNullable(key, value).method("PATCH").withUrlPath(getIssuesApiRoute()).send();
}
/**
@@ -296,9 +296,9 @@ public class GHIssue extends GHObject implements Reactable {
*/
public void setMilestone(GHMilestone milestone) throws IOException {
if (milestone == null) {
editNullable("milestone", null);
editIssue("milestone", null);
} else {
edit("milestone", milestone.getNumber());
editIssue("milestone", milestone.getNumber());
}
}

View File

@@ -465,7 +465,7 @@ public class GHOrganization extends GHPerson {
* The enum Permission.
*/
public enum Permission {
ADMIN, PUSH, PULL
ADMIN, MAINTAIN, PUSH, TRIAGE, PULL
}
/**

View File

@@ -532,7 +532,7 @@ public class GitHub {
}
/**
* Gets the repository object from 'user/reponame' string that GitHub calls as "repository name"
* Gets the repository object from 'owner/repo' string that GitHub calls as "repository name"
*
* @param name
* the name
@@ -543,6 +543,9 @@ public class GitHub {
*/
public GHRepository getRepository(String name) throws IOException {
String[] tokens = name.split("/");
if (tokens.length < 2) {
throw new IllegalArgumentException("Repository name must be in format owner/repo");
}
return createRequest().withUrlPath("/repos/" + tokens[0] + '/' + tokens[1])
.fetch(GHRepository.class)
.wrap(this);

View File

@@ -78,9 +78,14 @@ class GitHubResponse<T> {
@CheckForNull
static <T> T parseBody(ResponseInfo responseInfo, Class<T> type) throws IOException {
if (responseInfo.statusCode() == HttpURLConnection.HTTP_NO_CONTENT && type != null && type.isArray()) {
// no content
return type.cast(Array.newInstance(type.getComponentType(), 0));
if (responseInfo.statusCode() == HttpURLConnection.HTTP_NO_CONTENT) {
if (type != null && type.isArray()) {
// no content for array should be empty array
return type.cast(Array.newInstance(type.getComponentType(), 0));
} else {
// no content for object should be null
return null;
}
}
String data = responseInfo.getBodyAsString();