Skip to content

Commit a50790a

Browse files
AstroTlalocjdhayford
authored andcommitted
Adding new enums for verification reasons using X.509 certificate signatures
1 parent b5ac555 commit a50790a

File tree

32 files changed

+2211
-1
lines changed

32 files changed

+2211
-1
lines changed

src/main/java/org/kohsuke/github/GHVerification.java

+42-1
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,59 @@ public String getPayload() {
6565
* @author Sourabh Sarvotham Parkala
6666
*/
6767
public enum Reason {
68+
69+
/** Signing key expired. */
6870
EXPIRED_KEY,
71+
72+
/** The usage flags for the key that signed this don't allow signing. */
6973
NOT_SIGNING_KEY,
74+
75+
/** The GPG verification service misbehaved. */
7076
GPGVERIFY_ERROR,
77+
78+
/** The GPG verification service is unavailable at the moment. */
7179
GPGVERIFY_UNAVAILABLE,
80+
81+
/** Unsigned. */
7282
UNSIGNED,
83+
84+
/** Unknown signature type. */
7385
UNKNOWN_SIGNATURE_TYPE,
86+
87+
/** Email used for signing not known to GitHub. */
7488
NO_USER,
89+
90+
/** Email used for signing unverified on GitHub. */
7591
UNVERIFIED_EMAIL,
92+
93+
/** Invalid email used for signing. */
7694
BAD_EMAIL,
95+
96+
/** Key used for signing not known to GitHub. */
7797
UNKNOWN_KEY,
98+
99+
/** Malformed signature. */
78100
MALFORMED_SIGNATURE,
101+
102+
/** Invalid signature. */
79103
INVALID,
80-
VALID
104+
105+
/** Valid signature and verified by GitHub. */
106+
VALID,
107+
108+
/** The signing certificate or its chain could not be verified. */
109+
BAD_CERT,
110+
111+
/** Malformed signature. (Returned by graphQL) */
112+
MALFORMED_SIG,
113+
114+
/** Valid signature, though certificate revocation check failed. */
115+
OCSP_ERROR,
116+
117+
/** Valid signature, pending certificate revocation checking. */
118+
OCSP_PENDING,
119+
120+
/** One or more certificates in chain has been revoked. */
121+
OCSP_REVOKED
81122
}
82123
}

src/test/java/org/kohsuke/github/GHVerificationReasonTest.java

+84
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,88 @@ public void testValid() throws Exception {
135135
assertThat(commit.getCommitShortInfo().getVerification().getPayload(), notNullValue());
136136
assertThat(commit.getCommitShortInfo().getVerification().getSignature(), notNullValue());
137137
}
138+
139+
/**
140+
* Test bad cert.
141+
*
142+
* @throws Exception
143+
* the exception
144+
*/
145+
@Test
146+
public void testBadCert() throws Exception {
147+
GHRepository r = gitHub.getRepository("hub4j/github-api");
148+
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f01");
149+
assertThat(commit.getCommitShortInfo().getAuthor().getName(), equalTo("Sourabh Parkala"));
150+
assertThat(commit.getCommitShortInfo().getVerification().getSignature(), notNullValue());
151+
assertThat(commit.getCommitShortInfo().getVerification().isVerified(), is(false));
152+
assertThat(commit.getCommitShortInfo().getVerification().getReason(), equalTo(GHVerification.Reason.BAD_CERT));
153+
}
154+
155+
/**
156+
* Test malformed sig.
157+
*
158+
* @throws Exception
159+
* the exception
160+
*/
161+
@Test
162+
public void testMalformedSig() throws Exception {
163+
GHRepository r = gitHub.getRepository("hub4j/github-api");
164+
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f01");
165+
assertThat(commit.getCommitShortInfo().getAuthor().getName(), equalTo("Sourabh Parkala"));
166+
assertThat(commit.getCommitShortInfo().getVerification().getSignature(), notNullValue());
167+
assertThat(commit.getCommitShortInfo().getVerification().isVerified(), is(false));
168+
assertThat(commit.getCommitShortInfo().getVerification().getReason(),
169+
equalTo(GHVerification.Reason.MALFORMED_SIG));
170+
}
171+
172+
/**
173+
* Test OSCP error.
174+
*
175+
* @throws Exception
176+
* the exception
177+
*/
178+
@Test
179+
public void testOcspError() throws Exception {
180+
GHRepository r = gitHub.getRepository("hub4j/github-api");
181+
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f01");
182+
assertThat(commit.getCommitShortInfo().getAuthor().getName(), equalTo("Sourabh Parkala"));
183+
assertThat(commit.getCommitShortInfo().getVerification().getSignature(), notNullValue());
184+
assertThat(commit.getCommitShortInfo().getVerification().isVerified(), is(false));
185+
assertThat(commit.getCommitShortInfo().getVerification().getReason(),
186+
equalTo(GHVerification.Reason.OCSP_ERROR));
187+
}
188+
189+
/**
190+
* Test OSCP pending.
191+
*
192+
* @throws Exception
193+
* the exception
194+
*/
195+
@Test
196+
public void testOscpPending() throws Exception {
197+
GHRepository r = gitHub.getRepository("hub4j/github-api");
198+
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f01");
199+
assertThat(commit.getCommitShortInfo().getAuthor().getName(), equalTo("Sourabh Parkala"));
200+
assertThat(commit.getCommitShortInfo().getVerification().getSignature(), notNullValue());
201+
assertThat(commit.getCommitShortInfo().getVerification().isVerified(), is(false));
202+
assertThat(commit.getCommitShortInfo().getVerification().getReason(),
203+
equalTo(GHVerification.Reason.OCSP_PENDING));
204+
}
205+
206+
/**
207+
* Test OCSP revoked.
208+
*
209+
* @throws Exception
210+
* the exception
211+
*/
212+
@Test
213+
public void testOscpRevoked() throws Exception {
214+
GHRepository r = gitHub.getRepository("hub4j/github-api");
215+
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f01");
216+
assertThat(commit.getCommitShortInfo().getAuthor().getName(), equalTo("Sourabh Parkala"));
217+
assertThat(commit.getCommitShortInfo().getVerification().getSignature(), notNullValue());
218+
assertThat(commit.getCommitShortInfo().getVerification().isVerified(), is(false));
219+
assertThat(commit.getCommitShortInfo().getVerification().getReason(),
220+
equalTo(GHVerification.Reason.OCSP_REVOKED));
221+
}
138222
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
{
2+
"id": 617210,
3+
"node_id": "MDEwOlJlcG9zaXRvcnk2MTcyMTA=",
4+
"name": "github-api",
5+
"full_name": "hub4j/github-api",
6+
"private": false,
7+
"owner": {
8+
"login": "hub4j",
9+
"id": 54909825,
10+
"node_id": "MDEyOk9yZ2FuaXphdGlvbjU0OTA5ODI1",
11+
"avatar_url": "https://avatars3.githubusercontent.com/u/54909825?v=4",
12+
"gravatar_id": "",
13+
"url": "https://api.github.com/users/hub4j",
14+
"html_url": "https://github.com/hub4j",
15+
"followers_url": "https://api.github.com/users/hub4j/followers",
16+
"following_url": "https://api.github.com/users/hub4j/following{/other_user}",
17+
"gists_url": "https://api.github.com/users/hub4j/gists{/gist_id}",
18+
"starred_url": "https://api.github.com/users/hub4j/starred{/owner}{/repo}",
19+
"subscriptions_url": "https://api.github.com/users/hub4j/subscriptions",
20+
"organizations_url": "https://api.github.com/users/hub4j/orgs",
21+
"repos_url": "https://api.github.com/users/hub4j/repos",
22+
"events_url": "https://api.github.com/users/hub4j/events{/privacy}",
23+
"received_events_url": "https://api.github.com/users/hub4j/received_events",
24+
"type": "Organization",
25+
"site_admin": false
26+
},
27+
"html_url": "https://github.com/hub4j/github-api",
28+
"description": "Java API for GitHub",
29+
"fork": false,
30+
"url": "https://api.github.com/repos/hub4j/github-api",
31+
"forks_url": "https://api.github.com/repos/hub4j/github-api/forks",
32+
"keys_url": "https://api.github.com/repos/hub4j/github-api/keys{/key_id}",
33+
"collaborators_url": "https://api.github.com/repos/hub4j/github-api/collaborators{/collaborator}",
34+
"teams_url": "https://api.github.com/repos/hub4j/github-api/teams",
35+
"hooks_url": "https://api.github.com/repos/hub4j/github-api/hooks",
36+
"issue_events_url": "https://api.github.com/repos/hub4j/github-api/issues/events{/number}",
37+
"events_url": "https://api.github.com/repos/hub4j/github-api/events",
38+
"assignees_url": "https://api.github.com/repos/hub4j/github-api/assignees{/user}",
39+
"branches_url": "https://api.github.com/repos/hub4j/github-api/branches{/branch}",
40+
"tags_url": "https://api.github.com/repos/hub4j/github-api/tags",
41+
"blobs_url": "https://api.github.com/repos/hub4j/github-api/git/blobs{/sha}",
42+
"git_tags_url": "https://api.github.com/repos/hub4j/github-api/git/tags{/sha}",
43+
"git_refs_url": "https://api.github.com/repos/hub4j/github-api/git/refs{/sha}",
44+
"trees_url": "https://api.github.com/repos/hub4j/github-api/git/trees{/sha}",
45+
"statuses_url": "https://api.github.com/repos/hub4j/github-api/statuses/{sha}",
46+
"languages_url": "https://api.github.com/repos/hub4j/github-api/languages",
47+
"stargazers_url": "https://api.github.com/repos/hub4j/github-api/stargazers",
48+
"contributors_url": "https://api.github.com/repos/hub4j/github-api/contributors",
49+
"subscribers_url": "https://api.github.com/repos/hub4j/github-api/subscribers",
50+
"subscription_url": "https://api.github.com/repos/hub4j/github-api/subscription",
51+
"commits_url": "https://api.github.com/repos/hub4j/github-api/commits{/sha}",
52+
"git_commits_url": "https://api.github.com/repos/hub4j/github-api/git/commits{/sha}",
53+
"comments_url": "https://api.github.com/repos/hub4j/github-api/comments{/number}",
54+
"issue_comment_url": "https://api.github.com/repos/hub4j/github-api/issues/comments{/number}",
55+
"contents_url": "https://api.github.com/repos/hub4j/github-api/contents/{+path}",
56+
"compare_url": "https://api.github.com/repos/hub4j/github-api/compare/{base}...{head}",
57+
"merges_url": "https://api.github.com/repos/hub4j/github-api/merges",
58+
"archive_url": "https://api.github.com/repos/hub4j/github-api/{archive_format}{/ref}",
59+
"downloads_url": "https://api.github.com/repos/hub4j/github-api/downloads",
60+
"issues_url": "https://api.github.com/repos/hub4j/github-api/issues{/number}",
61+
"pulls_url": "https://api.github.com/repos/hub4j/github-api/pulls{/number}",
62+
"milestones_url": "https://api.github.com/repos/hub4j/github-api/milestones{/number}",
63+
"notifications_url": "https://api.github.com/repos/hub4j/github-api/notifications{?since,all,participating}",
64+
"labels_url": "https://api.github.com/repos/hub4j/github-api/labels{/name}",
65+
"releases_url": "https://api.github.com/repos/hub4j/github-api/releases{/id}",
66+
"deployments_url": "https://api.github.com/repos/hub4j/github-api/deployments",
67+
"created_at": "2010-04-19T04:13:03Z",
68+
"updated_at": "2019-10-25T01:32:16Z",
69+
"pushed_at": "2019-10-25T16:41:09Z",
70+
"git_url": "git://github.com/hub4j/github-api.git",
71+
"ssh_url": "git@github.com:hub4j/github-api.git",
72+
"clone_url": "https://github.com/hub4j/github-api.git",
73+
"svn_url": "https://github.com/hub4j/github-api",
74+
"homepage": "http://github-api.kohsuke.org/",
75+
"size": 13494,
76+
"stargazers_count": 565,
77+
"watchers_count": 565,
78+
"language": "Java",
79+
"has_issues": true,
80+
"has_projects": true,
81+
"has_downloads": true,
82+
"has_wiki": true,
83+
"has_pages": true,
84+
"forks_count": 433,
85+
"mirror_url": null,
86+
"archived": false,
87+
"disabled": false,
88+
"open_issues_count": 64,
89+
"license": {
90+
"key": "mit",
91+
"name": "MIT License",
92+
"spdx_id": "MIT",
93+
"url": "https://api.github.com/licenses/mit",
94+
"node_id": "MDc6TGljZW5zZTEz"
95+
},
96+
"forks": 433,
97+
"open_issues": 64,
98+
"watchers": 565,
99+
"default_branch": "main",
100+
"permissions": {
101+
"admin": true,
102+
"push": true,
103+
"pull": true
104+
},
105+
"allow_squash_merge": true,
106+
"allow_merge_commit": true,
107+
"allow_rebase_merge": true,
108+
"organization": {
109+
"login": "hub4j",
110+
"id": 54909825,
111+
"node_id": "MDEyOk9yZ2FuaXphdGlvbjU0OTA5ODI1",
112+
"avatar_url": "https://avatars3.githubusercontent.com/u/54909825?v=4",
113+
"gravatar_id": "",
114+
"url": "https://api.github.com/users/hub4j",
115+
"html_url": "https://github.com/hub4j",
116+
"followers_url": "https://api.github.com/users/hub4j/followers",
117+
"following_url": "https://api.github.com/users/hub4j/following{/other_user}",
118+
"gists_url": "https://api.github.com/users/hub4j/gists{/gist_id}",
119+
"starred_url": "https://api.github.com/users/hub4j/starred{/owner}{/repo}",
120+
"subscriptions_url": "https://api.github.com/users/hub4j/subscriptions",
121+
"organizations_url": "https://api.github.com/users/hub4j/orgs",
122+
"repos_url": "https://api.github.com/users/hub4j/repos",
123+
"events_url": "https://api.github.com/users/hub4j/events{/privacy}",
124+
"received_events_url": "https://api.github.com/users/hub4j/received_events",
125+
"type": "Organization",
126+
"site_admin": false
127+
},
128+
"network_count": 433,
129+
"subscribers_count": 48
130+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
{
2+
"sha": "86a2e245aa6d71d54923655066049d9e21a15f01",
3+
"node_id": "MDY6Q29tbWl0NjE3MjEwOjg2YTJlMjQ1YWE2ZDcxZDU0OTIzNjU1MDY2MDQ5ZDllMjFhMTVmMjM=",
4+
"commit": {
5+
"author": {
6+
"name": "Sourabh Parkala",
7+
"email": "sourabh.sarvotham.parkala@sap.com",
8+
"date": "2010-04-19T04:12:41Z"
9+
},
10+
"committer": {
11+
"name": "Sourabh Parkala",
12+
"email": "sourabh.sarvotham.parkala@sap.com",
13+
"date": "2010-04-19T04:12:41Z"
14+
},
15+
"message": "doc",
16+
"tree": {
17+
"sha": "17ed4173aeb2e98c93216e8b6e16138dc7f8cd91",
18+
"url": "https://api.github.com/repos/hub4j/github-api/git/trees/17ed4173aeb2e98c93216e8b6e16138dc7f8cd91"
19+
},
20+
"url": "https://api.github.com/repos/hub4j/github-api/git/commits/86a2e245aa6d71d54923655066049d9e21a15f01",
21+
"comment_count": 0,
22+
"verification": {
23+
"verified": false,
24+
"reason": "bad_cert",
25+
"signature": "-----BEGIN SIGNED MESSAGE-----\nMIIFdQYJKoZIhvcNAQcCoIIFZjCCBWICAQExDTALBglghkgBZQMEAgEwCwYJKoZI\nhvcNAQcBoIIDejCCA3YwggJeoAMCAQICAQIwDQYJKoZIhvcNAQELBQAwKjEbMBkG\nA1UEAwwSQXN0cm9UbGFsb2PigJlzIENBMQswCQYDVQQGEwJVUzAeFw0yMzA5MTgy\nMzI2MDlaFw0yNDA5MTcyMzI2MDlaMEYxFDASBgNVBAMMC0FzdHJvVGxhbG9jMQsw\nCQYDVQQGEwJVUzEhMB8GCSqGSIb3DQEJARYSMHhUbGFsb2NAZ21haWwuY29tMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Zq+N5v68htABs4ZLPORns/F\nzixnI+6L+WaVGeQFzxIBs9zsm9IRGJ4xoMBPSg1BuoilRXzsQoCH6+5zyQ4jaHMa\nHBBEijVM7kor3Um+35KdYh79nIY7ZQoDRypLF02FiqfNjhN8Nm8ciNf2EUkiGIcj\n/+TPhVFMxnwlZ2SmSJoMBE5pkDBllb/8kfxgenSoVLXaOigYJ1It6AqH2L8Ju9pa\nJ1zJGu2edjN6xi/0yjzZ7CmPFbnWcY5flJfMqdaj0Po3dMwYKYK07rE7KQHc8wFT\ngAUtQNtJkGBjEcTBh1B7SUsnJ/x4XcSQwOMxPNSm4Esn2RWanJYunez75eCWlwID\nAQABo4GKMIGHMA4GA1UdDwEB/wQEAwIFoDAWBgNVHSUBAf8EDDAKBggrBgEFBQcD\nBDAdBgNVHQ4EFgQUSi5d7oqzSYNhpeG4I2VNF9j881UwHwYDVR0jBBgwFoAULCWl\nbibBiKOX/6M3RWgIlSPM7dcwHQYDVR0RBBYwFIESMHhUbGFsb2NAZ21haWwuY29t\nMA0GCSqGSIb3DQEBCwUAA4IBAQDSn3caORjlSXCSm8ZY1uAbG+IngvEooIJvbl+y\n0yglPA3pkWybXxLfvayJVRGtNgLambnPpulzZmdwjj7qSTzd9K/+OIsI2qjNrZZ+\napXJLhlfabNHzydj0y0DUWgbtKzQ1SVhWgglHaCp440UmVAi0PtsMy3F1S5S0HlZ\n80V1CE3r7UYsC64GG3CmyXVf5MB+pzPriE729Gglig5z6rq8F+GNk5hJW7tOKBRb\nCyXFkqbkMWHPJ/CP5wrFjrEITsn8fIhlJsYRIAGzTnffCOs9i3rMpUTXRBOwSVMB\nI1I3VPm+WxVE7O9NY7TGBDe7010D4DorTNUPYo8xsPtKYyrpMYIBwTCCAb0CAQEw\nLzAqMRswGQYDVQQDDBJBc3Ryb1RsYWxvY+KAmXMgQ0ExCzAJBgNVBAYTAlVTAgEC\nMAsGCWCGSAFlAwQCAaBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI\nhvcNAQkFMQ8XDTIzMDkxODIzMjg1MFowLwYJKoZIhvcNAQkEMSIEIIFHI8Ick3Tu\nBlnfTU6v24ls8D+jGkpQoDK+MF4rk5iTMAsGCSqGSIb3DQEBCwSCAQC4nIUEB/bR\ngeXnO7KdtqRFn/slCNTKZaQObsyL7C7cmNYAlgQAYj/qOBhKGMd3ZAFHRUroCiCy\n5GPs1sEnPKT1Bh7E7HJbpfdMXZINxoiRBrwQpAD/UKxk6etF5qvtAwDJaFMZiTMh\nd6tPNVBcThhUglSqqQFT3BKE9z5KTGwonMeqZlyf/EpXRBn0YcaoWvcAzaahMBQw\nUPwwEtU3FVyYBbLQee0SoYDsddEjdaNN/37auMVIltYmKNq/A4KhJWduTGFcaD/k\nfcXIzhzBi4vk1No6y2ftDgbivxP3MVQyf1tIfD1fv9cw/55JnDRA3IXkQRc+yyUG\nGmHXpKHhqNKm\n-----END SIGNED MESSAGE-----",
26+
"payload": null
27+
}
28+
},
29+
"url": "https://api.github.com/repos/hub4j/github-api/commits/86a2e245aa6d71d54923655066049d9e21a15f01",
30+
"html_url": "https://github.com/hub4j/github-api/commit/86a2e245aa6d71d54923655066049d9e21a15f01",
31+
"comments_url": "https://api.github.com/repos/hub4j/github-api/commits/86a2e245aa6d71d54923655066049d9e21a15f01/comments",
32+
"author": {
33+
"login": "kohsuke",
34+
"id": 50003,
35+
"node_id": "MDQ6VXNlcjUwMDAz",
36+
"avatar_url": "https://avatars1.githubusercontent.com/u/50003?v=4",
37+
"gravatar_id": "",
38+
"url": "https://api.github.com/users/kohsuke",
39+
"html_url": "https://github.com/kohsuke",
40+
"followers_url": "https://api.github.com/users/kohsuke/followers",
41+
"following_url": "https://api.github.com/users/kohsuke/following{/other_user}",
42+
"gists_url": "https://api.github.com/users/kohsuke/gists{/gist_id}",
43+
"starred_url": "https://api.github.com/users/kohsuke/starred{/owner}{/repo}",
44+
"subscriptions_url": "https://api.github.com/users/kohsuke/subscriptions",
45+
"organizations_url": "https://api.github.com/users/kohsuke/orgs",
46+
"repos_url": "https://api.github.com/users/kohsuke/repos",
47+
"events_url": "https://api.github.com/users/kohsuke/events{/privacy}",
48+
"received_events_url": "https://api.github.com/users/kohsuke/received_events",
49+
"type": "User",
50+
"site_admin": false
51+
},
52+
"committer": {
53+
"login": "kohsuke",
54+
"id": 50003,
55+
"node_id": "MDQ6VXNlcjUwMDAz",
56+
"avatar_url": "https://avatars1.githubusercontent.com/u/50003?v=4",
57+
"gravatar_id": "",
58+
"url": "https://api.github.com/users/kohsuke",
59+
"html_url": "https://github.com/kohsuke",
60+
"followers_url": "https://api.github.com/users/kohsuke/followers",
61+
"following_url": "https://api.github.com/users/kohsuke/following{/other_user}",
62+
"gists_url": "https://api.github.com/users/kohsuke/gists{/gist_id}",
63+
"starred_url": "https://api.github.com/users/kohsuke/starred{/owner}{/repo}",
64+
"subscriptions_url": "https://api.github.com/users/kohsuke/subscriptions",
65+
"organizations_url": "https://api.github.com/users/kohsuke/orgs",
66+
"repos_url": "https://api.github.com/users/kohsuke/repos",
67+
"events_url": "https://api.github.com/users/kohsuke/events{/privacy}",
68+
"received_events_url": "https://api.github.com/users/kohsuke/received_events",
69+
"type": "User",
70+
"site_admin": false
71+
},
72+
"parents": [
73+
{
74+
"sha": "ecbfdd7315ef2cf04b2be7f11a072ce0bd00c396",
75+
"url": "https://api.github.com/repos/hub4j/github-api/commits/ecbfdd7315ef2cf04b2be7f11a072ce0bd00c396",
76+
"html_url": "https://github.com/hub4j/github-api/commit/ecbfdd7315ef2cf04b2be7f11a072ce0bd00c396"
77+
}
78+
],
79+
"stats": {
80+
"total": 3,
81+
"additions": 3,
82+
"deletions": 0
83+
},
84+
"files": [
85+
{
86+
"sha": "2a2e1f77fd77bd03273946d893d25a455f696be0",
87+
"filename": "README",
88+
"status": "added",
89+
"additions": 3,
90+
"deletions": 0,
91+
"changes": 3,
92+
"blob_url": "https://github.com/hub4j/github-api/blob/86a2e245aa6d71d54923655066049d9e21a15f01/README",
93+
"raw_url": "https://github.com/hub4j/github-api/raw/86a2e245aa6d71d54923655066049d9e21a15f01/README",
94+
"contents_url": "https://api.github.com/repos/hub4j/github-api/contents/README?ref=86a2e245aa6d71d54923655066049d9e21a15f01",
95+
"patch": "@@ -0,0 +1,3 @@\n+Java API for GitHub\n+\n+See http://kohsuke.org/github-api/ for more details"
96+
}
97+
]
98+
}

0 commit comments

Comments
 (0)