Compare commits

...

63 Commits

Author SHA1 Message Date
Kohsuke Kawaguchi
5194a361f4 [maven-release-plugin] prepare release github-api-1.94 2018-08-29 21:05:21 -07:00
Kohsuke Kawaguchi
c44e5d2a87 findbugs fix 2018-08-29 21:00:24 -07:00
Kohsuke Kawaguchi
ee4d514b66 close an opened stream 2018-08-29 20:48:44 -07:00
Kohsuke Kawaguchi
863995cb50 findbugs warning fix 2018-08-29 20:48:36 -07:00
Kohsuke Kawaguchi
cbfe72a76e Fixed a broken test 2018-08-29 20:31:44 -07:00
Kohsuke Kawaguchi
4f17d3519c Merge pull request #411 from tadfisher/master
Add GHRepository.getRelease and GHRepository.getReleaseByTagName
2018-08-30 05:22:26 +02:00
Kohsuke Kawaguchi
3cfcad76ac Merge pull request #417 from twcurrie/tcurrie/revisions
Added release payload.
2018-08-30 05:21:24 +02:00
Kohsuke Kawaguchi
1ca6535811 Merge pull request #449 from martinvanzijl/issue_426_fix_nullptr_when_deleting_refs
Fix for issue #426. Fix null pointer when deleting refs.
2018-08-30 05:21:09 +02:00
Kohsuke Kawaguchi
53612ad2e4 Merge pull request #446 from daniel-beck/fix-page-size
Fix pagination for APIs that supported it ad hoc
2018-08-30 05:20:53 +02:00
Kohsuke Kawaguchi
4b799d264c Merge pull request #443 from Arrow768/GHEventPayload_Issue
Adds the GHEventPayload.Issue class
2018-08-30 05:20:26 +02:00
Kohsuke Kawaguchi
ca5594703a Merge pull request #439 from l3ender/master
Add support for repository searching by "topic"
2018-08-30 05:20:03 +02:00
Kohsuke Kawaguchi
7fc2d9dcca Merge remote-tracking branch 'origin/master' 2018-08-29 20:19:14 -07:00
Kohsuke Kawaguchi
c413fc1e30 Merge pull request #438 from jgangemi/jae/issue-434
- added overloaded 'uploadAsset' method
2018-08-30 05:18:51 +02:00
Kohsuke Kawaguchi
b5086c7759 Merge pull request #437 2018-08-29 20:18:21 -07:00
Kohsuke Kawaguchi
92a015ca4d Clear up import statements 2018-08-29 20:18:10 -07:00
Kohsuke Kawaguchi
3b2802e36d minor doc improvement 2018-08-29 20:18:00 -07:00
Kohsuke Kawaguchi
7bf23eaa15 Merge pull request #436 from jgangemi/jae/rm-exception
- remove unthrown IOException
2018-08-30 05:16:28 +02:00
Kohsuke Kawaguchi
9afd1c5ee8 Merge pull request #435 2018-08-29 20:15:08 -07:00
Kohsuke Kawaguchi
5e36377b36 It appears LOKI preview is done and all those methods are now final 2018-08-29 20:15:01 -07:00
Kohsuke Kawaguchi
c988df13a8 Use a short form 2018-08-29 20:15:01 -07:00
Kohsuke Kawaguchi
29a40d31b7 TAB -> space 2018-08-29 20:15:01 -07:00
Kohsuke Kawaguchi
ddc27e818b Let's not yet expose this new class because it's not final 2018-08-29 20:15:01 -07:00
Kohsuke Kawaguchi
3fa70ac841 doc improvement 2018-08-29 19:05:56 -07:00
Kohsuke Kawaguchi
b2b7dfaf37 Massaged the change to match the existing API design convention 2018-08-29 19:05:19 -07:00
Martin van Zijl
c309c2cf13 Fix for issue #426. Fix null pointer when deleting refs. 2018-08-13 12:36:15 +12:00
Daniel Beck
0ffcbdbd38 Fix pagination for APIs that supported it ad hoc 2018-07-17 11:27:54 +02:00
Werner
e368a17420 Adds the GHEventPayload.Issue class 2018-07-01 12:23:13 +02:00
Sharath
2fcfb2f67d address review comments in supporting updating content with sha 2018-06-12 18:26:20 -07:00
onoguera-ob
f68a85056e Update integration test. 2018-06-12 18:26:20 -07:00
Oliver Noguera
943f47d29d Add sha1 to updateFiles see
https://developer.github.com/v3/repos/contents/#update-a-file
2018-06-12 18:26:20 -07:00
l3ender
fd37a2c466 Add support for repository searching by "topic"
See https://help.github.com/articles/searching-repositories/#search-by-topic
2018-06-06 11:44:46 -05:00
Jae Gangemi
eacdd7afe8 - added overloaded 'uploadAsset' method 2018-05-30 08:18:25 -06:00
Rechi
fe5ea52cdf [feature] implement Repository Invitations API
fixes #374
2018-05-29 22:00:00 +02:00
Jae Gangemi
ca6d77cbb3 - remove unthrown IOException 2018-05-28 17:49:21 -06:00
Jae Gangemi
1145941d11 - add support for signed commits
- add support for required number of reviews
2018-05-27 15:33:58 -06:00
Kohsuke Kawaguchi
d61697a152 [maven-release-plugin] prepare for next development iteration 2018-05-01 07:56:38 -07:00
Kohsuke Kawaguchi
38b77a9c79 [maven-release-plugin] prepare release github-api-1.93 2018-05-01 07:56:27 -07:00
Kohsuke Kawaguchi
7d294ee8c2 Looks like release rollback didn't quite complete 2018-05-01 07:26:09 -07:00
Kohsuke Kawaguchi
33d9422d03 Merge pull request #422 from ggrell/fix-421-enum-case-issue
Fixes #421 - Enum case doesn't match for Pull Request Reviews
2018-05-01 07:19:42 -07:00
Kohsuke Kawaguchi
bb7302c23a Merge branch 'master' of github.com:kohsuke/github-api 2018-05-01 07:18:57 -07:00
Kohsuke Kawaguchi
d50ae63a5a Merge pull request #431 from Rechi/fixPRLabels
[fix] fetch labels with HTTP GET method
2018-05-01 07:18:43 -07:00
Kohsuke Kawaguchi
1961836e19 Merge pull request #427 from itepikin-smartling/master
Add support for previous_filename for file details in PR.
2018-05-01 07:17:32 -07:00
Kohsuke Kawaguchi
f2ed7c15ce Looks like the permission scheme changed on jenkinsci/violations-plugin 2018-05-01 07:12:30 -07:00
Kohsuke Kawaguchi
4dce173630 Extracted the List<GHUser>->List<String> out to Requester for reuse 2018-05-01 07:03:53 -07:00
Kohsuke Kawaguchi
86f868b2d4 Fixed compilation errors introduced by 8b38a20c18 2018-05-01 06:59:03 -07:00
Kohsuke Kawaguchi
363064f5c0 Merge branch 'master' of github.com:kohsuke/github-api 2018-04-30 19:58:33 -07:00
Kohsuke Kawaguchi
9d99ee9cfc Merge pull request #430 from twcurrie/tcurrie/requestReviewer
Added request reviewers function within GHPullRequest.
2018-04-30 19:58:19 -07:00
Rechi
db8969707d [fix] fetch labels with HTTP GET method 2018-04-06 10:00:00 +02:00
Trevor Currie
a24ac37dfd Added request reviewers function within GHPullRequest. 2018-03-28 23:33:08 -07:00
itepikin
1b04d471b3 Added support for previous_filename for file details in PR. 2018-03-22 11:16:09 +03:00
Gyuri Grell
9cc400a081 Fixes #421 - Enum case doesn't match for Pull Request Reviews
* Set Jackson to ignore case differences in enums.
2018-03-01 20:50:00 -05:00
Kohsuke Kawaguchi
e233aeec0c Merge pull request #410 from Limess/409/update-commons-lang
Update commons-lang to 3.7
2018-03-01 09:45:15 -08:00
Kohsuke Kawaguchi
5dfd621900 Merge pull request #420 from randomvariable/fix/tlsv12
OkHttpConnector: Enforce use of TLSv1.2 to match current Github and Github Enterprise TLS support.
2018-03-01 09:43:24 -08:00
Naadir Jeewa
f0f6a9988f OkHttpConnector: Enforce use of TLSv1.2 to match current Github
and Github Enterprise TLS support.
2018-02-28 09:36:15 +00:00
Trevor Currie
587438938c Added release payload. 2018-02-22 09:38:25 -08:00
Tad Fisher
75918c59cc Add GHRepository.getRelease and GHRepository.getReleaseByTagName
These implement the API endpoints for:

- GET /repos/:owner/:repo/releases/:id
- GET /repos/:owner/:repo/releases/tags/:tag
2018-02-05 14:30:24 -08:00
Charlie Briggs
8b38a20c18 Update commons-lang to 3.7
This fixes the vulnerabilities:
* https://issues.apache.org/jira/browse/LANG-1373
* https://issues.apache.org/jira/browse/LANG-805.
2018-01-23 11:00:58 +00:00
Kohsuke Kawaguchi
e7b76bfdc5 Doc improvements 2018-01-21 11:51:04 -08:00
Kohsuke Kawaguchi
3503ff6d36 Additional methods for issue comment 2018-01-21 11:50:22 -08:00
Kohsuke Kawaguchi
192e21a9fc [maven-release-plugin] prepare for next development iteration 2018-01-13 11:52:05 -08:00
Kohsuke Kawaguchi
24e288d584 [maven-release-plugin] prepare release github-api-1.92 2018-01-13 11:51:56 -08:00
Kohsuke Kawaguchi
0e5ffda5e5 Release failed due to javadoc errors 2018-01-13 11:45:57 -08:00
Kohsuke Kawaguchi
cdf6f18ec0 [maven-release-plugin] prepare for next development iteration 2018-01-13 10:36:53 -08:00
34 changed files with 653 additions and 143 deletions

10
pom.xml
View File

@@ -7,7 +7,7 @@
</parent>
<artifactId>github-api</artifactId>
<version>1.91</version>
<version>1.94</version>
<name>GitHub API for Java</name>
<url>http://github-api.kohsuke.org/</url>
<description>GitHub API for Java</description>
@@ -16,7 +16,7 @@
<connection>scm:git:git@github.com/kohsuke/${project.artifactId}.git</connection>
<developerConnection>scm:git:ssh://git@github.com/kohsuke/${project.artifactId}.git</developerConnection>
<url>http://${project.artifactId}.kohsuke.org/</url>
<tag>github-api-1.91</tag>
<tag>github-api-1.94</tag>
</scm>
<distributionManagement>
@@ -96,9 +96,9 @@
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>

View File

@@ -65,9 +65,8 @@ public class GHBranch {
return GitHub.parseURL(protection_url);
}
@Preview @Deprecated
public GHBranchProtection getProtection() throws IOException {
return root.retrieve().withPreview(LOKI).to(protection_url, GHBranchProtection.class);
return root.retrieve().to(protection_url, GHBranchProtection.class).wrap(this);
}
/**
@@ -80,9 +79,8 @@ public class GHBranch {
/**
* Disables branch protection and allows anyone with push access to push changes.
*/
@Preview @Deprecated
public void disableProtection() throws IOException {
new Requester(root).method("DELETE").withPreview(LOKI).to(protection_url);
new Requester(root).method("DELETE").to(protection_url);
}
/**

View File

@@ -3,27 +3,46 @@ package org.kohsuke.github;
import com.fasterxml.jackson.annotation.JsonProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import static org.kohsuke.github.Previews.ZZZAX;
import java.io.IOException;
import java.util.Collection;
@SuppressFBWarnings(value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
"URF_UNREAD_FIELD" }, justification = "JSON API")
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "NP_UNWRITTEN_FIELD",
"URF_UNREAD_FIELD"}, justification = "JSON API")
public class GHBranchProtection {
@JsonProperty("enforce_admins")
private EnforceAdmins enforceAdmins;
private static final String REQUIRE_SIGNATURES_URI = "/required_signatures";
@JsonProperty("required_pull_request_reviews")
private RequiredReviews requiredReviews;
@JsonProperty("enforce_admins")
private EnforceAdmins enforceAdmins;
@JsonProperty("required_status_checks")
private RequiredStatusChecks requiredStatusChecks;
private GitHub root;
@JsonProperty
private Restrictions restrictions;
@JsonProperty("required_pull_request_reviews")
private RequiredReviews requiredReviews;
@JsonProperty
private String url;
public EnforceAdmins getEnforceAdmins() {
@JsonProperty("required_status_checks")
private RequiredStatusChecks requiredStatusChecks;
@JsonProperty
private Restrictions restrictions;
@JsonProperty
private String url;
@Preview @Deprecated
public void enabledSignedCommits() throws IOException {
requester().method("POST")
.to(url + REQUIRE_SIGNATURES_URI, RequiredSignatures.class);
}
@Preview @Deprecated
public void disableSignedCommits() throws IOException {
requester().method("DELETE")
.to(url + REQUIRE_SIGNATURES_URI);
}
public EnforceAdmins getEnforceAdmins() {
return enforceAdmins;
}
@@ -31,6 +50,12 @@ public class GHBranchProtection {
return requiredReviews;
}
@Preview @Deprecated
public boolean getRequiredSignatures() throws IOException {
return requester().method("GET")
.to(url + REQUIRE_SIGNATURES_URI, RequiredSignatures.class).enabled;
}
public RequiredStatusChecks getRequiredStatusChecks() {
return requiredStatusChecks;
}
@@ -43,12 +68,21 @@ public class GHBranchProtection {
return url;
}
public static class EnforceAdmins {
@JsonProperty
private boolean enabled;
GHBranchProtection wrap(GHBranch branch) {
this.root = branch.getRoot();
return this;
}
@JsonProperty
private String url;
private Requester requester() {
return new Requester(root).withPreview(ZZZAX);
}
public static class EnforceAdmins {
@JsonProperty
private boolean enabled;
@JsonProperty
private String url;
public String getUrl() {
return url;
@@ -57,20 +91,23 @@ public class GHBranchProtection {
public boolean isEnabled() {
return enabled;
}
}
}
public static class RequiredReviews {
@JsonProperty("dismissal_restrictions")
private Restrictions dismissalRestriction;
public static class RequiredReviews {
@JsonProperty("dismissal_restrictions")
private Restrictions dismissalRestriction;
@JsonProperty("dismiss_stale_reviews")
private boolean dismissStaleReviews;
@JsonProperty("dismiss_stale_reviews")
private boolean dismissStaleReviews;
@JsonProperty("require_code_owner_reviews")
private boolean requireCodeOwnerReviews;
@JsonProperty("require_code_owner_reviews")
private boolean requireCodeOwnerReviews;
@JsonProperty
private String url;
@JsonProperty("required_approving_review_count")
private int requiredReviewers;
@JsonProperty
private String url;
public Restrictions getDismissalRestrictions() {
return dismissalRestriction;
@@ -87,17 +124,37 @@ public class GHBranchProtection {
public boolean isRequireCodeOwnerReviews() {
return requireCodeOwnerReviews;
}
}
public static class RequiredStatusChecks {
@JsonProperty
private Collection<String> contexts;
public int getRequiredReviewers() {
return requiredReviewers;
}
}
@JsonProperty
private boolean strict;
private static class RequiredSignatures {
@JsonProperty
private boolean enabled;
@JsonProperty
private String url;
@JsonProperty
private String url;
public String getUrl() {
return url;
}
public boolean isEnabled() {
return enabled;
}
}
public static class RequiredStatusChecks {
@JsonProperty
private Collection<String> contexts;
@JsonProperty
private boolean strict;
@JsonProperty
private String url;
public Collection<String> getContexts() {
return contexts;
@@ -110,23 +167,23 @@ public class GHBranchProtection {
public boolean isRequiresBranchUpToDate() {
return strict;
}
}
}
public static class Restrictions {
@JsonProperty
private Collection<GHTeam> teams;
public static class Restrictions {
@JsonProperty
private Collection<GHTeam> teams;
@JsonProperty("teams_url")
private String teamsUrl;
@JsonProperty("teams_url")
private String teamsUrl;
@JsonProperty
private String url;
@JsonProperty
private String url;
@JsonProperty
private Collection<GHUser> users;
@JsonProperty
private Collection<GHUser> users;
@JsonProperty("users_url")
private String usersUrl;
@JsonProperty("users_url")
private String usersUrl;
public Collection<GHTeam> getTeams() {
return teams;
@@ -147,5 +204,5 @@ public class GHBranchProtection {
public String getUsersUrl() {
return usersUrl;
}
}
}
}

View File

@@ -44,7 +44,11 @@ public class GHBranchProtectionBuilder {
}
public GHBranchProtectionBuilder dismissStaleReviews() {
getPrReviews().put("dismiss_stale_reviews", true);
return dismissStaleReviews(true);
}
public GHBranchProtectionBuilder dismissStaleReviews(boolean v) {
getPrReviews().put("dismiss_stale_reviews", v);
return this;
}
@@ -54,7 +58,8 @@ public class GHBranchProtectionBuilder {
.withNullable("required_pull_request_reviews", prReviews)
.withNullable("restrictions", restrictions)
.withNullable("enforce_admins", enforceAdmins)
.to(branch.getProtectionUrl().toString(), GHBranchProtection.class);
.to(branch.getProtectionUrl().toString(), GHBranchProtection.class)
.wrap(branch);
}
public GHBranchProtectionBuilder includeAdmins() {
@@ -66,6 +71,11 @@ public class GHBranchProtectionBuilder {
return this;
}
public GHBranchProtectionBuilder requiredReviewers(int v) {
getPrReviews().put("required_approving_review_count", v);
return this;
}
public GHBranchProtectionBuilder requireBranchIsUpToDate() {
return requireBranchIsUpToDate(true);
}
@@ -89,6 +99,16 @@ public class GHBranchProtectionBuilder {
return this;
}
public GHBranchProtectionBuilder restrictReviewDismissals() {
getPrReviews();
if (!prReviews.containsKey("dismissal_restrictions")) {
prReviews.put("dismissal_restrictions", new Restrictions());
}
return this;
}
public GHBranchProtectionBuilder restrictPushAccess() {
getRestrictions();
return this;
@@ -151,12 +171,7 @@ public class GHBranchProtectionBuilder {
}
private void addReviewRestriction(String restriction, boolean isTeam) {
getPrReviews();
if (!prReviews.containsKey("dismissal_restrictions")) {
prReviews.put("dismissal_restrictions", new Restrictions());
}
restrictReviewDismissals();
Restrictions restrictions = (Restrictions) prReviews.get("dismissal_restrictions");
if (isTeam) {
@@ -188,7 +203,7 @@ public class GHBranchProtectionBuilder {
}
private Requester requester() {
return new Requester(branch.getRoot()).withPreview(LOKI);
return new Requester(branch.getRoot()).withPreview(LUKE_CAGE);
}
private static class Restrictions {

View File

@@ -0,0 +1,37 @@
package org.kohsuke.github;
/**
* How is an user associated with a repository?
*
* @author Kohsuke Kawaguchi
*/
public enum GHCommentAuthorAssociation {
/**
* Author has been invited to collaborate on the repository.
*/
COLLABORATOR,
/**
* Author has previously committed to the repository.
*/
CONTRIBUTOR,
/**
* Author has not previously committed to GitHub.
*/
FIRST_TIMER,
/**
* Author has not previously committed to the repository.
*/
FIRST_TIME_CONTRIBUTOR,
/**
* Author is a member of the organization that owns the repository.
*/
MEMBER,
/**
* Author has no association with the repository.
*/
NONE,
/**
* Author is the owner of the repository.
*/
OWNER
}

View File

@@ -1,6 +1,6 @@
package org.kohsuke.github;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;

View File

@@ -0,0 +1,76 @@
package org.kohsuke.github;
import org.apache.commons.codec.binary.Base64;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
/**
* Used to create/update content.
*
* <p>
* Call various methods to build up parameters, then call {@link #commit()} to make the change effective.
*
* @author Kohsuke Kawaguchi
* @see GHRepository#createContent()
*/
public final class GHContentBuilder {
private final GHRepository repo;
private final Requester req;
private String path;
GHContentBuilder(GHRepository repo) {
this.repo = repo;
this.req = new Requester(repo.root).method("PUT");
}
public GHContentBuilder path(String path) {
this.path = path;
req.with("path",path);
return this;
}
public GHContentBuilder branch(String branch) {
req.with("branch", branch);
return this;
}
/**
* Used when updating (but not creating a new content) to specify
* Thetblob SHA of the file being replaced.
*/
public GHContentBuilder sha(String sha) {
req.with("sha", sha);
return this;
}
public GHContentBuilder content(byte[] content) {
req.with("content", Base64.encodeBase64String(content));
return this;
}
public GHContentBuilder content(String content) {
try {
return content(content.getBytes("UTF-8"));
} catch (UnsupportedEncodingException x) {
throw new AssertionError();
}
}
public GHContentBuilder message(String commitMessage) {
req.with("message", commitMessage);
return this;
}
/**
* Commits a new content.
*/
public GHContentUpdateResponse commit() throws IOException {
GHContentUpdateResponse response = req.to(repo.getApiTailUrl("contents/" + path), GHContentUpdateResponse.class);
response.getContent().wrap(repo);
response.getCommit().wrapUp(repo);
return response;
}
}

View File

@@ -1,6 +1,6 @@
package org.kohsuke.github;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.io.IOException;

View File

@@ -174,6 +174,51 @@ public abstract class GHEventPayload {
}
}
/**
* A Issue has been assigned, unassigned, labeled, unlabeled, opened, edited, milestoned, demilestoned, closed, or reopened.
*
* @see <a href="http://developer.github.com/v3/activity/events/types/#issueevent">authoritative source</a>
*/
@SuppressFBWarnings(value = {"UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR", "NP_UNWRITTEN_FIELD" },
justification = "Constructed by JSON deserialization")
public static class Issue extends GHEventPayload {
private String action;
private GHIssue issue;
private GHRepository repository;
@SuppressFBWarnings(value = "UWF_UNWRITTEN_FIELD", justification = "Comes from JSON deserialization")
public String getAction() {
return action;
}
public GHIssue getIssue() {
return issue;
}
public void setIssue(GHIssue issue) {
this.issue = issue;
}
public GHRepository getRepository() {
return repository;
}
public void setRepository(GHRepository repository) {
this.repository = repository;
}
@Override
void wrapUp(GitHub root) {
super.wrapUp(root);
if (repository != null) {
repository.wrap(root);
issue.wrap(repository);
} else {
issue.wrap(root);
}
}
}
/**
* A comment was added to an issue
*
@@ -716,6 +761,48 @@ public abstract class GHEventPayload {
}
}
/**
* A release was added to the repo
*
* @see <a href="http://developer.github.com/v3/activity/events/types/#releaseevent">authoritative source</a>
*/
@SuppressFBWarnings(value = {"UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR", "NP_UNWRITTEN_FIELD" },
justification = "Constructed by JSON deserialization")
public static class Release extends GHEventPayload {
private String action;
private GHRelease release;
private GHRepository repository;
@SuppressFBWarnings(value = "UWF_UNWRITTEN_FIELD", justification = "Comes from JSON deserialization")
public String getAction() {
return action;
}
public GHRelease getRelease() {
return release;
}
public void setRelease(GHRelease release) {
this.release = release;
}
public GHRepository getRepository() {
return repository;
}
public void setRepository(GHRepository repository) {
this.repository = repository;
}
@Override
void wrapUp(GitHub root) {
super.wrapUp(root);
if (repository != null) {
repository.wrap(root);
}
}
}
/**
* A repository was created, deleted, made public, or made private.
*

View File

@@ -0,0 +1,46 @@
package org.kohsuke.github;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.net.URL;
/**
* @see GitHub#getMyInvitations()
* @see GHRepository#listInvitations()
*/
@SuppressFBWarnings(value = {"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD",
"NP_UNWRITTEN_FIELD", "UUF_UNUSED_FIELD"}, justification = "JSON API")
public class GHInvitation extends GHObject {
/*package almost final*/ GitHub root;
private int id;
private GHRepository repository;
private GHUser invitee, inviter;
private String permissions;
private String html_url;
/*package*/ GHInvitation wrapUp(GitHub root) {
this.root = root;
return this;
}
/**
* Accept a repository invitation.
*/
public void accept() throws IOException {
root.retrieve().method("PATCH").to("/user/repository_invitations/" + id);
}
/**
* Decline a repository invitation.
*/
public void decline() throws IOException {
root.retrieve().method("DELETE").to("/user/repository_invitations/" + id);
}
@Override
public URL getHtmlUrl() {
return GitHub.parseURL(html_url);
}
}

View File

@@ -29,7 +29,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -49,6 +48,8 @@ import static org.kohsuke.github.Previews.*;
* @see GHIssueSearchBuilder
*/
public class GHIssue extends GHObject implements Reactable{
private static final String ASSIGNEES = "assignees";
GitHub root;
GHRepository owner;
@@ -268,8 +269,7 @@ public class GHIssue extends GHObject implements Reactable{
}
public void addAssignees(Collection<GHUser> assignees) throws IOException {
List<String> names = toLogins(assignees);
root.retrieve().method("POST").with("assignees",names).to(getIssuesApiRoute()+"/assignees",this);
root.retrieve().method("POST").withLogins(ASSIGNEES,assignees).to(getIssuesApiRoute()+"/assignees",this);
}
public void setAssignees(GHUser... assignees) throws IOException {
@@ -277,7 +277,7 @@ public class GHIssue extends GHObject implements Reactable{
}
public void setAssignees(Collection<GHUser> assignees) throws IOException {
editIssue("assignees",toLogins(assignees));
new Requester(root).withLogins(ASSIGNEES, assignees).method("PATCH").to(getIssuesApiRoute());
}
public void removeAssignees(GHUser... assignees) throws IOException {
@@ -285,16 +285,7 @@ public class GHIssue extends GHObject implements Reactable{
}
public void removeAssignees(Collection<GHUser> assignees) throws IOException {
List<String> names = toLogins(assignees);
root.retrieve().method("DELETE").with("assignees",names).inBody().to(getIssuesApiRoute()+"/assignees",this);
}
private List<String> toLogins(Collection<GHUser> assignees) {
List<String> names = new ArrayList<String>(assignees.size());
for (GHUser a : assignees) {
names.add(a.getLogin());
}
return names;
root.retrieve().method("DELETE").withLogins(ASSIGNEES,assignees).inBody().to(getIssuesApiRoute()+"/assignees",this);
}
protected String getApiRoute() {

View File

@@ -32,11 +32,13 @@ import static org.kohsuke.github.Previews.*;
* Comment to the issue
*
* @author Kohsuke Kawaguchi
* @see GHIssue#comment(String)
* @see GHIssue#listComments()
*/
public class GHIssueComment extends GHObject implements Reactable {
GHIssue owner;
private String body, gravatar_id;
private String body, gravatar_id, html_url, author_association;
private GHUser user; // not fully populated. beware.
/*package*/ GHIssueComment wrapUp(GHIssue owner) {
@@ -73,12 +75,13 @@ public class GHIssueComment extends GHObject implements Reactable {
return owner == null || owner.root.isOffline() ? user : owner.root.getUser(user.getLogin());
}
/**
* @deprecated This object has no HTML URL.
*/
@Override
public URL getHtmlUrl() {
return null;
return GitHub.parseURL(html_url);
}
public GHCommentAuthorAssociation getAuthorAssociation() {
return GHCommentAuthorAssociation.valueOf(author_association);
}
/**

View File

@@ -1,7 +1,7 @@
package org.kohsuke.github;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
/**
* SSH public key.

View File

@@ -2,8 +2,8 @@ package org.kohsuke.github;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.annotation.CheckForNull;
import java.io.IOException;

View File

@@ -50,7 +50,7 @@ public class GHOrganization extends GHPerson {
* You use the returned builder to set various properties, then call {@link GHCreateRepositoryBuilder#create()}
* to finally createa repository.
*/
public GHCreateRepositoryBuilder createRepository(String name) throws IOException {
public GHCreateRepositoryBuilder createRepository(String name) {
return new GHCreateRepositoryBuilder(root,"/orgs/"+login+"/repos",name);
}
@@ -269,7 +269,7 @@ public class GHOrganization extends GHPerson {
public PagedIterable<GHRepository> listRepositories(final int pageSize) {
return new PagedIterable<GHRepository>() {
public PagedIterator<GHRepository> _iterator(int pageSize) {
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/orgs/" + login + "/repos?per_page=" + pageSize, GHRepository[].class, pageSize)) {
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/orgs/" + login + "/repos", GHRepository[].class, pageSize)) {
@Override
protected void wrapUp(GHRepository[] page) {
for (GHRepository c : page)
@@ -277,7 +277,7 @@ public class GHOrganization extends GHPerson {
}
};
}
};
}.withPageSize(pageSize);
}
/**

View File

@@ -81,7 +81,7 @@ public abstract class GHPerson extends GHObject {
public PagedIterable<GHRepository> listRepositories(final int pageSize) {
return new PagedIterable<GHRepository>() {
public PagedIterator<GHRepository> _iterator(int pageSize) {
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/users/" + login + "/repos?per_page=" + pageSize, GHRepository[].class, pageSize)) {
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/users/" + login + "/repos", GHRepository[].class, pageSize)) {
@Override
protected void wrapUp(GHRepository[] page) {
for (GHRepository c : page)
@@ -89,7 +89,7 @@ public abstract class GHPerson extends GHObject {
}
};
}
};
}.withPageSize(pageSize);
}
/**
@@ -108,7 +108,7 @@ public abstract class GHPerson extends GHObject {
public synchronized Iterable<List<GHRepository>> iterateRepositories(final int pageSize) {
return new Iterable<List<GHRepository>>() {
public Iterator<List<GHRepository>> iterator() {
final Iterator<GHRepository[]> pager = root.retrieve().asIterator("/users/" + login + "/repos?per_page="+pageSize,GHRepository[].class, pageSize);
final Iterator<GHRepository[]> pager = root.retrieve().asIterator("/users/" + login + "/repos",GHRepository[].class, pageSize);
return new Iterator<List<GHRepository>>() {
public boolean hasNext() {

View File

@@ -41,6 +41,7 @@ import java.util.List;
public class GHPullRequest extends GHIssue {
private static final String COMMENTS_ACTION = "/comments";
private static final String REQUEST_REVIEWERS = "/requested_reviewers";
private String patch_url, diff_url, issue_url;
private GHCommitPointer base;
@@ -345,6 +346,12 @@ public class GHPullRequest extends GHIssue {
.to(getApiRoute() + COMMENTS_ACTION, GHPullRequestReviewComment.class).wrapUp(this);
}
public void requestReviewers(List<GHUser> reviewers) throws IOException {
new Requester(root).method("POST")
.withLogins("reviewers", reviewers)
.to(getApiRoute() + REQUEST_REVIEWERS);
}
/**
* Merge this pull request.
*
@@ -393,7 +400,7 @@ public class GHPullRequest extends GHIssue {
private void fetchIssue() throws IOException {
if (!fetchedIssueDetails) {
new Requester(root).to(getIssuesApiRoute(), this);
new Requester(root).method("GET").to(getIssuesApiRoute(), this);
fetchedIssueDetails = true;
}
}

View File

@@ -43,6 +43,7 @@ public class GHPullRequestFileDetail {
String raw_url;
String contents_url;
String patch;
String previous_filename;
public String getSha() {
return sha;
@@ -83,4 +84,9 @@ public class GHPullRequestFileDetail {
public String getPatch() {
return patch;
}
public String getPreviousFilename()
{
return previous_filename;
}
}

View File

@@ -42,7 +42,7 @@ public class GHPullRequestReviewBuilder {
/**
* The review action you want to perform. The review actions include: APPROVE, REQUEST_CHANGES, or COMMENT.
* By leaving this blank, you set the review action state to PENDING,
* which means you will need to {@linkplain GHPullRequestReview#submit() submit the pull request review} when you are ready.
* which means you will need to {@linkplain GHPullRequestReview#submit(String, GHPullRequestReviewEvent) submit the pull request review} when you are ready.
*/
public GHPullRequestReviewBuilder event(GHPullRequestReviewEvent event) {
builder.with("event",event.action());

View File

@@ -3,6 +3,7 @@ package org.kohsuke.github;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.Date;
@@ -125,12 +126,21 @@ public class GHRelease extends GHObject {
* handling of the HTTP requests to github's API.
*/
public GHAsset uploadAsset(File file, String contentType) throws IOException {
FileInputStream s = new FileInputStream(file);
try {
return uploadAsset(file.getName(), s, contentType);
} finally {
s.close();
}
}
public GHAsset uploadAsset(String filename, InputStream stream, String contentType) throws IOException {
Requester builder = new Requester(owner.root);
String url = format("https://uploads.github.com%s/releases/%d/assets?name=%s",
owner.getApiTailUrl(""), getId(), file.getName());
owner.getApiTailUrl(""), getId(), filename);
return builder.contentType(contentType)
.with(new FileInputStream(file))
.with(stream)
.to(url, GHAsset.class).wrap(this);
}

View File

@@ -26,8 +26,7 @@ package org.kohsuke.github;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -35,7 +34,6 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.AbstractSet;
import java.util.ArrayList;
@@ -310,6 +308,22 @@ public class GHRepository extends GHObject {
public List<GHRelease> getReleases() throws IOException {
return listReleases().asList();
}
public GHRelease getRelease(long id) throws IOException {
try {
return root.retrieve().to(getApiTailUrl("releases/" + id), GHRelease.class).wrap(this);
} catch (FileNotFoundException e) {
return null; // no release for this id
}
}
public GHRelease getReleaseByTagName(String tag) throws IOException {
try {
return root.retrieve().to(getApiTailUrl("releases/tags/" + tag), GHRelease.class).wrap(this);
} catch (FileNotFoundException e) {
return null; // no release for this tag
}
}
public GHRelease getLatestRelease() throws IOException {
try {
@@ -815,7 +829,9 @@ public class GHRepository extends GHObject {
public PagedIterator<GHRef> _iterator(int pageSize) {
return new PagedIterator<GHRef>(root.retrieve().asIterator(url, GHRef[].class, pageSize)) {
protected void wrapUp(GHRef[] page) {
// no-op
for(GHRef p: page) {
p.wrap(root);
}
}
};
}
@@ -1137,6 +1153,22 @@ public class GHRepository extends GHObject {
.to(getApiTailUrl("labels"), GHLabel.class).wrapUp(this);
}
/**
* Lists all the invitations.
*/
public PagedIterable<GHInvitation> listInvitations() {
return new PagedIterable<GHInvitation>() {
public PagedIterator<GHInvitation> _iterator(int pageSize) {
return new PagedIterator<GHInvitation>(root.retrieve().asIterator(String.format("/repos/%s/%s/invitations", getOwnerName(), name), GHInvitation[].class, pageSize)) {
protected void wrapUp(GHInvitation[] page) {
for (GHInvitation c : page)
c.wrapUp(root);
}
};
}
};
}
/**
* Lists all the subscribers (aka watchers.)
*
@@ -1306,7 +1338,7 @@ public class GHRepository extends GHObject {
*/
public Map<String,GHBranch> getBranches() throws IOException {
Map<String,GHBranch> r = new TreeMap<String,GHBranch>();
for (GHBranch p : root.retrieve().withPreview(LOKI).to(getApiTailUrl("branches"), GHBranch[].class)) {
for (GHBranch p : root.retrieve().to(getApiTailUrl("branches"), GHBranch[].class)) {
p.wrap(this);
r.put(p.getName(),p);
}
@@ -1314,7 +1346,7 @@ public class GHRepository extends GHObject {
}
public GHBranch getBranch(String name) throws IOException {
return root.retrieve().withPreview(LOKI).to(getApiTailUrl("branches/"+name),GHBranch.class).wrap(this);
return root.retrieve().to(getApiTailUrl("branches/"+name),GHBranch.class).wrap(this);
}
/**
@@ -1394,41 +1426,43 @@ public class GHRepository extends GHObject {
return requester.to(getApiTailUrl("readme"), GHContent.class).wrap(this);
}
/**
* Creates a new content, or update an existing content.
*/
public GHContentBuilder createContent() {
return new GHContentBuilder(this);
}
/**
* Use {@link #createContent()}.
*/
@Deprecated
public GHContentUpdateResponse createContent(String content, String commitMessage, String path) throws IOException {
return createContent(content, commitMessage, path, null);
return createContent().content(content).message(commitMessage).path(path).commit();
}
/**
* Use {@link #createContent()}.
*/
@Deprecated
public GHContentUpdateResponse createContent(String content, String commitMessage, String path, String branch) throws IOException {
final byte[] payload;
try {
payload = content.getBytes("UTF-8");
} catch (UnsupportedEncodingException ex) {
throw (IOException) new IOException("UTF-8 encoding is not supported").initCause(ex);
}
return createContent(payload, commitMessage, path, branch);
return createContent().content(content).message(commitMessage).path(path).branch(branch).commit();
}
/**
* Use {@link #createContent()}.
*/
@Deprecated
public GHContentUpdateResponse createContent(byte[] contentBytes, String commitMessage, String path) throws IOException {
return createContent(contentBytes, commitMessage, path, null);
return createContent().content(contentBytes).message(commitMessage).path(path).commit();
}
/**
* Use {@link #createContent()}.
*/
@Deprecated
public GHContentUpdateResponse createContent(byte[] contentBytes, String commitMessage, String path, String branch) throws IOException {
Requester requester = new Requester(root)
.with("path", path)
.with("message", commitMessage)
.with("content", Base64.encodeBase64String(contentBytes))
.method("PUT");
if (branch != null) {
requester.with("branch", branch);
}
GHContentUpdateResponse response = requester.to(getApiTailUrl("contents/" + path), GHContentUpdateResponse.class);
response.getContent().wrap(this);
response.getCommit().wrapUp(this);
return response;
return createContent().content(contentBytes).message(commitMessage).path(path).branch(branch).commit();
}
public GHMilestone createMilestone(String title, String description) throws IOException {

View File

@@ -55,6 +55,10 @@ public class GHRepositorySearchBuilder extends GHSearchBuilder<GHRepository> {
return q("stars:"+v);
}
public GHRepositorySearchBuilder topic(String v) {
return q("topic:"+v);
}
public GHRepositorySearchBuilder order(GHDirection v) {
req.with("order",v);
return this;

View File

@@ -1,6 +1,6 @@
package org.kohsuke.github;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;

View File

@@ -24,6 +24,7 @@
package org.kohsuke.github;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.introspect.VisibilityChecker.Std;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
@@ -529,6 +530,15 @@ public class GitHub {
}
/**
* Gets complete list of open invitations for current user.
*/
public List<GHInvitation> getMyInvitations() throws IOException {
GHInvitation[] invitations = retrieve().to("/user/repository_invitations", GHInvitation[].class);
for (GHInvitation i : invitations) {
i.wrapUp(this);
}
return Arrays.asList(invitations);
}
/**
* This method returns a shallowly populated organizations.
@@ -909,6 +919,7 @@ public class GitHub {
static {
MAPPER.setVisibilityChecker(new Std(NONE, NONE, NONE, NONE, ANY));
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, true);
}
/* package */ static final String GITHUB_URL = "https://api.github.com";

View File

@@ -4,8 +4,9 @@ package org.kohsuke.github;
* @author Kohsuke Kawaguchi
*/
/*package*/ class Previews {
static final String LOKI = "application/vnd.github.loki-preview+json";
static final String LUKE_CAGE = "application/vnd.github.luke-cage-preview+json";
static final String DRAX = "application/vnd.github.drax-preview+json";
static final String SQUIRREL_GIRL = "application/vnd.github.squirrel-girl-preview";
static final String CLOAK = "application/vnd.github.cloak-preview";
static final String ZZZAX = "application/vnd.github.zzzax-preview+json";
}

View File

@@ -37,7 +37,7 @@ public abstract class RateLimitHandler {
public void onError(IOException e, HttpURLConnection uc) throws IOException {
try {
Thread.sleep(parseWaitTime(uc));
} catch (InterruptedException _) {
} catch (InterruptedException x) {
throw (InterruptedIOException)new InterruptedIOException().initCause(e);
}
}

View File

@@ -26,7 +26,7 @@ package org.kohsuke.github;
import com.fasterxml.jackson.databind.JsonMappingException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import javax.annotation.CheckForNull;
import javax.annotation.WillClose;
@@ -63,7 +63,7 @@ import static java.util.Arrays.asList;
import static java.util.logging.Level.FINE;
import static java.util.logging.Level.FINEST;
import static java.util.logging.Level.INFO;
import static org.apache.commons.lang.StringUtils.defaultString;
import static org.apache.commons.lang3.StringUtils.defaultString;
import static org.kohsuke.github.GitHub.MAPPER;
/**
@@ -169,6 +169,14 @@ class Requester {
return _with(key, value);
}
public Requester withLogins(String key, Collection<GHUser> users) {
List<String> names = new ArrayList<String>(users.size());
for (GHUser a : users) {
names.add(a.getLogin());
}
return with(key,names);
}
public Requester with(String key, Map<String, String> value) {
return _with(key, value);
}

View File

@@ -1,13 +1,25 @@
package org.kohsuke.github.extras;
import com.squareup.okhttp.ConnectionSpec;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.OkUrlFactory;
import org.kohsuke.github.HttpConnector;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
/**
* {@link HttpConnector} for {@link OkHttpClient}.
*
@@ -23,10 +35,33 @@ public class OkHttpConnector implements HttpConnector {
private final OkUrlFactory urlFactory;
public OkHttpConnector(OkUrlFactory urlFactory) {
urlFactory.client().setSslSocketFactory(TlsSocketFactory());
urlFactory.client().setConnectionSpecs(TlsConnectionSpecs());
this.urlFactory = urlFactory;
}
public HttpURLConnection connect(URL url) throws IOException {
return urlFactory.open(url);
}
/** Returns TLSv1.2 only SSL Socket Factory. */
private SSLSocketFactory TlsSocketFactory() {
SSLContext sc;
try {
sc = SSLContext.getInstance("TLSv1.2");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage(), e);
}
try {
sc.init(null, null, null);
return sc.getSocketFactory();
} catch (KeyManagementException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/** Returns connection spec with TLS v1.2 in it */
private List<ConnectionSpec> TlsConnectionSpecs() {
return Arrays.asList(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT);
}
}

View File

@@ -304,7 +304,7 @@ public class AppTest extends AbstractGitHubApiTestBase {
@Test
public void testMembership() throws Exception {
Set<String> members = gitHub.getOrganization("jenkinsci").getRepository("violations-plugin").getCollaboratorNames();
Set<String> members = gitHub.getOrganization("github-api-test-org").getRepository("jenkins").getCollaboratorNames();
System.out.println(members.contains("kohsuke"));
}

View File

@@ -32,6 +32,12 @@ public class GHBranchProtectionTest extends AbstractGitHubApiTestBase {
branch = repo.getBranch(BRANCH);
if (branch.isProtected()) {
GHBranchProtection protection = branch.getProtection();
if (protection.getRequiredSignatures()) {
protection.disableSignedCommits();
}
assertFalse(protection.getRequiredSignatures());
branch.disableProtection();
}
@@ -47,6 +53,7 @@ public class GHBranchProtectionTest extends AbstractGitHubApiTestBase {
.requireBranchIsUpToDate()
.requireCodeOwnReviews()
.dismissStaleReviews()
.requiredReviewers(2)
.includeAdmins()
.enable();
@@ -59,6 +66,7 @@ public class GHBranchProtectionTest extends AbstractGitHubApiTestBase {
assertNotNull(requiredReviews);
assertTrue(requiredReviews.isDismissStaleReviews());
assertTrue(requiredReviews.isRequireCodeOwnerReviews());
assertEquals(2, requiredReviews.getRequiredReviewers());
EnforceAdmins enforceAdmins = protection.getEnforceAdmins();
assertNotNull(enforceAdmins);
@@ -79,4 +87,17 @@ public class GHBranchProtectionTest extends AbstractGitHubApiTestBase {
assertNotNull(protection.getRequiredReviews());
}
@Test
public void testSignedCommits() throws Exception {
GHBranchProtection protection = branch.enableProtection().enable();
assertFalse(protection.getRequiredSignatures());
protection.enabledSignedCommits();
assertTrue(protection.getRequiredSignatures());
protection.disableSignedCommits();
assertFalse(protection.getRequiredSignatures());
}
}

View File

@@ -53,7 +53,8 @@ public class GHContentIntegrationTest extends AbstractGitHubApiTestBase {
@Test
public void testCRUDContent() throws Exception {
GHContentUpdateResponse created = repo.createContent("this is an awesome file I created\n", "Creating a file for integration tests.", createdFilename);
GHContentUpdateResponse created =
repo.createContent("this is an awesome file I created\n", "Creating a file for integration tests.", createdFilename);
GHContent createdContent = created.getContent();
assertNotNull(created.getCommit());

View File

@@ -120,9 +120,19 @@ public class GHEventPayloadTest {
assertThat(event.getSender().getLogin(), is("baxterthehacker"));
}
// TODO implement support classes and write test
// @Test
// public void issues() throws Exception {}
@Test
public void issues() throws Exception {
GHEventPayload.Issue event = GitHub.offline().parseEventPayload(payload.asReader(),GHEventPayload.Issue.class);
assertThat(event.getAction(),is("opened"));
assertThat(event.getIssue().getNumber(), is(2));
assertThat(event.getIssue().getTitle(), is("Spelling error in the README file"));
assertThat(event.getIssue().getState(), is(GHIssueState.OPEN));
assertThat(event.getIssue().getLabels().size(), is(1));
assertThat(event.getIssue().getLabels().iterator().next().getName(), is("bug"));
assertThat(event.getRepository().getName(), is("public-repo"));
assertThat(event.getRepository().getOwner().getLogin(), is("baxterthehacker"));
assertThat(event.getSender().getLogin(), is("baxterthehacker"));
}
// TODO implement support classes and write test
// @Test

View File

@@ -105,6 +105,7 @@ public class PullRequestTest extends AbstractGitHubApiTestBase {
String name = rnd.next();
GHRef masterRef = getRepository().getRef("heads/master");
GHRef branchRef = getRepository().createRef("refs/heads/" + name, masterRef.getObject().getSha());
getRepository().createContent(name, name, name, name);
Thread.sleep(1000);
GHPullRequest p = getRepository().createPullRequest(name, name, "master", "## test squash");
@@ -112,6 +113,27 @@ public class PullRequestTest extends AbstractGitHubApiTestBase {
p.merge("squash merge", null, GHPullRequest.MergeMethod.SQUASH);
branchRef.delete();
}
@Test
public void testUpdateContentSquashMerge() throws Exception {
String name = rnd.next();
GHRef masterRef = getRepository().getRef("heads/master");
GHRef branchRef = getRepository().createRef("refs/heads/" + name, masterRef.getObject().getSha());
GHContentUpdateResponse response = getRepository().createContent(name, name, name, name);
Thread.sleep(1000);
getRepository().createContent()
.content(name + name)
.path(name)
.branch(name)
.message(name)
.sha(response.getContent().getSha())
.commit();
GHPullRequest p = getRepository().createPullRequest(name, name, "master", "## test squash");
Thread.sleep(1000);
p.merge("squash merge", null, GHPullRequest.MergeMethod.SQUASH);
branchRef.delete();
}
@Test
// Requires push access to the test repo to pass

View File

@@ -94,6 +94,36 @@ public class RepositoryTest extends AbstractGitHubApiTestBase {
}
}
@Test public void listReleases() throws IOException {
PagedIterable<GHRelease> releases = gitHub.getOrganization("github").getRepository("hub").listReleases();
assertTrue(releases.iterator().hasNext());
}
@Test
public void getReleaseExists() throws IOException {
GHRelease release = gitHub.getOrganization("github").getRepository("hub").getRelease(6839710);
assertEquals("v2.3.0-pre10", release.getTagName());
}
@Test
public void getReleaseDoesNotExist() throws IOException {
GHRelease release = gitHub.getOrganization("github").getRepository("hub").getRelease(Long.MAX_VALUE);
assertNull(release);
}
@Test
public void getReleaseByTagNameExists() throws IOException {
GHRelease release = gitHub.getOrganization("github").getRepository("hub").getReleaseByTagName("v2.3.0-pre10");
assertNotNull(release);
assertEquals("v2.3.0-pre10", release.getTagName());
}
@Test
public void getReleaseByTagNameDoesNotExist() throws IOException {
GHRelease release = getRepository().getReleaseByTagName("foo-bar-baz");
assertNull(release);
}
private GHRepository getRepository() throws IOException {
return gitHub.getOrganization("github-api-test-org").getRepository("jenkins");
}