mirror of
https://github.com/jlengrand/github-api.git
synced 2026-03-11 00:11:25 +00:00
Compare commits
226 Commits
github-api
...
github-api
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
67280951ff | ||
|
|
c3a9f6f9f5 | ||
|
|
e631e46dd1 | ||
|
|
15163ffde0 | ||
|
|
b898284821 | ||
|
|
3bb7eb2e03 | ||
|
|
11fcb9d456 | ||
|
|
29f826448a | ||
|
|
a8cf4a7120 | ||
|
|
60dce94a47 | ||
|
|
c965b9cc24 | ||
|
|
762a32eb6d | ||
|
|
541dac1aee | ||
|
|
e2e2329301 | ||
|
|
9afad71b0f | ||
|
|
7bbe0f7e8a | ||
|
|
d90adfa98e | ||
|
|
1dbcc4b776 | ||
|
|
18696fca2d | ||
|
|
c40100b6da | ||
|
|
6396818740 | ||
|
|
6df5a0d47b | ||
|
|
15c18c5547 | ||
|
|
4b6981c2e7 | ||
|
|
1b4025300c | ||
|
|
983c871bff | ||
|
|
609f532f8c | ||
|
|
c6fc03c73a | ||
|
|
b6e48cc4f9 | ||
|
|
50f43cc178 | ||
|
|
f421067a0d | ||
|
|
edd9a2d5b6 | ||
|
|
41e0329f55 | ||
|
|
21ea916e0d | ||
|
|
3b6ca3020e | ||
|
|
3737845b78 | ||
|
|
a30c78cd12 | ||
|
|
f8fba41a30 | ||
|
|
052902fb49 | ||
|
|
58143c26bc | ||
|
|
5d83894056 | ||
|
|
e35667525f | ||
|
|
2f318152d8 | ||
|
|
bc518a9ae8 | ||
|
|
425ae2d536 | ||
|
|
a6cacd4aba | ||
|
|
5a7083537c | ||
|
|
e15f7a59fd | ||
|
|
a2fa526aa0 | ||
|
|
7e959d6a87 | ||
|
|
5121fe1cbf | ||
|
|
3c3d4fc151 | ||
|
|
a7f75c9a6c | ||
|
|
e7262b8fbe | ||
|
|
af3099c526 | ||
|
|
2b9d47cea8 | ||
|
|
5db90d3fc4 | ||
|
|
372d5ff758 | ||
|
|
ebf39eaea1 | ||
|
|
556786f2e1 | ||
|
|
0f64994537 | ||
|
|
ac64c2022b | ||
|
|
9802132b6f | ||
|
|
4d6c5c14f1 | ||
|
|
d228a5fb93 | ||
|
|
7b46ef10c8 | ||
|
|
8eb9fba051 | ||
|
|
7b58182683 | ||
|
|
95fbf9274b | ||
|
|
09557dfa0f | ||
|
|
4029fcc1ca | ||
|
|
d6627b1e34 | ||
|
|
86d75fd767 | ||
|
|
e2220bb3b3 | ||
|
|
1a9b8bd1da | ||
|
|
9eda2d3f77 | ||
|
|
e6d59df705 | ||
|
|
db845850b2 | ||
|
|
d516597659 | ||
|
|
3af5a8145a | ||
|
|
31bebd4a7a | ||
|
|
ccb87258b0 | ||
|
|
2ab71e88bd | ||
|
|
78bd7585bb | ||
|
|
92cc81d9b8 | ||
|
|
97a1c741de | ||
|
|
077d693959 | ||
|
|
94831fc10a | ||
|
|
1f298a88b0 | ||
|
|
7e49946bed | ||
|
|
1e81ab1017 | ||
|
|
311180d12e | ||
|
|
0efb206881 | ||
|
|
0b92fa5615 | ||
|
|
a58a5b56b2 | ||
|
|
b9764c0a44 | ||
|
|
590f7ba511 | ||
|
|
449909b0e8 | ||
|
|
40780525f8 | ||
|
|
0e3707d1c3 | ||
|
|
8ddbef093b | ||
|
|
4ccdfccdf0 | ||
|
|
3c8aa0c630 | ||
|
|
ba519f996a | ||
|
|
62d9b92e6e | ||
|
|
d2c909584d | ||
|
|
219916eb14 | ||
|
|
0a37ac901f | ||
|
|
4586baea27 | ||
|
|
d83961e85b | ||
|
|
7e35716ff0 | ||
|
|
d0cf1ac605 | ||
|
|
9a19d07ab8 | ||
|
|
922be0b164 | ||
|
|
d0b8e2e37e | ||
|
|
e3d6e08b6a | ||
|
|
16a6623095 | ||
|
|
7bf31ca149 | ||
|
|
030f2360ca | ||
|
|
08eafc4214 | ||
|
|
134ece9385 | ||
|
|
3e4b06e959 | ||
|
|
3e3c6f70ba | ||
|
|
3097378a10 | ||
|
|
53f7a0f78a | ||
|
|
45a6841772 | ||
|
|
80b93a6e33 | ||
|
|
6aaab641be | ||
|
|
4999490c06 | ||
|
|
c7c1cd8bb3 | ||
|
|
8a1f116305 | ||
|
|
f8fe1dda6d | ||
|
|
bf44232d5c | ||
|
|
8c8ba47ef9 | ||
|
|
b3580002d0 | ||
|
|
1249199b22 | ||
|
|
f39a47f354 | ||
|
|
f58f15925f | ||
|
|
a071f8bb86 | ||
|
|
d33609ee57 | ||
|
|
f2c08bc1e8 | ||
|
|
688d8ed7bc | ||
|
|
2ddb4018b8 | ||
|
|
3ec25683f7 | ||
|
|
25d426f483 | ||
|
|
9d91ebc47a | ||
|
|
c784ab6632 | ||
|
|
ed5e3f13a1 | ||
|
|
3dcd82745e | ||
|
|
c564dc5f29 | ||
|
|
d64453b661 | ||
|
|
834ed7db0e | ||
|
|
db1dde533f | ||
|
|
9c66d9465e | ||
|
|
8c193d004e | ||
|
|
7cbd7f999a | ||
|
|
4340c8cb00 | ||
|
|
6f6583772d | ||
|
|
c62bc8d5da | ||
|
|
f68bfcb3e2 | ||
|
|
a37ade13cd | ||
|
|
1e0129f2d8 | ||
|
|
2e1d4381b0 | ||
|
|
a409b4f49c | ||
|
|
926776204b | ||
|
|
bba490127d | ||
|
|
80672c43c0 | ||
|
|
926e0ea0e5 | ||
|
|
6da169cd56 | ||
|
|
aaf10aa118 | ||
|
|
145bdacf13 | ||
|
|
51309efd46 | ||
|
|
60fe143b07 | ||
|
|
3f921b69f6 | ||
|
|
d2ac81d7ba | ||
|
|
2e5a9479a8 | ||
|
|
ec664ab6a2 | ||
|
|
8818bf8cf0 | ||
|
|
cc53e0c8ff | ||
|
|
8353499d18 | ||
|
|
d2c5994616 | ||
|
|
500b9097f7 | ||
|
|
7993266e6e | ||
|
|
74090103a9 | ||
|
|
a18cde2340 | ||
|
|
ee98e97876 | ||
|
|
ff63bafd72 | ||
|
|
3f8c8be77a | ||
|
|
769cdc73e7 | ||
|
|
cef8f74c00 | ||
|
|
9f5ab709de | ||
|
|
c6fdae3b3c | ||
|
|
320cf0fea2 | ||
|
|
0261f1262f | ||
|
|
5278ae3662 | ||
|
|
2941c44de2 | ||
|
|
627222602e | ||
|
|
e13b1ffc48 | ||
|
|
10bafce217 | ||
|
|
4817969495 | ||
|
|
2feda55eb7 | ||
|
|
a74cfd453a | ||
|
|
a360f65133 | ||
|
|
6a903d65a7 | ||
|
|
d4b3166036 | ||
|
|
21a54e2333 | ||
|
|
37c58bffba | ||
|
|
4a42b7277c | ||
|
|
071aea397b | ||
|
|
9c02f918c1 | ||
|
|
15c5c9615e | ||
|
|
0b74692d62 | ||
|
|
8f24f55eb7 | ||
|
|
cd5ab1ae9b | ||
|
|
d29ea97948 | ||
|
|
9930e7bb93 | ||
|
|
b1d37e4848 | ||
|
|
893152cdf3 | ||
|
|
efbf98751d | ||
|
|
caac294e79 | ||
|
|
d145ad8f47 | ||
|
|
628034ae8c | ||
|
|
fee02a3d16 | ||
|
|
ce5ae13bf6 | ||
|
|
26b6a94e32 | ||
|
|
be6ef475ba |
22
LICENSE.txt
Normal file
22
LICENSE.txt
Normal file
@@ -0,0 +1,22 @@
|
||||
Copyright (c) 2011- Kohsuke Kawaguchi and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
38
pom.xml
38
pom.xml
@@ -3,11 +3,11 @@
|
||||
<parent>
|
||||
<groupId>org.kohsuke</groupId>
|
||||
<artifactId>pom</artifactId>
|
||||
<version>6</version>
|
||||
<version>12</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>github-api</artifactId>
|
||||
<version>1.48</version>
|
||||
<version>1.62</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.48</tag>
|
||||
<tag>github-api-1.62</tag>
|
||||
</scm>
|
||||
|
||||
<distributionManagement>
|
||||
@@ -35,7 +35,7 @@
|
||||
<plugin>
|
||||
<groupId>com.infradna.tool</groupId>
|
||||
<artifactId>bridge-method-injector</artifactId>
|
||||
<version>1.8</version>
|
||||
<version>1.14</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
@@ -61,7 +61,7 @@
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<version>4.11</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -77,8 +77,7 @@
|
||||
<dependency>
|
||||
<groupId>com.infradna.tool</groupId>
|
||||
<artifactId>bridge-method-annotation</artifactId>
|
||||
<version>1.8</version>
|
||||
<optional>true</optional>
|
||||
<version>1.14</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.kohsuke.stapler</groupId>
|
||||
@@ -92,6 +91,24 @@
|
||||
<version>3.1.0.201310021548-r</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp</groupId>
|
||||
<artifactId>okhttp-urlconnection</artifactId>
|
||||
<version>2.0.0</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.kohsuke</groupId>
|
||||
<artifactId>wordnet-random-name</artifactId>
|
||||
<version>1.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-all</artifactId>
|
||||
<version>1.9.5</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<repositories>
|
||||
<repository>
|
||||
@@ -115,4 +132,11 @@
|
||||
</plugins>
|
||||
</reporting>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>The MIT license</name>
|
||||
<url>http://www.opensource.org/licenses/mit-license.php</url>
|
||||
<distribution>repo</distribution>
|
||||
</license>
|
||||
</licenses>
|
||||
</project>
|
||||
|
||||
@@ -1,26 +1,22 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Asset in a release.
|
||||
*
|
||||
* @see GHRelease#getAssets()
|
||||
*/
|
||||
public class GHAsset {
|
||||
public class GHAsset extends GHObject {
|
||||
GitHub root;
|
||||
GHRepository owner;
|
||||
private String url;
|
||||
private String id;
|
||||
private String name;
|
||||
private String label;
|
||||
private String state;
|
||||
private String content_type;
|
||||
private long size;
|
||||
private long download_count;
|
||||
private Date created_at;
|
||||
private Date updated_at;
|
||||
private String browser_download_url;
|
||||
|
||||
public String getContentType() {
|
||||
return content_type;
|
||||
@@ -31,18 +27,10 @@ public class GHAsset {
|
||||
this.content_type = contentType;
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return created_at;
|
||||
}
|
||||
|
||||
public long getDownloadCount() {
|
||||
return download_count;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
@@ -72,12 +60,8 @@ public class GHAsset {
|
||||
return state;
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() {
|
||||
return updated_at;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
public String getBrowserDownloadUrl() {
|
||||
return browser_download_url;
|
||||
}
|
||||
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.util.List;
|
||||
* @see GitHub#createToken(Collection, String, String)
|
||||
* @see http://developer.github.com/v3/oauth/#create-a-new-authorization
|
||||
*/
|
||||
public class GHAuthorization {
|
||||
public class GHAuthorization extends GHObject {
|
||||
public static final String USER = "user";
|
||||
public static final String USER_EMAIL = "user:email";
|
||||
public static final String USER_FOLLOW = "user:follow";
|
||||
@@ -22,26 +22,27 @@ public class GHAuthorization {
|
||||
public static final String DELETE_REPO = "delete_repo";
|
||||
public static final String NOTIFICATIONS = "notifications";
|
||||
public static final String GIST = "gist";
|
||||
public static final String READ_HOOK = "read:repo_hook";
|
||||
public static final String WRITE_HOOK = "write:repo_hook";
|
||||
public static final String AMIN_HOOK = "admin:repo_hook";
|
||||
public static final String READ_ORG = "read:org";
|
||||
public static final String WRITE_ORG = "write:org";
|
||||
public static final String ADMIN_ORG = "admin:org";
|
||||
public static final String READ_KEY = "read:public_key";
|
||||
public static final String WRITE_KEY = "write:public_key";
|
||||
public static final String ADMIN_KEY = "admin:public_key";
|
||||
|
||||
private GitHub root;
|
||||
private int id;
|
||||
private String url;
|
||||
private List<String> scopes;
|
||||
private String token;
|
||||
private App app;
|
||||
private String note;
|
||||
private String note_url;
|
||||
private String updated_at;
|
||||
private String created_at;
|
||||
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public List<String> getScopes() {
|
||||
return scopes;
|
||||
}
|
||||
@@ -69,14 +70,6 @@ public class GHAuthorization {
|
||||
public URL getNoteUrl(){
|
||||
return GitHub.parseURL(note_url);
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() {
|
||||
return GitHub.parseDate(updated_at);
|
||||
}
|
||||
|
||||
/*package*/ GHAuthorization wrap(GitHub root) {
|
||||
this.root = root;
|
||||
|
||||
@@ -12,13 +12,11 @@ import java.util.Date;
|
||||
* @see GHCommit#listComments()
|
||||
* @see GHCommit#createComment(String, String, Integer, Integer)
|
||||
*/
|
||||
public class GHCommitComment {
|
||||
public class GHCommitComment extends GHObject {
|
||||
private GHRepository owner;
|
||||
|
||||
String updated_at, created_at;
|
||||
String body, url, html_url, commit_id;
|
||||
String body, html_url, commit_id;
|
||||
Integer line;
|
||||
int id;
|
||||
String path;
|
||||
User user;
|
||||
|
||||
@@ -32,14 +30,6 @@ public class GHCommitComment {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() {
|
||||
return GitHub.parseDate(updated_at);
|
||||
}
|
||||
|
||||
/**
|
||||
* URL like 'https://github.com/kohsuke/sandbox-ant/commit/8ae38db0ea5837313ab5f39d43a6f73de3bd9000#commitcomment-1252827' to
|
||||
* show this commit comment in a browser.
|
||||
@@ -75,10 +65,6 @@ public class GHCommitComment {
|
||||
return line!=null ? line : -1;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the user who put this comment.
|
||||
*/
|
||||
|
||||
105
src/main/java/org/kohsuke/github/GHCommitQueryBuilder.java
Normal file
105
src/main/java/org/kohsuke/github/GHCommitQueryBuilder.java
Normal file
@@ -0,0 +1,105 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Builds up query for listing commits.
|
||||
*
|
||||
* <p>
|
||||
* Call various methods that set the filter criteria, then {@link #list()} method to actually list up the commit.
|
||||
*
|
||||
* <pre>
|
||||
* GHRepository r = ...;
|
||||
* for (GHCommit c : r.queryCommits().since(x).until(y).author("kohsuke")) {
|
||||
* ...
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#queryCommits()
|
||||
*/
|
||||
public class GHCommitQueryBuilder {
|
||||
private final Requester req;
|
||||
private final GHRepository repo;
|
||||
|
||||
/*package*/ GHCommitQueryBuilder(GHRepository repo) {
|
||||
this.repo = repo;
|
||||
this.req = repo.root.retrieve(); // requester to build up
|
||||
}
|
||||
|
||||
/**
|
||||
* GItHub login or email address by which to filter by commit author.
|
||||
*/
|
||||
public GHCommitQueryBuilder author(String author) {
|
||||
req.with("author",author);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits containing this file path will be returned.
|
||||
*/
|
||||
public GHCommitQueryBuilder path(String path) {
|
||||
req.with("path",path);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies the SHA1 commit / tag / branch / etc to start listing commits from.
|
||||
*
|
||||
*/
|
||||
public GHCommitQueryBuilder from(String ref) {
|
||||
req.with("sha",ref);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHCommitQueryBuilder pageSize(int pageSize) {
|
||||
req.with("per_page",pageSize);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits after this date will be returned
|
||||
*/
|
||||
public GHCommitQueryBuilder since(Date dt) {
|
||||
req.with("since",GitHub.printDate(dt));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits after this date will be returned
|
||||
*/
|
||||
public GHCommitQueryBuilder since(long timestamp) {
|
||||
return since(new Date(timestamp));
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits before this date will be returned
|
||||
*/
|
||||
public GHCommitQueryBuilder until(Date dt) {
|
||||
req.with("until",GitHub.printDate(dt));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only commits before this date will be returned
|
||||
*/
|
||||
public GHCommitQueryBuilder until(long timestamp) {
|
||||
return until(new Date(timestamp));
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up the commits with the criteria built so far.
|
||||
*/
|
||||
public PagedIterable<GHCommit> list() {
|
||||
return new PagedIterable<GHCommit>() {
|
||||
public PagedIterator<GHCommit> iterator() {
|
||||
return new PagedIterator<GHCommit>(req.asIterator(repo.getApiTailUrl("commits"), GHCommit[].class)) {
|
||||
protected void wrapUp(GHCommit[] page) {
|
||||
for (GHCommit c : page)
|
||||
c.wrapUp(repo);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -10,12 +10,10 @@ import java.util.Date;
|
||||
* @see GHRepository#getCommitStatus(String)
|
||||
* @see GHCommit#getStatus()
|
||||
*/
|
||||
public class GHCommitStatus {
|
||||
String created_at, updated_at;
|
||||
public class GHCommitStatus extends GHObject {
|
||||
String state;
|
||||
String target_url,description;
|
||||
int id;
|
||||
String url;
|
||||
String context;
|
||||
GHUser creator;
|
||||
|
||||
private GitHub root;
|
||||
@@ -26,14 +24,6 @@ public class GHCommitStatus {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() {
|
||||
return GitHub.parseDate(updated_at);
|
||||
}
|
||||
|
||||
public GHCommitState getState() {
|
||||
for (GHCommitState s : GHCommitState.values()) {
|
||||
if (s.name().equalsIgnoreCase(state))
|
||||
@@ -55,18 +45,11 @@ public class GHCommitStatus {
|
||||
return description;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* API URL of this commit status.
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public GHUser getCreator() {
|
||||
return creator;
|
||||
}
|
||||
|
||||
public String getContext() {
|
||||
return context;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,9 +68,12 @@ public class GHCompare {
|
||||
public Commit[] getCommits() {
|
||||
return commits;
|
||||
}
|
||||
|
||||
public GHCommit.File[] getFiles() {
|
||||
return files;
|
||||
}
|
||||
|
||||
|
||||
public GHCompare wrap(GHRepository owner) {
|
||||
public GHCompare wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
for (Commit commit : commits) {
|
||||
commit.wrapUp(owner);
|
||||
@@ -145,6 +148,6 @@ public class GHCompare {
|
||||
}
|
||||
|
||||
public static enum Status {
|
||||
behind, ahead, identical
|
||||
behind, ahead, identical, diverged
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
|
||||
@@ -8,8 +10,10 @@ import javax.xml.bind.DatatypeConverter;
|
||||
* A Content of a repository.
|
||||
*
|
||||
* @author Alexandre COLLIGNON
|
||||
* @see GHRepository#getFileContent(String)
|
||||
*/
|
||||
public final class GHContent {
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
public class GHContent {
|
||||
private GHRepository owner;
|
||||
|
||||
private String type;
|
||||
@@ -105,12 +109,39 @@ public final class GHContent {
|
||||
return "dir".equals(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* List immediate children of this directory.
|
||||
*/
|
||||
public PagedIterable<GHContent> listDirectoryContent() throws IOException {
|
||||
if (!isDirectory())
|
||||
throw new IllegalStateException(path+" is not a directory");
|
||||
|
||||
return new PagedIterable<GHContent>() {
|
||||
public PagedIterator<GHContent> iterator() {
|
||||
return new PagedIterator<GHContent>(owner.root.retrieve().asIterator(url, GHContent[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHContent[] page) {
|
||||
GHContent.wrap(page,owner);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public GHContentUpdateResponse update(String newContent, String commitMessage) throws IOException {
|
||||
return update(newContent, commitMessage, null);
|
||||
return update(newContent.getBytes(), commitMessage, null);
|
||||
}
|
||||
|
||||
public GHContentUpdateResponse update(String newContent, String commitMessage, String branch) throws IOException {
|
||||
String encodedContent = DatatypeConverter.printBase64Binary(newContent.getBytes());
|
||||
return update(newContent.getBytes(), commitMessage, branch);
|
||||
}
|
||||
|
||||
public GHContentUpdateResponse update(byte[] newContentBytes, String commitMessage) throws IOException {
|
||||
return update(newContentBytes, commitMessage, null);
|
||||
}
|
||||
|
||||
public GHContentUpdateResponse update(byte[] newContentBytes, String commitMessage, String branch) throws IOException {
|
||||
String encodedContent = DatatypeConverter.printBase64Binary(newContentBytes);
|
||||
|
||||
Requester requester = new Requester(owner.root)
|
||||
.with("path", path)
|
||||
|
||||
@@ -4,7 +4,7 @@ package org.kohsuke.github;
|
||||
* The response that is returned when updating
|
||||
* repository content.
|
||||
**/
|
||||
public final class GHContentUpdateResponse {
|
||||
public class GHContentUpdateResponse {
|
||||
private GHContent content;
|
||||
private GHCommit commit;
|
||||
|
||||
|
||||
46
src/main/java/org/kohsuke/github/GHDeployKey.java
Normal file
46
src/main/java/org/kohsuke/github/GHDeployKey.java
Normal file
@@ -0,0 +1,46 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.commons.lang.builder.ToStringBuilder;
|
||||
|
||||
public class GHDeployKey {
|
||||
|
||||
protected String url, key, title;
|
||||
protected boolean verified;
|
||||
protected int id;
|
||||
private GHRepository owner;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public boolean isVerified() {
|
||||
return verified;
|
||||
}
|
||||
|
||||
public GHDeployKey wrap(GHRepository repo) {
|
||||
this.owner = repo;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return new ToStringBuilder(this).append("title",title).append("id",id).append("key",key).toString();
|
||||
}
|
||||
|
||||
public void delete() throws IOException {
|
||||
new Requester(owner.root).method("DELETE").to(String.format("/repos/%s/%s/keys/%d", owner.getOwnerName(), owner.getName(), id));
|
||||
}
|
||||
}
|
||||
53
src/main/java/org/kohsuke/github/GHDeployment.java
Normal file
53
src/main/java/org/kohsuke/github/GHDeployment.java
Normal file
@@ -0,0 +1,53 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
public class GHDeployment extends GHObject {
|
||||
private GHRepository owner;
|
||||
private GitHub root;
|
||||
protected String sha;
|
||||
protected String ref;
|
||||
protected String task;
|
||||
protected Object payload;
|
||||
protected String environment;
|
||||
protected String description;
|
||||
protected String statuses_url;
|
||||
protected String repository_url;
|
||||
protected GHUser creator;
|
||||
|
||||
|
||||
GHDeployment wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
this.root = owner.root;
|
||||
if(creator != null) creator.wrapUp(root);
|
||||
return this;
|
||||
}
|
||||
|
||||
public URL getStatusesUrl() {
|
||||
return GitHub.parseURL(statuses_url);
|
||||
}
|
||||
|
||||
public URL getRepositoryUrl() {
|
||||
return GitHub.parseURL(repository_url);
|
||||
}
|
||||
|
||||
public String getTask() {
|
||||
return task;
|
||||
}
|
||||
public String getPayload() {
|
||||
return (String) payload;
|
||||
}
|
||||
public String getEnvironment() {
|
||||
return environment;
|
||||
}
|
||||
public GHUser getCreator() {
|
||||
return creator;
|
||||
}
|
||||
public String getRef() {
|
||||
return ref;
|
||||
}
|
||||
public String getSha(){
|
||||
return sha;
|
||||
}
|
||||
}
|
||||
55
src/main/java/org/kohsuke/github/GHDeploymentBuilder.java
Normal file
55
src/main/java/org/kohsuke/github/GHDeploymentBuilder.java
Normal file
@@ -0,0 +1,55 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
//Based on https://developer.github.com/v3/repos/deployments/#create-a-deployment
|
||||
public class GHDeploymentBuilder {
|
||||
private final GHRepository repo;
|
||||
private final Requester builder;
|
||||
|
||||
public GHDeploymentBuilder(GHRepository repo) {
|
||||
this.repo = repo;
|
||||
this.builder = new Requester(repo.root);
|
||||
}
|
||||
|
||||
public GHDeploymentBuilder(GHRepository repo, String ref) {
|
||||
this(repo);
|
||||
ref(ref);
|
||||
}
|
||||
|
||||
public GHDeploymentBuilder ref(String branch) {
|
||||
builder.with("ref",branch);
|
||||
return this;
|
||||
}
|
||||
public GHDeploymentBuilder task(String task) {
|
||||
builder.with("task",task);
|
||||
return this;
|
||||
}
|
||||
public GHDeploymentBuilder autoMerge(boolean autoMerge) {
|
||||
builder.with("auto_merge",autoMerge);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHDeploymentBuilder requiredContexts(List<String> requiredContexts) {
|
||||
builder.with("required_contexts",requiredContexts);
|
||||
return this;
|
||||
}
|
||||
public GHDeploymentBuilder payload(String payload) {
|
||||
builder.with("payload",payload);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHDeploymentBuilder environment(String environment) {
|
||||
builder.with("environment",environment);
|
||||
return this;
|
||||
}
|
||||
public GHDeploymentBuilder description(String description) {
|
||||
builder.with("description",description);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHDeployment create() throws IOException {
|
||||
return builder.to(repo.getApiTailUrl("deployments"),GHDeployment.class).wrap(repo);
|
||||
}
|
||||
}
|
||||
8
src/main/java/org/kohsuke/github/GHDeploymentState.java
Normal file
8
src/main/java/org/kohsuke/github/GHDeploymentState.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* Represents the state of deployment
|
||||
*/
|
||||
public enum GHDeploymentState {
|
||||
PENDING, SUCCESS, ERROR, FAILURE
|
||||
}
|
||||
36
src/main/java/org/kohsuke/github/GHDeploymentStatus.java
Normal file
36
src/main/java/org/kohsuke/github/GHDeploymentStatus.java
Normal file
@@ -0,0 +1,36 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
public class GHDeploymentStatus extends GHObject {
|
||||
private GHRepository owner;
|
||||
private GitHub root;
|
||||
protected GHUser creator;
|
||||
protected String state;
|
||||
protected String description;
|
||||
protected String target_url;
|
||||
protected String deployment_url;
|
||||
protected String repository_url;
|
||||
public GHDeploymentStatus wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
this.root = owner.root;
|
||||
if(creator != null) creator.wrapUp(root);
|
||||
return this;
|
||||
}
|
||||
public URL getTargetUrl() {
|
||||
return GitHub.parseURL(target_url);
|
||||
}
|
||||
|
||||
public URL getDeploymentUrl() {
|
||||
return GitHub.parseURL(deployment_url);
|
||||
}
|
||||
|
||||
public URL getRepositoryUrl() {
|
||||
return GitHub.parseURL(repository_url);
|
||||
}
|
||||
public GHDeploymentState getState() {
|
||||
return GHDeploymentState.valueOf(state.toUpperCase());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class GHDeploymentStatusBuilder {
|
||||
private final Requester builder;
|
||||
private GHRepository repo;
|
||||
private int deploymentId;
|
||||
|
||||
public GHDeploymentStatusBuilder(GHRepository repo, int deploymentId, GHDeploymentState state) {
|
||||
this.repo = repo;
|
||||
this.deploymentId = deploymentId;
|
||||
this.builder = new Requester(repo.root);
|
||||
this.builder.with("state",state.toString().toLowerCase());
|
||||
}
|
||||
|
||||
public GHDeploymentStatusBuilder description(String description) {
|
||||
this.builder.with("description",description);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHDeploymentStatusBuilder targetUrl(String targetUrl) {
|
||||
this.builder.with("target_url",targetUrl);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHDeploymentStatus create() throws IOException {
|
||||
return builder.to(repo.getApiTailUrl("deployments")+"/"+deploymentId+"/statuses",GHDeploymentStatus.class).wrap(repo);
|
||||
}
|
||||
}
|
||||
69
src/main/java/org/kohsuke/github/GHEmail.java
Normal file
69
src/main/java/org/kohsuke/github/GHEmail.java
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2010, Kohsuke Kawaguchi
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package org.kohsuke.github;
|
||||
|
||||
|
||||
/**
|
||||
* Represents an email of GitHub.
|
||||
*
|
||||
* @author Kelly Campbell
|
||||
*/
|
||||
public class GHEmail {
|
||||
|
||||
protected String email;
|
||||
protected boolean primary;
|
||||
protected boolean verified;
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public boolean isPrimary() {
|
||||
return primary;
|
||||
}
|
||||
|
||||
public boolean isVerified() {
|
||||
return verified;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Email:"+email;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return email.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof GHEmail) {
|
||||
GHEmail that = (GHEmail) obj;
|
||||
return this.email.equals(that.email);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,8 @@ public enum GHEvent {
|
||||
COMMIT_COMMENT,
|
||||
CREATE,
|
||||
DELETE,
|
||||
DEPLOYMENT,
|
||||
DEPLOYMENT_STATUS,
|
||||
DOWNLOAD,
|
||||
FOLLOW,
|
||||
FORK,
|
||||
@@ -25,6 +27,8 @@ public enum GHEvent {
|
||||
PULL_REQUEST,
|
||||
PULL_REQUEST_REVIEW_COMMENT,
|
||||
PUSH,
|
||||
RELEASE,
|
||||
STATUS,
|
||||
TEAM_ADD,
|
||||
WATCH
|
||||
}
|
||||
|
||||
@@ -51,6 +51,8 @@ public abstract class GHEventPayload {
|
||||
@Override
|
||||
void wrapUp(GitHub root) {
|
||||
super.wrapUp(root);
|
||||
if (pull_request==null)
|
||||
throw new IllegalStateException("Expected pull_request payload, but got something else. Maybe we've got another type of event?");
|
||||
if (repository!=null) {
|
||||
repository.wrap(root);
|
||||
pull_request.wrap(repository);
|
||||
@@ -118,6 +120,7 @@ public abstract class GHEventPayload {
|
||||
private String ref;
|
||||
private int size;
|
||||
private List<PushCommit> commits;
|
||||
private GHRepository repository;
|
||||
|
||||
/**
|
||||
* The SHA of the HEAD commit on the repository
|
||||
@@ -156,6 +159,16 @@ public abstract class GHEventPayload {
|
||||
return commits;
|
||||
}
|
||||
|
||||
public GHRepository getRepository() {
|
||||
return repository;
|
||||
}
|
||||
|
||||
@Override
|
||||
void wrapUp(GitHub root) {
|
||||
if (repository!=null)
|
||||
repository.wrap(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Commit in a push
|
||||
*/
|
||||
|
||||
178
src/main/java/org/kohsuke/github/GHGist.java
Normal file
178
src/main/java/org/kohsuke/github/GHGist.java
Normal file
@@ -0,0 +1,178 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
/**
|
||||
* Gist
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHUser#listGists()
|
||||
* @see GitHub#getGist(String)
|
||||
* @see GitHub#createGist()
|
||||
* @see <a href="https://developer.github.com/v3/gists/">documentation</a>
|
||||
*/
|
||||
public class GHGist extends GHObject {
|
||||
/*package almost final*/ GHUser owner;
|
||||
/*package almost final*/ GitHub root;
|
||||
|
||||
private String forks_url, commits_url, id, git_pull_url, git_push_url, html_url;
|
||||
|
||||
@JsonProperty("public")
|
||||
private boolean _public;
|
||||
|
||||
private String description;
|
||||
|
||||
private int comments;
|
||||
|
||||
private String comments_url;
|
||||
|
||||
private Map<String,GHGistFile> files = new HashMap<String, GHGistFile>();
|
||||
|
||||
/**
|
||||
* User that owns this Gist.
|
||||
*/
|
||||
public GHUser getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public String getForksUrl() {
|
||||
return forks_url;
|
||||
}
|
||||
|
||||
public String getCommitsUrl() {
|
||||
return commits_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL like https://gist.github.com/gists/12345.git
|
||||
*/
|
||||
public String getGitPullUrl() {
|
||||
return git_pull_url;
|
||||
}
|
||||
|
||||
public String getGitPushUrl() {
|
||||
return git_push_url;
|
||||
}
|
||||
|
||||
public String getHtmlUrl() {
|
||||
return html_url;
|
||||
}
|
||||
|
||||
public boolean isPublic() {
|
||||
return _public;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public int getCommentCount() {
|
||||
return comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* API URL of listing comments.
|
||||
*/
|
||||
public String getCommentsUrl() {
|
||||
return comments_url;
|
||||
}
|
||||
|
||||
public GHGistFile getFile(String name) {
|
||||
return files.get(name);
|
||||
}
|
||||
|
||||
public Map<String,GHGistFile> getFiles() {
|
||||
return Collections.unmodifiableMap(files);
|
||||
}
|
||||
|
||||
/*package*/ GHGist wrapUp(GHUser owner) {
|
||||
this.owner = owner;
|
||||
this.root = owner.root;
|
||||
wrapUp();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used when caller obtains {@link GHGist} without knowing its owner.
|
||||
* A partially constructed owner object is interned.
|
||||
*/
|
||||
/*package*/ GHGist wrapUp(GitHub root) throws IOException {
|
||||
this.owner = root.getUser(owner);
|
||||
this.root = root;
|
||||
wrapUp();
|
||||
return this;
|
||||
}
|
||||
|
||||
private void wrapUp() {
|
||||
for (Entry<String, GHGistFile> e : files.entrySet()) {
|
||||
e.getValue().fileName = e.getKey();
|
||||
}
|
||||
}
|
||||
String getApiTailUrl(String tail) {
|
||||
return "/gists/" + id + '/' + tail;
|
||||
}
|
||||
|
||||
public void star() throws IOException {
|
||||
new Requester(root).method("PUT").to(getApiTailUrl("star"));
|
||||
}
|
||||
|
||||
public void unstar() throws IOException {
|
||||
new Requester(root).method("DELETE").to(getApiTailUrl("star"));
|
||||
}
|
||||
|
||||
public boolean isStarred() throws IOException {
|
||||
return root.retrieve().asHttpStatusCode(getApiTailUrl("star"))/100==2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forks this gist into your own.
|
||||
*/
|
||||
public GHGist fork() throws IOException {
|
||||
return new Requester(root).to(getApiTailUrl("forks"),GHGist.class).wrapUp(root);
|
||||
}
|
||||
|
||||
public PagedIterable<GHGist> listForks() {
|
||||
return new PagedIterable<GHGist>() {
|
||||
public PagedIterator<GHGist> iterator() {
|
||||
return new PagedIterator<GHGist>(root.retrieve().asIterator(getApiTailUrl("forks"), GHGist[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHGist[] page) {
|
||||
try {
|
||||
for (GHGist c : page)
|
||||
c.wrapUp(root);
|
||||
} catch (IOException e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this gist.
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to("/gists/" + id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
GHGist ghGist = (GHGist) o;
|
||||
return id.equals(ghGist.id);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return id.hashCode();
|
||||
}
|
||||
}
|
||||
48
src/main/java/org/kohsuke/github/GHGistBuilder.java
Normal file
48
src/main/java/org/kohsuke/github/GHGistBuilder.java
Normal file
@@ -0,0 +1,48 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
/**
|
||||
* Builder pattern for creating a new Gist.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GitHub#createGist()
|
||||
*/
|
||||
public class GHGistBuilder {
|
||||
private final GitHub root;
|
||||
private final Requester req;
|
||||
private final LinkedHashMap<String,Object> files = new LinkedHashMap<String, Object>();
|
||||
|
||||
public GHGistBuilder(GitHub root) {
|
||||
this.root = root;
|
||||
req = new Requester(root);
|
||||
}
|
||||
|
||||
public GHGistBuilder description(String desc) {
|
||||
req.with("description",desc);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHGistBuilder public_(boolean v) {
|
||||
req.with("public",v);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new file.
|
||||
*/
|
||||
public GHGistBuilder file(String fileName, String content) {
|
||||
files.put(fileName, Collections.singletonMap("content", content));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a Gist based on the parameters specified thus far.
|
||||
*/
|
||||
public GHGist create() throws IOException {
|
||||
req._with("files",files);
|
||||
return req.to("/gists",GHGist.class).wrapUp(root);
|
||||
}
|
||||
}
|
||||
60
src/main/java/org/kohsuke/github/GHGistFile.java
Normal file
60
src/main/java/org/kohsuke/github/GHGistFile.java
Normal file
@@ -0,0 +1,60 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* A file inside {@link GHGist}
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHGist#getFile(String)
|
||||
* @see GHGist#getFiles()
|
||||
*/
|
||||
public class GHGistFile {
|
||||
/*package almost final*/ String fileName;
|
||||
|
||||
private int size;
|
||||
private String raw_url, type, language, content;
|
||||
private boolean truncated;
|
||||
|
||||
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
||||
/**
|
||||
* File size in bytes.
|
||||
*/
|
||||
public int getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL that serves this file as-is.
|
||||
*/
|
||||
public String getRawUrl() {
|
||||
return raw_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Content type of this Gist, such as "text/plain"
|
||||
*/
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getLanguage() {
|
||||
return language;
|
||||
}
|
||||
|
||||
/**
|
||||
* Content of this file.
|
||||
*/
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
/**
|
||||
* (?) indicates if {@link #getContent()} contains a truncated content.
|
||||
*/
|
||||
public boolean isTruncated() {
|
||||
return truncated;
|
||||
}
|
||||
}
|
||||
@@ -10,18 +10,17 @@ import java.util.Map;
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public final class GHHook {
|
||||
public class GHHook extends GHObject {
|
||||
/**
|
||||
* Repository that the hook belongs to.
|
||||
*/
|
||||
/*package*/ transient GHRepository repository;
|
||||
|
||||
String created_at, updated_at, name;
|
||||
String name;
|
||||
List<String> events;
|
||||
boolean active;
|
||||
Map<String,String> config;
|
||||
int id;
|
||||
|
||||
|
||||
/*package*/ GHHook wrap(GHRepository owner) {
|
||||
this.repository = owner;
|
||||
return this;
|
||||
@@ -34,7 +33,7 @@ public final class GHHook {
|
||||
public EnumSet<GHEvent> getEvents() {
|
||||
EnumSet<GHEvent> s = EnumSet.noneOf(GHEvent.class);
|
||||
for (String e : events)
|
||||
Enum.valueOf(GHEvent.class,e.toUpperCase(Locale.ENGLISH));
|
||||
s.add(Enum.valueOf(GHEvent.class,e.toUpperCase(Locale.ENGLISH)));
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -46,10 +45,6 @@ public final class GHHook {
|
||||
return Collections.unmodifiableMap(config);
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this hook.
|
||||
*/
|
||||
|
||||
@@ -37,8 +37,11 @@ import java.util.Locale;
|
||||
*
|
||||
* @author Eric Maupin
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#getIssue(int)
|
||||
* @see GitHub#searchIssues()
|
||||
* @see GHIssueSearchBuilder
|
||||
*/
|
||||
public class GHIssue {
|
||||
public class GHIssue extends GHObject {
|
||||
GitHub root;
|
||||
GHRepository owner;
|
||||
|
||||
@@ -49,37 +52,27 @@ public class GHIssue {
|
||||
protected String closed_at;
|
||||
protected int comments;
|
||||
protected String body;
|
||||
protected List<Label> labels;
|
||||
protected List<GHLabel> labels;
|
||||
protected GHUser user;
|
||||
protected String title, created_at, html_url;
|
||||
protected String title, html_url;
|
||||
protected GHIssue.PullRequest pull_request;
|
||||
protected GHMilestone milestone;
|
||||
protected String url, updated_at;
|
||||
protected int id;
|
||||
protected GHUser closed_by;
|
||||
|
||||
public static class Label {
|
||||
private String url;
|
||||
private String name;
|
||||
private String color;
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getColor() {
|
||||
return color;
|
||||
}
|
||||
/**
|
||||
* @deprecated use {@link GHLabel}
|
||||
*/
|
||||
public static class Label extends GHLabel {
|
||||
}
|
||||
|
||||
/*package*/ GHIssue wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
this.root = owner.root;
|
||||
if(milestone != null) milestone.wrap(owner);
|
||||
if(milestone != null) milestone.wrap(owner);
|
||||
return wrap(owner.root);
|
||||
}
|
||||
|
||||
/*package*/ GHIssue wrap(GitHub root) {
|
||||
this.root = root;
|
||||
if(assignee != null) assignee.wrapUp(root);
|
||||
if(user != null) user.wrapUp(root);
|
||||
if(closed_by != null) closed_by.wrapUp(root);
|
||||
@@ -117,7 +110,7 @@ public class GHIssue {
|
||||
* The HTML page of this issue,
|
||||
* like https://github.com/jenkinsci/jenkins/issues/100
|
||||
*/
|
||||
public URL getUrl() {
|
||||
public URL getHtmlUrl() {
|
||||
return GitHub.parseURL(html_url);
|
||||
}
|
||||
|
||||
@@ -129,21 +122,13 @@ public class GHIssue {
|
||||
return Enum.valueOf(GHIssueState.class, state.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
public Collection<Label> getLabels() {
|
||||
public Collection<GHLabel> getLabels() throws IOException {
|
||||
if(labels == null){
|
||||
return Collections.EMPTY_LIST;
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return Collections.unmodifiableList(labels);
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() {
|
||||
return GitHub.parseDate(updated_at);
|
||||
}
|
||||
|
||||
public Date getClosedAt() {
|
||||
return GitHub.parseDate(closed_at);
|
||||
}
|
||||
@@ -163,6 +148,10 @@ public class GHIssue {
|
||||
new Requester(root)._with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
|
||||
private void editIssue(String key, Object value) throws IOException {
|
||||
new Requester(root)._with(key, value).method("PATCH").to(getIssuesApiRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes this issue.
|
||||
*/
|
||||
@@ -186,11 +175,11 @@ public class GHIssue {
|
||||
}
|
||||
|
||||
public void assignTo(GHUser user) throws IOException {
|
||||
edit("assignee",user.getLogin());
|
||||
editIssue("assignee",user.getLogin());
|
||||
}
|
||||
|
||||
public void setLabels(String... labels) throws IOException {
|
||||
edit("assignee",labels);
|
||||
editIssue("labels",labels);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -222,7 +211,7 @@ public class GHIssue {
|
||||
return getIssuesApiRoute();
|
||||
}
|
||||
|
||||
private String getIssuesApiRoute() {
|
||||
protected String getIssuesApiRoute() {
|
||||
return "/repos/"+owner.getOwnerName()+"/"+owner.getName()+"/issues/"+number;
|
||||
}
|
||||
|
||||
@@ -236,7 +225,15 @@ public class GHIssue {
|
||||
public GHUser getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reports who has closed the issue.
|
||||
*
|
||||
* <p>
|
||||
* Note that GitHub doesn't always seem to report this information
|
||||
* even for an issue that's already closed. See
|
||||
* https://github.com/kohsuke/github-api/issues/60.
|
||||
*/
|
||||
public GHUser getClosedBy() {
|
||||
if(!"closed".equals(state)) return null;
|
||||
if(closed_by != null) return closed_by;
|
||||
@@ -249,10 +246,17 @@ public class GHIssue {
|
||||
return comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns non-null if this issue is a shadow of a pull request.
|
||||
*/
|
||||
public PullRequest getPullRequest() {
|
||||
return pull_request;
|
||||
}
|
||||
|
||||
public boolean isPullRequest() {
|
||||
return pull_request!=null;
|
||||
}
|
||||
|
||||
public GHMilestone getMilestone() {
|
||||
return milestone;
|
||||
}
|
||||
|
||||
@@ -32,12 +32,10 @@ import java.util.Date;
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHIssueComment {
|
||||
public class GHIssueComment extends GHObject {
|
||||
GHIssue owner;
|
||||
|
||||
private String body, gravatar_id, created_at, updated_at;
|
||||
private URL url;
|
||||
private int id;
|
||||
private String body, gravatar_id;
|
||||
private GHUser user;
|
||||
|
||||
/*package*/ GHIssueComment wrapUp(GHIssue owner) {
|
||||
@@ -59,22 +57,6 @@ public class GHIssueComment {
|
||||
return body;
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() {
|
||||
return GitHub.parseDate(updated_at);
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public URL getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the ID of the user who posted this comment.
|
||||
*/
|
||||
|
||||
85
src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java
Normal file
85
src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java
Normal file
@@ -0,0 +1,85 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Search issues.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GitHub#searchIssues()
|
||||
*/
|
||||
public class GHIssueSearchBuilder {
|
||||
private final GitHub root;
|
||||
private final Requester req;
|
||||
private final List<String> terms = new ArrayList<String>();
|
||||
|
||||
/*package*/ GHIssueSearchBuilder(GitHub root) {
|
||||
this.root = root;
|
||||
req = root.retrieve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Search terms.
|
||||
*/
|
||||
public GHIssueSearchBuilder q(String term) {
|
||||
terms.add(term);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHIssueSearchBuilder mentions(GHUser u) {
|
||||
return mentions(u.getLogin());
|
||||
}
|
||||
|
||||
public GHIssueSearchBuilder mentions(String login) {
|
||||
return q("mentions:"+login);
|
||||
}
|
||||
|
||||
public GHIssueSearchBuilder isOpen() {
|
||||
return q("is:open");
|
||||
}
|
||||
|
||||
public GHIssueSearchBuilder isClosed() {
|
||||
return q("is:closed");
|
||||
}
|
||||
|
||||
public GHIssueSearchBuilder isMerged() {
|
||||
return q("is:merged");
|
||||
}
|
||||
|
||||
public GHIssueSearchBuilder sort(Sort sort) {
|
||||
req.with("sort",sort.toString().toLowerCase(Locale.ENGLISH));
|
||||
return this;
|
||||
}
|
||||
|
||||
public enum Sort { COMMENTS, CREATED, UPDATED }
|
||||
|
||||
private static class IssueSearchResult extends SearchResult<GHIssue> {
|
||||
private GHIssue[] items;
|
||||
|
||||
@Override
|
||||
public GHIssue[] getItems() {
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up the issues with the criteria built so far.
|
||||
*/
|
||||
public PagedSearchIterable<GHIssue> list() {
|
||||
return new PagedSearchIterable<GHIssue>() {
|
||||
public PagedIterator<GHIssue> iterator() {
|
||||
req.set("q", StringUtils.join(terms," "));
|
||||
return new PagedIterator<GHIssue>(adapt(req.asIterator("/search/issues", IssueSearchResult.class))) {
|
||||
protected void wrapUp(GHIssue[] page) {
|
||||
for (GHIssue c : page)
|
||||
c.wrap(root);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
37
src/main/java/org/kohsuke/github/GHLabel.java
Normal file
37
src/main/java/org/kohsuke/github/GHLabel.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHIssue#getLabels()
|
||||
* @see GHRepository#listLabels()
|
||||
*/
|
||||
public class GHLabel {
|
||||
private String url, name, color;
|
||||
private GHRepository repo;
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Color code without leading '#', such as 'f29513'
|
||||
*/
|
||||
public String getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
/*package*/ GHLabel wrapUp(GHRepository repo) {
|
||||
this.repo = repo;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void delete() throws IOException {
|
||||
repo.root.retrieve().method("DELETE").to(url);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
@@ -8,12 +9,12 @@ import java.util.Locale;
|
||||
* @author Yusuke Kokubo
|
||||
*
|
||||
*/
|
||||
public class GHMilestone {
|
||||
public class GHMilestone extends GHObject {
|
||||
GitHub root;
|
||||
GHRepository owner;
|
||||
|
||||
GHUser creator;
|
||||
private String state, due_on, title, url, created_at, description;
|
||||
private String state, due_on, title, description;
|
||||
private int closed_issues, open_issues, number;
|
||||
|
||||
public GitHub getRoot() {
|
||||
@@ -37,14 +38,6 @@ public class GHMilestone {
|
||||
return title;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
@@ -65,6 +58,21 @@ public class GHMilestone {
|
||||
return Enum.valueOf(GHMilestoneState.class, state.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes this issue.
|
||||
*/
|
||||
public void close() throws IOException {
|
||||
edit("state", "closed");
|
||||
}
|
||||
|
||||
private void edit(String key, Object value) throws IOException {
|
||||
new Requester(root)._with(key, value).method("PATCH").to(getApiRoute());
|
||||
}
|
||||
|
||||
protected String getApiRoute() {
|
||||
return "/repos/"+owner.getOwnerName()+"/"+owner.getName()+"/milestones/"+number;
|
||||
}
|
||||
|
||||
public GHMilestone wrap(GHRepository repo) {
|
||||
this.owner = repo;
|
||||
this.root = repo.root;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
@@ -16,18 +17,31 @@ import java.util.TreeMap;
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHMyself extends GHUser {
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #getEmails2()}
|
||||
*/
|
||||
public List<String> getEmails() throws IOException {
|
||||
List<GHEmail> src = getEmails2();
|
||||
List<String> r = new ArrayList<String>(src.size());
|
||||
for (GHEmail e : src) {
|
||||
r.add(e.getEmail());
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the read-only list of e-mail addresses configured for you.
|
||||
*
|
||||
* This corresponds to the stuff you configure in https://github.com/settings/emails,
|
||||
* and not to be confused with {@link #getEmail()} that shows your public e-mail address
|
||||
* set in https://github.com/settings/profile
|
||||
*
|
||||
*
|
||||
* @return
|
||||
* Always non-null.
|
||||
*/
|
||||
public List<String> getEmails() throws IOException {
|
||||
String[] addresses = root.retrieve().to("/user/emails", String[].class);
|
||||
public List<GHEmail> getEmails2() throws IOException {
|
||||
GHEmail[] addresses = root.retrieve().to("/user/emails", GHEmail[].class);
|
||||
return Collections.unmodifiableList(Arrays.asList(addresses));
|
||||
}
|
||||
|
||||
@@ -45,7 +59,7 @@ public class GHMyself extends GHUser {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the read-only list of all the pulic verified keys of the current user.
|
||||
* Returns the read-only list of all the public verified keys of the current user.
|
||||
*
|
||||
* Differently from the getPublicKeys() method, the retrieval of the user's
|
||||
* verified public keys does not require any READ/WRITE OAuth Scope to the
|
||||
@@ -87,11 +101,24 @@ public class GHMyself extends GHUser {
|
||||
* Lists up all repositories this user owns (public and private).
|
||||
*
|
||||
* Unlike {@link #getAllRepositories()}, this does not wait until all the repositories are returned.
|
||||
* Repositories are returned by GitHub API with a 30 items per page.
|
||||
*/
|
||||
public PagedIterable<GHRepository> listAllRepositories() {
|
||||
@Override
|
||||
public PagedIterable<GHRepository> listRepositories() {
|
||||
return listRepositories(30);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the repositories this user owns (public and private) using the specified page size.
|
||||
*
|
||||
* @param pageSize size for each page of items returned by GitHub. Maximum page size is 100.
|
||||
*
|
||||
* Unlike {@link #getRepositories()}, this does not wait until all the repositories are returned.
|
||||
*/
|
||||
public PagedIterable<GHRepository> listRepositories(final int pageSize) {
|
||||
return new PagedIterable<GHRepository>() {
|
||||
public PagedIterator<GHRepository> iterator() {
|
||||
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/user/repos", GHRepository[].class)) {
|
||||
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/user/repos?per_page=" + pageSize, GHRepository[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHRepository[] page) {
|
||||
for (GHRepository c : page)
|
||||
@@ -102,6 +129,14 @@ public class GHMyself extends GHUser {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use {@link #listRepositories()}
|
||||
*/
|
||||
public PagedIterable<GHRepository> listAllRepositories() {
|
||||
return listRepositories();
|
||||
}
|
||||
|
||||
// public void addEmails(Collection<String> emails) throws IOException {
|
||||
//// new Requester(root,ApiVersion.V3).withCredential().to("/user/emails");
|
||||
// root.retrieveWithAuth3()
|
||||
|
||||
63
src/main/java/org/kohsuke/github/GHObject.java
Normal file
63
src/main/java/org/kohsuke/github/GHObject.java
Normal file
@@ -0,0 +1,63 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Most (all?) domain objects in GitHub seems to have these 4 properties.
|
||||
*/
|
||||
public abstract class GHObject {
|
||||
protected String url;
|
||||
protected int id;
|
||||
protected String created_at;
|
||||
protected String updated_at;
|
||||
|
||||
/*package*/ GHObject() {
|
||||
}
|
||||
|
||||
/**
|
||||
* When was this resource created?
|
||||
*/
|
||||
@WithBridgeMethods(value=String.class, adapterMethod="createdAtStr")
|
||||
public Date getCreatedAt() throws IOException {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
private Object createdAtStr(Date id, Class type) {
|
||||
return created_at;
|
||||
}
|
||||
|
||||
/**
|
||||
* API URL of this object.
|
||||
*/
|
||||
@WithBridgeMethods(value=String.class, adapterMethod="urlToString")
|
||||
public URL getUrl() {
|
||||
return GitHub.parseURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* When was this resource last updated?
|
||||
*/
|
||||
public Date getUpdatedAt() throws IOException {
|
||||
return GitHub.parseDate(updated_at);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unique ID number of this resource.
|
||||
*/
|
||||
@WithBridgeMethods(value=String.class, adapterMethod="intToString")
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
private Object intToString(int id, Class type) {
|
||||
return String.valueOf(id);
|
||||
}
|
||||
|
||||
private Object urlToString(URL url, Class type) {
|
||||
return url==null ? null : url.toString();
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.AbstractList;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
@@ -24,10 +23,15 @@ public class GHOrganization extends GHPerson {
|
||||
* Newly created repository.
|
||||
*/
|
||||
public GHRepository createRepository(String name, String description, String homepage, String team, boolean isPublic) throws IOException {
|
||||
return createRepository(name,description,homepage,getTeams().get(team),isPublic);
|
||||
GHTeam t = getTeams().get(team);
|
||||
if (t==null)
|
||||
throw new IllegalArgumentException("No such team: "+team);
|
||||
return createRepository(name,description,homepage,t,isPublic);
|
||||
}
|
||||
|
||||
public GHRepository createRepository(String name, String description, String homepage, GHTeam team, boolean isPublic) throws IOException {
|
||||
if (team==null)
|
||||
throw new IllegalArgumentException("Invalid team");
|
||||
// such API doesn't exist, so fall back to HTML scraping
|
||||
return new Requester(root)
|
||||
.with("name", name).with("description", description).with("homepage", homepage)
|
||||
@@ -38,14 +42,41 @@ public class GHOrganization extends GHPerson {
|
||||
* Teams by their names.
|
||||
*/
|
||||
public Map<String,GHTeam> getTeams() throws IOException {
|
||||
GHTeam[] teams = root.retrieve().to("/orgs/" + login + "/teams", GHTeam[].class);
|
||||
Map<String,GHTeam> r = new TreeMap<String, GHTeam>();
|
||||
for (GHTeam t : teams) {
|
||||
r.put(t.getName(),t.wrapUp(this));
|
||||
for (GHTeam t : listTeams()) {
|
||||
r.put(t.getName(),t);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* List up all the teams.
|
||||
*/
|
||||
public PagedIterable<GHTeam> listTeams() throws IOException {
|
||||
return new PagedIterable<GHTeam>() {
|
||||
public PagedIterator<GHTeam> iterator() {
|
||||
return new PagedIterator<GHTeam>(root.retrieve().asIterator(String.format("/orgs/%s/teams", login), GHTeam[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHTeam[] page) {
|
||||
for (GHTeam c : page)
|
||||
c.wrapUp(GHOrganization.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds a team that has the given name in its {@link GHTeam#getName()}
|
||||
*/
|
||||
public GHTeam getTeamByName(String name) throws IOException {
|
||||
for (GHTeam t : listTeams()) {
|
||||
if(t.getName().equals(name))
|
||||
return t;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this organization has the specified user as a member.
|
||||
*/
|
||||
@@ -58,6 +89,14 @@ public class GHOrganization extends GHPerson {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a member of the organisation - which will remove them from
|
||||
* all teams, and remove their access to the organization’s repositories.
|
||||
*/
|
||||
public void remove(GHUser user) throws IOException {
|
||||
root.retrieve().method("DELETE").to("/orgs/" + login + "/members/" + user.getLogin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this organization has the specified user as a public member.
|
||||
*/
|
||||
@@ -78,26 +117,44 @@ public class GHOrganization extends GHPerson {
|
||||
}
|
||||
|
||||
/**
|
||||
* All the members of this organization.
|
||||
* @deprecated use {@link #listMembers()}
|
||||
*/
|
||||
public List<GHUser> getMembers() throws IOException {
|
||||
return new AbstractList<GHUser>() {
|
||||
// these are shallow objects with only some limited values filled out
|
||||
// TODO: it's better to allow objects to fill themselves in later when missing values are requested
|
||||
final GHUser[] shallow = root.retrieve().to("/orgs/" + login + "/members", GHUser[].class);
|
||||
return listMembers().asList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GHUser get(int index) {
|
||||
try {
|
||||
return root.getUser(shallow[index].getLogin());
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* All the members of this organization.
|
||||
*/
|
||||
public PagedIterable<GHUser> listMembers() throws IOException {
|
||||
return listMembers("members");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return shallow.length;
|
||||
/**
|
||||
* All the public members of this organization.
|
||||
*/
|
||||
public PagedIterable<GHUser> listPublicMembers() throws IOException {
|
||||
return listMembers("public_members");
|
||||
}
|
||||
|
||||
private PagedIterable<GHUser> listMembers(String suffix) throws IOException {
|
||||
return listMembers(suffix, null);
|
||||
}
|
||||
|
||||
public PagedIterable<GHUser> listMembersWithFilter(String filter) throws IOException {
|
||||
return listMembers("members", filter);
|
||||
}
|
||||
|
||||
private PagedIterable<GHUser> listMembers(final String suffix, final String filter) throws IOException {
|
||||
return new PagedIterable<GHUser>() {
|
||||
public PagedIterator<GHUser> iterator() {
|
||||
String filterParams = (filter == null) ? "" : ("?filter=" + filter);
|
||||
return new PagedIterator<GHUser>(root.retrieve().asIterator(String.format("/orgs/%s/%s%s", login, suffix, filterParams), GHUser[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHUser[] users) {
|
||||
GHUser.wrap(users, root);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -173,4 +230,26 @@ public class GHOrganization extends GHPerson {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the repositories using the specified page size.
|
||||
*
|
||||
* @param pageSize size for each page of items returned by GitHub. Maximum page size is 100.
|
||||
*
|
||||
* Unlike {@link #getRepositories()}, this does not wait until all the repositories are returned.
|
||||
*/
|
||||
@Override
|
||||
public PagedIterable<GHRepository> listRepositories(final int pageSize) {
|
||||
return new PagedIterable<GHRepository>() {
|
||||
public PagedIterator<GHRepository> iterator() {
|
||||
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/orgs/" + login + "/repos?per_page=" + pageSize, GHRepository[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHRepository[] page) {
|
||||
for (GHRepository c : page)
|
||||
c.wrap(root);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -14,15 +15,14 @@ import java.util.TreeMap;
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public abstract class GHPerson {
|
||||
public abstract class GHPerson extends GHObject {
|
||||
/*package almost final*/ GitHub root;
|
||||
|
||||
// core data fields that exist even for "small" user data (such as the user info in pull request)
|
||||
protected String login, avatar_url, url, gravatar_id;
|
||||
protected int id;
|
||||
protected String login, avatar_url, gravatar_id;
|
||||
|
||||
// other fields (that only show up in full data)
|
||||
protected String location,blog,email,name,created_at,company;
|
||||
protected String location,blog,email,name,company;
|
||||
protected String html_url;
|
||||
protected int followers,following,public_repos,public_gists;
|
||||
|
||||
@@ -36,20 +36,23 @@ public abstract class GHPerson {
|
||||
*
|
||||
* Depending on the original API call where this object is created, it may not contain everything.
|
||||
*/
|
||||
protected void populate() throws IOException {
|
||||
protected synchronized void populate() throws IOException {
|
||||
if (created_at!=null) return; // already populated
|
||||
|
||||
root.retrieve().to(url, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the repositories this user owns.
|
||||
* Gets the public repositories this user owns.
|
||||
*
|
||||
* <p>
|
||||
* To list your own repositories, including private repositories,
|
||||
* use {@link GHMyself#listRepositories()}
|
||||
*/
|
||||
public synchronized Map<String,GHRepository> getRepositories() throws IOException {
|
||||
Map<String,GHRepository> repositories = new TreeMap<String, GHRepository>();
|
||||
for (List<GHRepository> batch : iterateRepositories(100)) {
|
||||
for (GHRepository r : batch)
|
||||
repositories.put(r.getName(),r);
|
||||
for (GHRepository r : listRepositories()) {
|
||||
repositories.put(r.getName(),r);
|
||||
}
|
||||
return Collections.unmodifiableMap(repositories);
|
||||
}
|
||||
@@ -193,9 +196,14 @@ public abstract class GHPerson {
|
||||
return location;
|
||||
}
|
||||
|
||||
public String getCreatedAt() throws IOException {
|
||||
public Date getCreatedAt() throws IOException {
|
||||
populate();
|
||||
return created_at;
|
||||
return super.getCreatedAt();
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() throws IOException {
|
||||
populate();
|
||||
return super.getCreatedAt();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -206,6 +214,10 @@ public abstract class GHPerson {
|
||||
return blog;
|
||||
}
|
||||
|
||||
public String getHtmlUrl() {
|
||||
return html_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the e-mail address of the user.
|
||||
*/
|
||||
@@ -229,13 +241,6 @@ public abstract class GHPerson {
|
||||
return following;
|
||||
}
|
||||
|
||||
/**
|
||||
* What appears to be a GitHub internal unique number that identifies this user.
|
||||
*/
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getFollowersCount() throws IOException {
|
||||
populate();
|
||||
return followers;
|
||||
|
||||
@@ -9,7 +9,7 @@ import java.util.HashSet;
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public final class GHPersonSet<T extends GHPerson> extends HashSet<T> {
|
||||
public class GHPersonSet<T extends GHPerson> extends HashSet<T> {
|
||||
public GHPersonSet() {
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ import java.util.Locale;
|
||||
* A pull request.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
* @see GHRepository#getPullRequest(int)
|
||||
*/
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
public class GHPullRequest extends GHIssue {
|
||||
@@ -51,6 +52,13 @@ public class GHPullRequest extends GHIssue {
|
||||
private String mergeable_state;
|
||||
private int changed_files;
|
||||
|
||||
/**
|
||||
* GitHub doesn't return some properties of {@link GHIssue} when requesting the GET on the 'pulls' API
|
||||
* route as opposed to 'issues' API route. This flag remembers whether we made the GET call on the 'issues' route
|
||||
* on this object to fill in those missing details
|
||||
*/
|
||||
private transient boolean fetchedIssueDetails;
|
||||
|
||||
|
||||
GHPullRequest wrapUp(GHRepository owner) {
|
||||
this.wrap(owner);
|
||||
@@ -102,7 +110,7 @@ public class GHPullRequest extends GHIssue {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public Date getIssueUpdatedAt() {
|
||||
public Date getIssueUpdatedAt() throws IOException {
|
||||
return super.getUpdatedAt();
|
||||
}
|
||||
|
||||
@@ -119,11 +127,12 @@ public class GHPullRequest extends GHIssue {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Label> getLabels() {
|
||||
public Collection<GHLabel> getLabels() throws IOException {
|
||||
fetchIssue();
|
||||
return super.getLabels();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Override
|
||||
public GHUser getClosedBy() {
|
||||
return null;
|
||||
}
|
||||
@@ -185,24 +194,42 @@ public class GHPullRequest extends GHIssue {
|
||||
private void populate() throws IOException {
|
||||
if (merged_by!=null) return; // already populated
|
||||
|
||||
root.retrieve().to(url, this);
|
||||
root.retrieve().to(url, this).wrapUp(owner);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all the commits associated to this pull request.
|
||||
*/
|
||||
public PagedIterable<GHPullRequestCommitDetail> listCommits() {
|
||||
return new PagedIterable<GHPullRequestCommitDetail>() {
|
||||
public PagedIterator<GHPullRequestCommitDetail> iterator() {
|
||||
return new PagedIterator<GHPullRequestCommitDetail>(root.retrieve().asIterator(
|
||||
String.format("%s/commits", getApiURL().getPath()),
|
||||
GHPullRequestCommitDetail[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHPullRequestCommitDetail[] page) {
|
||||
}
|
||||
public PagedIterable<GHPullRequestCommitDetail> listCommits() {
|
||||
return new PagedIterable<GHPullRequestCommitDetail>() {
|
||||
public PagedIterator<GHPullRequestCommitDetail> iterator() {
|
||||
return new PagedIterator<GHPullRequestCommitDetail>(root.retrieve().asIterator(
|
||||
String.format("%s/commits", getApiURL()),
|
||||
GHPullRequestCommitDetail[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHPullRequestCommitDetail[] page) {
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge this pull request.
|
||||
*
|
||||
* The equivalent of the big green "Merge pull request" button.
|
||||
*
|
||||
* @param msg
|
||||
* Commit message. If null, the default one will be used.
|
||||
*/
|
||||
public void merge(String msg) throws IOException {
|
||||
new Requester(root).method("PUT").with("commit_message",msg).to(getApiRoute()+"/merge");
|
||||
}
|
||||
|
||||
private void fetchIssue() throws IOException {
|
||||
if (!fetchedIssueDetails) {
|
||||
new Requester(root).to(getIssuesApiRoute(), this);
|
||||
fetchedIssueDetails = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
@@ -8,6 +9,7 @@ import java.net.URL;
|
||||
* @author Michael Clarke
|
||||
*/
|
||||
public class GHRef {
|
||||
/*package almost final*/ GitHub root;
|
||||
|
||||
private String ref, url;
|
||||
private GHObject object;
|
||||
@@ -33,6 +35,48 @@ public class GHRef {
|
||||
return object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this ref to the specified commit.
|
||||
*
|
||||
* @param sha
|
||||
* The SHA1 value to set this reference to
|
||||
*/
|
||||
public void updateTo(String sha) throws IOException {
|
||||
updateTo(sha, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this ref to the specified commit.
|
||||
*
|
||||
* @param sha
|
||||
* The SHA1 value to set this reference to
|
||||
* @param force
|
||||
* Whether or not to force this ref update.
|
||||
*/
|
||||
public void updateTo(String sha, Boolean force) throws IOException {
|
||||
new Requester(root)
|
||||
.with("sha", sha).with("force", force).method("PATCH").to(url, GHRef.class).wrap(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this ref from the repository using the GitHub API.
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to(url);
|
||||
}
|
||||
|
||||
/*package*/ GHRef wrap(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
|
||||
/*package*/ static GHRef[] wrap(GHRef[] in, GitHub root) {
|
||||
for (GHRef r : in) {
|
||||
r.wrap(root);
|
||||
}
|
||||
return in;
|
||||
}
|
||||
|
||||
|
||||
public static class GHObject {
|
||||
private String type, sha, url;
|
||||
|
||||
@@ -15,72 +15,39 @@ import static java.lang.String.format;
|
||||
* @see GHRepository#getReleases()
|
||||
* @see GHRepository#createRelease(String)
|
||||
*/
|
||||
public class GHRelease {
|
||||
public class GHRelease extends GHObject {
|
||||
GitHub root;
|
||||
GHRepository owner;
|
||||
|
||||
private String url;
|
||||
private String html_url;
|
||||
private String assets_url;
|
||||
private String upload_url;
|
||||
private long id;
|
||||
private String tag_name;
|
||||
private String target_commitish;
|
||||
private String name;
|
||||
private String body;
|
||||
private boolean draft;
|
||||
private boolean prerelease;
|
||||
private Date created_at;
|
||||
private Date published_at;
|
||||
private String tarball_url;
|
||||
private String zipball_url;
|
||||
|
||||
public String getAssetsUrl() {
|
||||
return assets_url;
|
||||
}
|
||||
|
||||
public void setAssetsUrl(String assets_url) {
|
||||
this.assets_url = assets_url;
|
||||
}
|
||||
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
public void setBody(String body) {
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return created_at;
|
||||
}
|
||||
|
||||
public void setCreatedAt(Date created_at) {
|
||||
this.created_at = created_at;
|
||||
}
|
||||
|
||||
public boolean isDraft() {
|
||||
return draft;
|
||||
}
|
||||
|
||||
public void setDraft(boolean draft) {
|
||||
this.draft = draft;
|
||||
}
|
||||
|
||||
public String getHtmlUrl() {
|
||||
return html_url;
|
||||
}
|
||||
|
||||
public void setHtmlUrl(String html_url) {
|
||||
this.html_url = html_url;
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
@@ -101,56 +68,32 @@ public class GHRelease {
|
||||
return prerelease;
|
||||
}
|
||||
|
||||
public void setPrerelease(boolean prerelease) {
|
||||
this.prerelease = prerelease;
|
||||
}
|
||||
|
||||
public Date getPublished_at() {
|
||||
return published_at;
|
||||
}
|
||||
|
||||
public void setPublished_at(Date published_at) {
|
||||
this.published_at = published_at;
|
||||
}
|
||||
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
public void setRoot(GitHub root) {
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
public String getTagName() {
|
||||
return tag_name;
|
||||
}
|
||||
|
||||
public void setTagName(String tag_name) {
|
||||
this.tag_name = tag_name;
|
||||
}
|
||||
|
||||
public String getTargetCommitish() {
|
||||
return target_commitish;
|
||||
}
|
||||
|
||||
public void setTargetCommitish(String target_commitish) {
|
||||
this.target_commitish = target_commitish;
|
||||
}
|
||||
|
||||
public String getUploadUrl() {
|
||||
return upload_url;
|
||||
}
|
||||
|
||||
public void setUploadUrl(String upload_url) {
|
||||
this.upload_url = upload_url;
|
||||
public String getZipballUrl() {
|
||||
return zipball_url;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
public String getTarballUrl() {
|
||||
return tarball_url;
|
||||
}
|
||||
|
||||
GHRelease wrap(GHRepository owner) {
|
||||
@@ -177,7 +120,7 @@ public class GHRelease {
|
||||
public GHAsset uploadAsset(File file, String contentType) throws IOException {
|
||||
Requester builder = new Requester(owner.root);
|
||||
|
||||
String url = format("https://uploads.github.com%sreleases/%d/assets?name=%s",
|
||||
String url = format("https://uploads.github.com%s/releases/%d/assets?name=%s",
|
||||
owner.getApiTailUrl(""), getId(), file.getName());
|
||||
return builder.contentType(contentType)
|
||||
.with(new FileInputStream(file))
|
||||
@@ -189,7 +132,18 @@ public class GHRelease {
|
||||
|
||||
GHAsset[] assets = builder
|
||||
.method("GET")
|
||||
.to(owner.getApiTailUrl(format("releases/%d/assets", id)), GHAsset[].class);
|
||||
.to(getApiTailUrl("assets"), GHAsset[].class);
|
||||
return Arrays.asList(GHAsset.wrap(assets, this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes this release.
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to(owner.getApiTailUrl("releases/"+id));
|
||||
}
|
||||
|
||||
private String getApiTailUrl(String end) {
|
||||
return owner.getApiTailUrl(format("releases/%s/%s",id,end));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,28 +23,18 @@
|
||||
*/
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.net.URL;
|
||||
import java.util.AbstractSet;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
import java.util.*;
|
||||
|
||||
import static java.util.Arrays.*;
|
||||
import static java.util.Arrays.asList;
|
||||
|
||||
/**
|
||||
* A repository on GitHub.
|
||||
@@ -52,23 +42,78 @@ import static java.util.Arrays.*;
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
public class GHRepository {
|
||||
public class GHRepository extends GHObject {
|
||||
/*package almost final*/ GitHub root;
|
||||
|
||||
private String description, homepage, name;
|
||||
private String url; // this is the API url
|
||||
private String description, homepage, name, full_name;
|
||||
private String html_url; // this is the UI
|
||||
private String git_url, ssh_url, clone_url, svn_url;
|
||||
private GHUser owner; // not fully populated. beware.
|
||||
private boolean has_issues, has_wiki, fork, _private, has_downloads;
|
||||
private int watchers,forks,open_issues,size;
|
||||
private String created_at, pushed_at;
|
||||
private boolean has_issues, has_wiki, fork, has_downloads;
|
||||
@JsonProperty("private")
|
||||
private boolean _private;
|
||||
private int watchers,forks,open_issues,size,network_count,subscribers_count;
|
||||
private String pushed_at;
|
||||
private Map<Integer,GHMilestone> milestones = new HashMap<Integer, GHMilestone>();
|
||||
|
||||
private String master_branch,language;
|
||||
private String default_branch,language;
|
||||
private Map<String,GHCommit> commits = new HashMap<String, GHCommit>();
|
||||
|
||||
private GHRepoPermission permissions;
|
||||
|
||||
public GHDeploymentBuilder createDeployment(String ref) {
|
||||
return new GHDeploymentBuilder(this,ref);
|
||||
}
|
||||
|
||||
public PagedIterable<GHDeploymentStatus> getDeploymentStatuses(final int id) {
|
||||
return new PagedIterable<GHDeploymentStatus>() {
|
||||
public PagedIterator<GHDeploymentStatus> iterator() {
|
||||
return new PagedIterator<GHDeploymentStatus>(root.retrieve().asIterator(getApiTailUrl("deployments")+"/"+id+"/statuses", GHDeploymentStatus[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHDeploymentStatus[] page) {
|
||||
for (GHDeploymentStatus c : page)
|
||||
c.wrap(GHRepository.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public PagedIterable<GHDeployment> listDeployments(String sha,String ref,String task,String environment){
|
||||
List<String> params = Arrays.asList(getParam("sha", sha), getParam("ref", ref), getParam("task", task), getParam("environment", environment));
|
||||
final String deploymentsUrl = getApiTailUrl("deployments") + "?"+ join(params,"&");
|
||||
return new PagedIterable<GHDeployment>() {
|
||||
public PagedIterator<GHDeployment> iterator() {
|
||||
return new PagedIterator<GHDeployment>(root.retrieve().asIterator(deploymentsUrl, GHDeployment[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHDeployment[] page) {
|
||||
for (GHDeployment c : page)
|
||||
c.wrap(GHRepository.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
private String join(List<String> params, String joinStr) {
|
||||
StringBuilder output = new StringBuilder();
|
||||
for(String param: params){
|
||||
if(param != null){
|
||||
output.append(param+joinStr);
|
||||
}
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
private String getParam(String name, String value) {
|
||||
return StringUtils.trimToNull(value)== null? null: name+"="+value;
|
||||
}
|
||||
|
||||
public GHDeploymentStatusBuilder createDeployStatus(int deploymentId, GHDeploymentState ghDeploymentState) {
|
||||
return new GHDeploymentStatusBuilder(this,deploymentId,ghDeploymentState);
|
||||
}
|
||||
|
||||
private static class GHRepoPermission {
|
||||
boolean pull,push,admin;
|
||||
}
|
||||
@@ -82,19 +127,12 @@ public class GHRepository {
|
||||
return homepage;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL of this repository, like 'http://github.com/kohsuke/jenkins'
|
||||
*/
|
||||
public String getUrl() {
|
||||
return html_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the git:// URL to this repository, such as "git://github.com/kohsuke/jenkins.git"
|
||||
* This URL is read-only.
|
||||
*/
|
||||
public String getGitTransportUrl() {
|
||||
return "git://github.com/"+getOwnerName()+"/"+name+".git";
|
||||
return git_url;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -102,7 +140,21 @@ public class GHRepository {
|
||||
* This URL is read-only.
|
||||
*/
|
||||
public String gitHttpTransportUrl() {
|
||||
return "https://github.com/"+getOwnerName()+"/"+name+".git";
|
||||
return clone_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Subversion URL to access this repository: https://github.com/rails/rails
|
||||
*/
|
||||
public String getSvnUrl() {
|
||||
return svn_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the SSH URL to access this repository, such as git@github.com:rails/rails.git
|
||||
*/
|
||||
public String getSshUrl() {
|
||||
return ssh_url;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -112,6 +164,13 @@ public class GHRepository {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Full repository name including the owner or organization. For example 'jenkinsci/jenkins' in case of http://github.com/jenkinsci/jenkins
|
||||
*/
|
||||
public String getFullName() {
|
||||
return full_name;
|
||||
}
|
||||
|
||||
public boolean hasPullAccess() {
|
||||
return permissions!=null && permissions.pull;
|
||||
}
|
||||
@@ -136,7 +195,7 @@ public class GHRepository {
|
||||
}
|
||||
|
||||
public GHIssue getIssue(int id) throws IOException {
|
||||
return root.retrieve().to("/repos/" + owner.login + "/" + name + "/issues/" + id, GHIssue.class).wrap(this);
|
||||
return root.retrieve().to(getApiTailUrl("issues/" + id), GHIssue.class).wrap(this);
|
||||
}
|
||||
|
||||
public GHIssueBuilder createIssue(String title) {
|
||||
@@ -147,6 +206,14 @@ public class GHRepository {
|
||||
return listIssues(state).asList();
|
||||
}
|
||||
|
||||
public List<GHIssue> getIssues(GHIssueState state, GHMilestone milestone) throws IOException {
|
||||
return Arrays.asList(GHIssue.wrap(root.retrieve()
|
||||
.to(getApiTailUrl(String.format("issues?state=%s&milestone=%s",
|
||||
state.toString().toLowerCase(), milestone == null ? "none" : "" + milestone.getNumber())),
|
||||
GHIssue[].class
|
||||
), this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the issues in this repository.
|
||||
*/
|
||||
@@ -168,12 +235,57 @@ public class GHRepository {
|
||||
return new GHReleaseBuilder(this,tag);
|
||||
}
|
||||
|
||||
public List<GHRelease> getReleases() throws IOException {
|
||||
return Arrays.asList(GHRelease.wrap(root.retrieve().to("/repos/" + owner.login + "/" + name + "/releases",
|
||||
GHRelease[].class), this));
|
||||
/**
|
||||
* Creates a named ref, such as tag, branch, etc.
|
||||
*
|
||||
* @param name
|
||||
* The name of the fully qualified reference (ie: refs/heads/master).
|
||||
* If it doesn't start with 'refs' and have at least two slashes, it will be rejected.
|
||||
* @param sha
|
||||
* The SHA1 value to set this reference to
|
||||
*/
|
||||
public GHRef createRef(String name, String sha) throws IOException {
|
||||
return new Requester(root)
|
||||
.with("ref", name).with("sha", sha).method("POST").to(getApiTailUrl("git/refs"), GHRef.class).wrap(root);
|
||||
}
|
||||
|
||||
protected String getOwnerName() {
|
||||
/**
|
||||
* @deprecated
|
||||
* use {@link #listReleases()}
|
||||
*/
|
||||
public List<GHRelease> getReleases() throws IOException {
|
||||
return listReleases().asList();
|
||||
}
|
||||
|
||||
public PagedIterable<GHRelease> listReleases() throws IOException {
|
||||
return new PagedIterable<GHRelease>() {
|
||||
public PagedIterator<GHRelease> iterator() {
|
||||
return new PagedIterator<GHRelease>(root.retrieve().asIterator(getApiTailUrl("releases"), GHRelease[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHRelease[] page) {
|
||||
for (GHRelease c : page)
|
||||
c.wrap(GHRepository.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public PagedIterable<GHTag> listTags() throws IOException {
|
||||
return new PagedIterable<GHTag>() {
|
||||
public PagedIterator<GHTag> iterator() {
|
||||
return new PagedIterator<GHTag>(root.retrieve().asIterator(getApiTailUrl("tags"), GHTag[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHTag[] page) {
|
||||
for (GHTag c : page)
|
||||
c.wrap(GHRepository.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public String getOwnerName() {
|
||||
return owner.login;
|
||||
}
|
||||
|
||||
@@ -209,6 +321,14 @@ public class GHRepository {
|
||||
return open_issues;
|
||||
}
|
||||
|
||||
public int getNetworkCount() {
|
||||
return network_count;
|
||||
}
|
||||
|
||||
public int getSubscribersCount() {
|
||||
return subscribers_count;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return
|
||||
@@ -218,10 +338,6 @@ public class GHRepository {
|
||||
return GitHub.parseDate(pushed_at);
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the primary branch you'll configure in the "Admin > Options" config page.
|
||||
*
|
||||
@@ -229,7 +345,7 @@ public class GHRepository {
|
||||
* This field is null until the user explicitly configures the master branch.
|
||||
*/
|
||||
public String getMasterBranch() {
|
||||
return master_branch;
|
||||
return default_branch;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
@@ -242,7 +358,32 @@ public class GHRepository {
|
||||
*/
|
||||
@WithBridgeMethods(Set.class)
|
||||
public GHPersonSet<GHUser> getCollaborators() throws IOException {
|
||||
return new GHPersonSet<GHUser>(GHUser.wrap(root.retrieve().to("/repos/" + owner.login + "/" + name + "/collaborators", GHUser[].class),root));
|
||||
return new GHPersonSet<GHUser>(listCollaborators().asList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up the collaborators on this repository.
|
||||
*
|
||||
* @return Users
|
||||
* @throws IOException
|
||||
*/
|
||||
public PagedIterable<GHUser> listCollaborators() throws IOException {
|
||||
return new PagedIterable<GHUser>() {
|
||||
public PagedIterator<GHUser> iterator() {
|
||||
|
||||
return new PagedIterator<GHUser>(root.retrieve().asIterator(getApiTailUrl("collaborators"), GHUser[].class)) {
|
||||
|
||||
@Override
|
||||
protected void wrapUp(GHUser[] users) {
|
||||
for (GHUser user : users) {
|
||||
user.wrapUp(root);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -251,7 +392,7 @@ public class GHRepository {
|
||||
*/
|
||||
public Set<String> getCollaboratorNames() throws IOException {
|
||||
Set<String> r = new HashSet<String>();
|
||||
for (GHUser u : GHUser.wrap(root.retrieve().to("/repos/" + owner.login + "/" + name + "/collaborators", GHUser[].class),root))
|
||||
for (GHUser u : GHUser.wrap(root.retrieve().to(getApiTailUrl("collaborators"), GHUser[].class),root))
|
||||
r.add(u.login);
|
||||
return r;
|
||||
}
|
||||
@@ -260,7 +401,7 @@ public class GHRepository {
|
||||
* If this repository belongs to an organization, return a set of teams.
|
||||
*/
|
||||
public Set<GHTeam> getTeams() throws IOException {
|
||||
return Collections.unmodifiableSet(new HashSet<GHTeam>(Arrays.asList(GHTeam.wrapUp(root.retrieve().to("/repos/" + owner.login + "/" + name + "/teams", GHTeam[].class), root.getOrganization(owner.login)))));
|
||||
return Collections.unmodifiableSet(new HashSet<GHTeam>(Arrays.asList(GHTeam.wrapUp(root.retrieve().to(getApiTailUrl("teams"), GHTeam[].class), root.getOrganization(owner.login)))));
|
||||
}
|
||||
|
||||
public void addCollaborators(GHUser... users) throws IOException {
|
||||
@@ -282,7 +423,7 @@ public class GHRepository {
|
||||
private void modifyCollaborators(Collection<GHUser> users, String method) throws IOException {
|
||||
verifyMine();
|
||||
for (GHUser user : users) {
|
||||
new Requester(root).method(method).to("/repos/" + owner.login + "/" + name + "/collaborators/" + user.getLogin());
|
||||
new Requester(root).method(method).to(getApiTailUrl("collaborators/" + user.getLogin()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,14 +431,14 @@ public class GHRepository {
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
config.put("address", address);
|
||||
new Requester(root).method("POST").with("name", "email").with("config", config).with("active", "true")
|
||||
.to(String.format("/repos/%s/%s/hooks", owner.login, name));
|
||||
.to(getApiTailUrl("hooks"));
|
||||
}
|
||||
|
||||
private void edit(String key, String value) throws IOException {
|
||||
Requester requester = new Requester(root);
|
||||
if (!key.equals("name"))
|
||||
requester.with("name", name); // even when we don't change the name, we need to send it in
|
||||
requester.with(key, value).method("PATCH").to("/repos/" + owner.login + "/" + name);
|
||||
requester.with(key, value).method("PATCH").to(getApiTailUrl(""));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -337,7 +478,11 @@ public class GHRepository {
|
||||
* Deletes this repository.
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to("/repos/" + owner.login + "/" + name);
|
||||
try {
|
||||
new Requester(root).method("DELETE").to(getApiTailUrl(""));
|
||||
} catch (FileNotFoundException x) {
|
||||
throw (FileNotFoundException) new FileNotFoundException("Failed to delete " + owner.login + "/" + name + "; might not exist, or you might need the delete_repo scope in your token: http://stackoverflow.com/a/19327004/12916").initCause(x);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -347,7 +492,7 @@ public class GHRepository {
|
||||
* Newly forked repository that belong to you.
|
||||
*/
|
||||
public GHRepository fork() throws IOException {
|
||||
return new Requester(root).method("POST").to("/repos/" + owner.login + "/" + name + "/forks", GHRepository.class).wrap(root);
|
||||
return new Requester(root).method("POST").to(getApiTailUrl("forks"), GHRepository.class).wrap(root);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -357,7 +502,7 @@ public class GHRepository {
|
||||
* Newly forked repository that belong to you.
|
||||
*/
|
||||
public GHRepository forkTo(GHOrganization org) throws IOException {
|
||||
new Requester(root).to(String.format("/repos/%s/%s/forks?org=%s", owner.login, name, org.getLogin()));
|
||||
new Requester(root).to(getApiTailUrl("forks?org="+org.getLogin()));
|
||||
|
||||
// this API is asynchronous. we need to wait for a bit
|
||||
for (int i=0; i<10; i++) {
|
||||
@@ -376,7 +521,7 @@ public class GHRepository {
|
||||
* Retrieves a specified pull request.
|
||||
*/
|
||||
public GHPullRequest getPullRequest(int i) throws IOException {
|
||||
return root.retrieve().to("/repos/" + owner.login + '/' + name + "/pulls/" + i, GHPullRequest.class).wrapUp(this);
|
||||
return root.retrieve().to(getApiTailUrl("pulls/" + i), GHPullRequest.class).wrapUp(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -394,30 +539,53 @@ public class GHRepository {
|
||||
public PagedIterable<GHPullRequest> listPullRequests(final GHIssueState state) {
|
||||
return new PagedIterable<GHPullRequest>() {
|
||||
public PagedIterator<GHPullRequest> iterator() {
|
||||
return new PagedIterator<GHPullRequest>(root.retrieve().asIterator(String.format("/repos/%s/%s/pulls?state=%s", owner.login, name, state.name().toLowerCase(Locale.ENGLISH)), GHPullRequest[].class)) {
|
||||
return new PagedIterator<GHPullRequest>(root.retrieve().asIterator(getApiTailUrl("pulls?state="+state.name().toLowerCase(Locale.ENGLISH)), GHPullRequest[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHPullRequest[] page) {
|
||||
for (GHPullRequest pr : page)
|
||||
pr.wrap(GHRepository.this);
|
||||
pr.wrapUp(GHRepository.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new pull request.
|
||||
*
|
||||
* @param title
|
||||
* Required. The title of the pull request.
|
||||
* @param head
|
||||
* Required. The name of the branch where your changes are implemented.
|
||||
* For cross-repository pull requests in the same network,
|
||||
* namespace head with a user like this: username:branch.
|
||||
* @param base
|
||||
* Required. The name of the branch you want your changes pulled into.
|
||||
* This should be an existing branch on the current repository.
|
||||
* @param body
|
||||
* The contents of the pull request. This is the markdown description
|
||||
* of a pull request.
|
||||
*/
|
||||
public GHPullRequest createPullRequest(String title, String head, String base, String body) throws IOException {
|
||||
return new Requester(root).with("title",title)
|
||||
.with("head",head)
|
||||
.with("base",base)
|
||||
.with("body",body).to(getApiTailUrl("pulls"),GHPullRequest.class).wrapUp(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the currently configured hooks.
|
||||
*/
|
||||
public List<GHHook> getHooks() throws IOException {
|
||||
List<GHHook> list = new ArrayList<GHHook>(Arrays.asList(
|
||||
root.retrieve().to(String.format("/repos/%s/%s/hooks", owner.login, name), GHHook[].class)));
|
||||
root.retrieve().to(getApiTailUrl("hooks"), GHHook[].class)));
|
||||
for (GHHook h : list)
|
||||
h.wrap(this);
|
||||
return list;
|
||||
}
|
||||
|
||||
public GHHook getHook(int id) throws IOException {
|
||||
return root.retrieve().to(String.format("/repos/%s/%s/hooks/%d", owner.login, name, id), GHHook.class).wrap(this);
|
||||
return root.retrieve().to(getApiTailUrl("hooks/" + id), GHHook.class).wrap(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -429,12 +597,12 @@ public class GHRepository {
|
||||
* @throws IOException on failure communicating with GitHub
|
||||
*/
|
||||
public GHCompare getCompare(String id1, String id2) throws IOException {
|
||||
GHCompare compare = root.retrieve().to(String.format("/repos/%s/%s/compare/%s...%s", owner.login, name, id1, id2), GHCompare.class);
|
||||
GHCompare compare = root.retrieve().to(getApiTailUrl(String.format("compare/%s...%s", id1, id2)), GHCompare.class);
|
||||
return compare.wrap(this);
|
||||
}
|
||||
|
||||
public GHCompare getCompare(GHCommit id1, GHCommit id2) throws IOException {
|
||||
return getCompare(id1.getSHA1(),id2.getSHA1());
|
||||
return getCompare(id1.getSHA1(), id2.getSHA1());
|
||||
}
|
||||
|
||||
public GHCompare getCompare(GHBranch id1, GHBranch id2) throws IOException {
|
||||
@@ -447,19 +615,31 @@ public class GHRepository {
|
||||
* @throws IOException on failure communicating with GitHub
|
||||
*/
|
||||
public GHRef[] getRefs() throws IOException {
|
||||
return root.retrieve().to(String.format("/repos/%s/%s/git/refs", owner.login, name), GHRef[].class);
|
||||
return GHRef.wrap(root.retrieve().to(String.format("/repos/%s/%s/git/refs", owner.login, name), GHRef[].class),root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrienved all refs of the given type for the current GitHub repository.
|
||||
* Retrieves all refs of the given type for the current GitHub repository.
|
||||
* @param refType the type of reg to search for e.g. <tt>tags</tt> or <tt>commits</tt>
|
||||
* @return an array of all refs matching the request type
|
||||
* @throws IOException on failure communicating with GitHub, potentially due to an invalid ref type being requested
|
||||
*/
|
||||
public GHRef[] getRefs(String refType) throws IOException {
|
||||
return root.retrieve().to(String.format("/repos/%s/%s/git/refs/%s", owner.login, name, refType), GHRef[].class);
|
||||
return GHRef.wrap(root.retrieve().to(String.format("/repos/%s/%s/git/refs/%s", owner.login, name, refType), GHRef[].class),root);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrive a ref of the given type for the current GitHub repository.
|
||||
*
|
||||
* @param refName
|
||||
* eg: heads/branch
|
||||
* @return refs matching the request type
|
||||
* @throws IOException
|
||||
* on failure communicating with GitHub, potentially due to an
|
||||
* invalid ref type being requested
|
||||
*/
|
||||
public GHRef getRef(String refName) throws IOException {
|
||||
return root.retrieve().to(String.format("/repos/%s/%s/git/refs/%s", owner.login, name, refName), GHRef.class).wrap(root);
|
||||
}
|
||||
/**
|
||||
* Gets a commit object in this repository.
|
||||
*/
|
||||
@@ -488,6 +668,13 @@ public class GHRepository {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Search commits by specifying filters through a builder pattern.
|
||||
*/
|
||||
public GHCommitQueryBuilder queryCommits() {
|
||||
return new GHCommitQueryBuilder(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists up all the commit comments in this repository.
|
||||
*/
|
||||
@@ -537,14 +724,24 @@ public class GHRepository {
|
||||
* Optional parameter that points to the URL that has more details.
|
||||
* @param description
|
||||
* Optional short description.
|
||||
* @param context
|
||||
* Optinal commit status context.
|
||||
*/
|
||||
public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description) throws IOException {
|
||||
public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description, String context) throws IOException {
|
||||
return new Requester(root)
|
||||
.with("state", state.name().toLowerCase(Locale.ENGLISH))
|
||||
.with("target_url", targetUrl)
|
||||
.with("description", description)
|
||||
.with("context", context)
|
||||
.to(String.format("/repos/%s/%s/statuses/%s",owner.login,this.name,sha1),GHCommitStatus.class).wrapUp(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see {@link #createCommitStatus(String, GHCommitState,String,String,String) createCommitStatus}
|
||||
*/
|
||||
public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description) throws IOException {
|
||||
return createCommitStatus(sha1, state, targetUrl, description,null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists repository events.
|
||||
@@ -563,6 +760,54 @@ public class GHRepository {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists labels in this repository.
|
||||
*
|
||||
* https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository
|
||||
*/
|
||||
public PagedIterable<GHLabel> listLabels() throws IOException {
|
||||
return new PagedIterable<GHLabel>() {
|
||||
public PagedIterator<GHLabel> iterator() {
|
||||
return new PagedIterator<GHLabel>(root.retrieve().asIterator(getApiTailUrl("labels"), GHLabel[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHLabel[] page) {
|
||||
for (GHLabel c : page)
|
||||
c.wrapUp(GHRepository.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public GHLabel getLabel(String name) throws IOException {
|
||||
return root.retrieve().to(getApiTailUrl("labels/"+name), GHLabel.class).wrapUp(this);
|
||||
}
|
||||
|
||||
public GHLabel createLabel(String name, String color) throws IOException {
|
||||
return root.retrieve().method("POST")
|
||||
.with("name",name)
|
||||
.with("color",color)
|
||||
.to(getApiTailUrl("labels"), GHLabel.class).wrapUp(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all the subscribers (aka watchers.)
|
||||
*
|
||||
* https://developer.github.com/v3/activity/watching/
|
||||
*/
|
||||
public PagedIterable<GHUser> listSubscribers() {
|
||||
return new PagedIterable<GHUser>() {
|
||||
public PagedIterator<GHUser> iterator() {
|
||||
return new PagedIterator<GHUser>(root.retrieve().asIterator(getApiTailUrl("subscribers"), GHUser[].class)) {
|
||||
protected void wrapUp(GHUser[] page) {
|
||||
for (GHUser c : page)
|
||||
c.wrapUp(root);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* See https://api.github.com/hooks for possible names and their configuration scheme.
|
||||
@@ -741,7 +986,7 @@ public class GHRepository {
|
||||
|
||||
public GHContent getFileContent(String path, String ref) throws IOException {
|
||||
Requester requester = root.retrieve();
|
||||
String target = String.format("/repos/%s/%s/contents/%s", owner.login, name, path);
|
||||
String target = getApiTailUrl("contents/" + path);
|
||||
|
||||
if (ref != null)
|
||||
target = target + "?ref=" + ref;
|
||||
@@ -755,7 +1000,7 @@ public class GHRepository {
|
||||
|
||||
public List<GHContent> getDirectoryContent(String path, String ref) throws IOException {
|
||||
Requester requester = root.retrieve();
|
||||
String target = String.format("/repos/%s/%s/contents/%s", owner.login, name, path);
|
||||
String target = getApiTailUrl("contents/" + path);
|
||||
|
||||
if (ref != null)
|
||||
target = target + "?ref=" + ref;
|
||||
@@ -767,19 +1012,31 @@ public class GHRepository {
|
||||
return Arrays.asList(files);
|
||||
}
|
||||
|
||||
public GHContent getReadme() throws Exception {
|
||||
return getFileContent("readme");
|
||||
/**
|
||||
* https://developer.github.com/v3/repos/contents/#get-the-readme
|
||||
*/
|
||||
public GHContent getReadme() throws IOException {
|
||||
Requester requester = root.retrieve();
|
||||
return requester.to(getApiTailUrl("readme"), GHContent.class).wrap(this);
|
||||
}
|
||||
|
||||
public GHContentUpdateResponse createContent(String content, String commitMessage, String path) throws IOException {
|
||||
return createContent(content, commitMessage, path, null);
|
||||
return createContent(content.getBytes(), commitMessage, path, null);
|
||||
}
|
||||
|
||||
public GHContentUpdateResponse createContent(String content, String commitMessage, String path, String branch) throws IOException {
|
||||
return createContent(content.getBytes(), commitMessage, path, branch);
|
||||
}
|
||||
|
||||
public GHContentUpdateResponse createContent(byte[] contentBytes, String commitMessage, String path) throws IOException {
|
||||
return createContent(contentBytes, commitMessage, path, null);
|
||||
}
|
||||
|
||||
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", DatatypeConverter.printBase64Binary(content.getBytes()))
|
||||
.with("content", DatatypeConverter.printBase64Binary(contentBytes))
|
||||
.method("PUT");
|
||||
|
||||
if (branch != null) {
|
||||
@@ -798,6 +1055,67 @@ public class GHRepository {
|
||||
return new Requester(root)
|
||||
.with("title", title).with("description", description).method("POST").to(getApiTailUrl("milestones"), GHMilestone.class).wrap(this);
|
||||
}
|
||||
|
||||
public GHDeployKey addDeployKey(String title,String key) throws IOException {
|
||||
return new Requester(root)
|
||||
.with("title", title).with("key", key).method("POST").to(getApiTailUrl("keys"), GHDeployKey.class).wrap(this);
|
||||
|
||||
}
|
||||
|
||||
public List<GHDeployKey> getDeployKeys() throws IOException{
|
||||
List<GHDeployKey> list = new ArrayList<GHDeployKey>(Arrays.asList(
|
||||
root.retrieve().to(getApiTailUrl("keys"), GHDeployKey[].class)));
|
||||
for (GHDeployKey h : list)
|
||||
h.wrap(this);
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribes to this repository to get notifications.
|
||||
*/
|
||||
public GHSubscription subscribe(boolean subscribed, boolean ignored) throws IOException {
|
||||
return new Requester(root)
|
||||
.with("subscribed", subscribed)
|
||||
.with("ignored", ignored)
|
||||
.method("PUT").to(getApiTailUrl("subscription"), GHSubscription.class).wrapUp(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current subscription.
|
||||
*
|
||||
* @return null if no subscription exists.
|
||||
*/
|
||||
public GHSubscription getSubscription() throws IOException {
|
||||
try {
|
||||
return new Requester(root).to(getApiTailUrl("subscription"), GHSubscription.class).wrapUp(this);
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public PagedIterable<Contributor> listContributors() throws IOException {
|
||||
return new PagedIterable<Contributor>() {
|
||||
public PagedIterator<Contributor> iterator() {
|
||||
return new PagedIterator<Contributor>(root.retrieve().asIterator(getApiTailUrl("contributors"), Contributor[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(Contributor[] page) {
|
||||
for (Contributor c : page)
|
||||
c.wrapUp(root);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static class Contributor extends GHUser {
|
||||
private int contributions;
|
||||
|
||||
public int getContributions() {
|
||||
return contributions;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
@@ -820,6 +1138,7 @@ public class GHRepository {
|
||||
}
|
||||
|
||||
String getApiTailUrl(String tail) {
|
||||
return "/repos/" + owner.login + "/" + name +'/'+tail;
|
||||
if (tail.length()>0 && !tail.startsWith("/")) tail='/'+tail;
|
||||
return "/repos/" + owner.login + "/" + name +tail;
|
||||
}
|
||||
}
|
||||
|
||||
62
src/main/java/org/kohsuke/github/GHSubscription.java
Normal file
62
src/main/java/org/kohsuke/github/GHSubscription.java
Normal file
@@ -0,0 +1,62 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Represents your subscribing to a repository.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GHSubscription {
|
||||
private String created_at, url, repository_url, reason;
|
||||
private boolean subscribed, ignored;
|
||||
|
||||
private GitHub root;
|
||||
private GHRepository repo;
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return GitHub.parseDate(created_at);
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public String getRepositoryUrl() {
|
||||
return repository_url;
|
||||
}
|
||||
|
||||
public String getReason() {
|
||||
return reason;
|
||||
}
|
||||
|
||||
public boolean isSubscribed() {
|
||||
return subscribed;
|
||||
}
|
||||
|
||||
public boolean isIgnored() {
|
||||
return ignored;
|
||||
}
|
||||
|
||||
public GHRepository getRepository() {
|
||||
return repo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes this subscription.
|
||||
*/
|
||||
public void delete() throws IOException {
|
||||
new Requester(root).method("DELETE").to(url);
|
||||
}
|
||||
|
||||
GHSubscription wrapUp(GHRepository repo) {
|
||||
this.repo = repo;
|
||||
return wrapUp(repo.root);
|
||||
}
|
||||
|
||||
GHSubscription wrapUp(GitHub root) {
|
||||
this.root = root;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
38
src/main/java/org/kohsuke/github/GHTag.java
Normal file
38
src/main/java/org/kohsuke/github/GHTag.java
Normal file
@@ -0,0 +1,38 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* Represents a tag in {@link GHRepository}
|
||||
*
|
||||
* @see GHRepository#listTags()
|
||||
*/
|
||||
public class GHTag {
|
||||
private GHRepository owner;
|
||||
private GitHub root;
|
||||
|
||||
private String name;
|
||||
private GHCommit commit;
|
||||
|
||||
/*package*/ GHTag wrap(GHRepository owner) {
|
||||
this.owner = owner;
|
||||
this.root = owner.root;
|
||||
if (commit!=null)
|
||||
commit.wrapUp(owner);
|
||||
return this;
|
||||
}
|
||||
|
||||
public GHRepository getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public GitHub getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public GHCommit getCommit() {
|
||||
return commit;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,7 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
@@ -15,6 +14,7 @@ import java.util.TreeMap;
|
||||
public class GHTeam {
|
||||
private String name,permission;
|
||||
private int id;
|
||||
private GHOrganization organization; // populated by GET /user/teams where Teams+Orgs are returned together
|
||||
|
||||
protected /*final*/ GHOrganization org;
|
||||
|
||||
@@ -23,6 +23,11 @@ public class GHTeam {
|
||||
return this;
|
||||
}
|
||||
|
||||
/*package*/ GHTeam wrapUp(GitHub root) { // auto-wrapUp when organization is known from GET /user/teams
|
||||
this.organization.wrapUp(root);
|
||||
return wrapUp(organization);
|
||||
}
|
||||
|
||||
/*package*/ static GHTeam[] wrapUp(GHTeam[] teams, GHOrganization owner) {
|
||||
for (GHTeam t : teams) {
|
||||
t.wrapUp(owner);
|
||||
@@ -42,27 +47,69 @@ public class GHTeam {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the current members.
|
||||
*/
|
||||
/**
|
||||
* Retrieves the current members.
|
||||
*/
|
||||
public PagedIterable<GHUser> listMembers() throws IOException {
|
||||
return new PagedIterable<GHUser>() {
|
||||
public PagedIterator<GHUser> iterator() {
|
||||
return new PagedIterator<GHUser>(org.root.retrieve().asIterator(api("/members"), GHUser[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHUser[] page) {
|
||||
GHUser.wrap(page, org.root);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public Set<GHUser> getMembers() throws IOException {
|
||||
return new HashSet<GHUser>(Arrays.asList(GHUser.wrap(org.root.retrieve().to(api("/members"), GHUser[].class), org.root)));
|
||||
return Collections.unmodifiableSet(listMembers().asSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this team has the specified user as a member.
|
||||
*/
|
||||
public boolean hasMember(GHUser user) {
|
||||
try {
|
||||
org.root.retrieve().to("/teams/" + id + "/members/" + user.getLogin());
|
||||
return true;
|
||||
} catch (IOException ignore) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String,GHRepository> getRepositories() throws IOException {
|
||||
GHRepository[] repos = org.root.retrieve().to(api("/repos"), GHRepository[].class);
|
||||
Map<String,GHRepository> m = new TreeMap<String, GHRepository>();
|
||||
for (GHRepository r : repos) {
|
||||
m.put(r.getName(),r.wrap(org.root));
|
||||
for (GHRepository r : listRepositories()) {
|
||||
m.put(r.getName(), r);
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
public PagedIterable<GHRepository> listRepositories() {
|
||||
return new PagedIterable<GHRepository>() {
|
||||
public PagedIterator<GHRepository> iterator() {
|
||||
return new PagedIterator<GHRepository>(org.root.retrieve().asIterator(api("/repos"), GHRepository[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHRepository[] page) {
|
||||
for (GHRepository r : page)
|
||||
r.wrap(org.root);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a member to the team.
|
||||
*
|
||||
* The user will be invited to the organization if required.
|
||||
*
|
||||
* @since 1.59
|
||||
*/
|
||||
public void add(GHUser u) throws IOException {
|
||||
org.root.retrieve().method("PUT").to(api("/members/" + u.getLogin()), null);
|
||||
org.root.retrieve().method("PUT").to(api("/memberships/" + u.getLogin()), null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -83,4 +130,8 @@ public class GHTeam {
|
||||
private String api(String tail) {
|
||||
return "/teams/"+id+tail;
|
||||
}
|
||||
|
||||
public GHOrganization getOrganization() {
|
||||
return org;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,6 +69,24 @@ public class GHUser extends GHPerson {
|
||||
return new GHPersonSet<GHUser>(Arrays.asList(wrap(followers,root)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all the subscribed (aka watched) repositories.
|
||||
*
|
||||
* https://developer.github.com/v3/activity/watching/
|
||||
*/
|
||||
public PagedIterable<GHRepository> listSubscriptions() {
|
||||
return new PagedIterable<GHRepository>() {
|
||||
public PagedIterator<GHRepository> iterator() {
|
||||
return new PagedIterator<GHRepository>(root.retrieve().asIterator(getApiTailUrl("subscriptions"), GHRepository[].class)) {
|
||||
protected void wrapUp(GHRepository[] page) {
|
||||
for (GHRepository c : page)
|
||||
c.wrap(root);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this user belongs to the specified organization.
|
||||
*/
|
||||
@@ -76,6 +94,13 @@ public class GHUser extends GHPerson {
|
||||
return org.hasMember(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this user belongs to the specified team.
|
||||
*/
|
||||
public boolean isMemberOf(GHTeam team) {
|
||||
return team.hasMember(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this user belongs to the specified organization as a public member.
|
||||
*/
|
||||
@@ -120,6 +145,23 @@ public class GHUser extends GHPerson {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists Gists created by this user.
|
||||
*/
|
||||
public PagedIterable<GHGist> listGists() throws IOException {
|
||||
return new PagedIterable<GHGist>() {
|
||||
public PagedIterator<GHGist> iterator() {
|
||||
return new PagedIterator<GHGist>(root.retrieve().asIterator(String.format("/users/%s/gists", login), GHGist[].class)) {
|
||||
@Override
|
||||
protected void wrapUp(GHGist[] page) {
|
||||
for (GHGist c : page)
|
||||
c.wrapUp(GHUser.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "User:"+login;
|
||||
@@ -138,4 +180,9 @@ public class GHUser extends GHPerson {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
String getApiTailUrl(String tail) {
|
||||
if (tail.length()>0 && !tail.startsWith("/")) tail='/'+tail;
|
||||
return "/users/" + login + tail;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
*/
|
||||
package org.kohsuke.github;
|
||||
|
||||
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.*;
|
||||
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY;
|
||||
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.net.MalformedURLException;
|
||||
@@ -37,13 +37,14 @@ import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Hashtable;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
@@ -53,6 +54,12 @@ import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
|
||||
/**
|
||||
* Root of the GitHub API.
|
||||
*
|
||||
* <h2>Thread safety</h2>
|
||||
* <p>
|
||||
* This library aims to be safe for use by multiple threads concurrently, although
|
||||
* the library itself makes no attempt to control/serialize potentially conflicting
|
||||
* operations to GitHub, such as updating & deleting a repository at the same time.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GitHub {
|
||||
@@ -63,17 +70,12 @@ public class GitHub {
|
||||
*/
|
||||
/*package*/ final String encodedAuthorization;
|
||||
|
||||
private final Map<String,GHUser> users = new HashMap<String, GHUser>();
|
||||
private final Map<String,GHOrganization> orgs = new HashMap<String, GHOrganization>();
|
||||
private final Map<String,GHUser> users = new Hashtable<String, GHUser>();
|
||||
private final Map<String,GHOrganization> orgs = new Hashtable<String, GHOrganization>();
|
||||
|
||||
private final String apiUrl;
|
||||
|
||||
/**
|
||||
* Connects to GitHub.com
|
||||
*/
|
||||
private GitHub(String login, String oauthAccessToken, String password) throws IOException {
|
||||
this (GITHUB_URL, login, oauthAccessToken, password);
|
||||
}
|
||||
private HttpConnector connector = HttpConnector.DEFAULT;
|
||||
|
||||
/**
|
||||
* Creates a client API root object.
|
||||
@@ -108,10 +110,13 @@ public class GitHub {
|
||||
* Secret OAuth token.
|
||||
* @param password
|
||||
* User's password. Always used in conjunction with the {@code login} parameter
|
||||
* @param connector
|
||||
* HttpConnector to use. Pass null to use default connector.
|
||||
*/
|
||||
private GitHub(String apiUrl, String login, String oauthAccessToken, String password) throws IOException {
|
||||
/* package */ GitHub(String apiUrl, String login, String oauthAccessToken, String password, HttpConnector connector) throws IOException {
|
||||
if (apiUrl.endsWith("/")) apiUrl = apiUrl.substring(0, apiUrl.length()-1); // normalize
|
||||
this.apiUrl = apiUrl;
|
||||
if (null != connector) this.connector = connector;
|
||||
|
||||
if (oauthAccessToken!=null) {
|
||||
encodedAuthorization = "token "+oauthAccessToken;
|
||||
@@ -130,18 +135,10 @@ public class GitHub {
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtains the credential from "~/.github"
|
||||
* Obtains the credential from "~/.github" or from the System Environment Properties.
|
||||
*/
|
||||
public static GitHub connect() throws IOException {
|
||||
Properties props = new Properties();
|
||||
File homeDir = new File(System.getProperty("user.home"));
|
||||
FileInputStream in = new FileInputStream(new File(homeDir, ".github"));
|
||||
try {
|
||||
props.load(in);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(in);
|
||||
}
|
||||
return new GitHub(GITHUB_URL,props.getProperty("login"), props.getProperty("oauth"),props.getProperty("password"));
|
||||
return GitHubBuilder.fromCredentials().build();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -153,15 +150,15 @@ public class GitHub {
|
||||
* For historical reasons, this parameter still accepts the bare domain name, but that's considered deprecated.
|
||||
*/
|
||||
public static GitHub connectToEnterprise(String apiUrl, String oauthAccessToken) throws IOException {
|
||||
return connectUsingOAuth(apiUrl, oauthAccessToken);
|
||||
return new GitHubBuilder().withEndpoint(apiUrl).withOAuthToken(oauthAccessToken).build();
|
||||
}
|
||||
|
||||
public static GitHub connectToEnterprise(String apiUrl, String login, String password) throws IOException {
|
||||
return new GitHub(apiUrl, login, null, password);
|
||||
return new GitHubBuilder().withEndpoint(apiUrl).withPassword(login, password).build();
|
||||
}
|
||||
|
||||
public static GitHub connect(String login, String oauthAccessToken) throws IOException {
|
||||
return new GitHub(login,oauthAccessToken,null);
|
||||
return new GitHubBuilder().withOAuthToken(oauthAccessToken, login).build();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -170,19 +167,19 @@ public class GitHub {
|
||||
* Use {@link #connectUsingPassword(String, String)} or {@link #connectUsingOAuth(String)}.
|
||||
*/
|
||||
public static GitHub connect(String login, String oauthAccessToken, String password) throws IOException {
|
||||
return new GitHub(login,oauthAccessToken,password);
|
||||
return new GitHubBuilder().withOAuthToken(oauthAccessToken, login).withPassword(login, password).build();
|
||||
}
|
||||
|
||||
public static GitHub connectUsingPassword(String login, String password) throws IOException {
|
||||
return new GitHub(login,null,password);
|
||||
return new GitHubBuilder().withPassword(login, password).build();
|
||||
}
|
||||
|
||||
public static GitHub connectUsingOAuth(String oauthAccessToken) throws IOException {
|
||||
return new GitHub(null, oauthAccessToken, null);
|
||||
return new GitHubBuilder().withOAuthToken(oauthAccessToken).build();
|
||||
}
|
||||
|
||||
public static GitHub connectUsingOAuth(String githubServer, String oauthAccessToken) throws IOException {
|
||||
return new GitHub(githubServer,null, oauthAccessToken,null);
|
||||
return new GitHubBuilder().withEndpoint(githubServer).withOAuthToken(oauthAccessToken).build();
|
||||
}
|
||||
/**
|
||||
* Connects to GitHub anonymously.
|
||||
@@ -190,7 +187,7 @@ public class GitHub {
|
||||
* All operations that requires authentication will fail.
|
||||
*/
|
||||
public static GitHub connectAnonymously() throws IOException {
|
||||
return new GitHub(null,null,null);
|
||||
return new GitHubBuilder().build();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -201,6 +198,17 @@ public class GitHub {
|
||||
return login==null && encodedAuthorization==null;
|
||||
}
|
||||
|
||||
public HttpConnector getConnector() {
|
||||
return connector;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the custom connector used to make requests to GitHub.
|
||||
*/
|
||||
public void setConnector(HttpConnector connector) {
|
||||
this.connector = connector;
|
||||
}
|
||||
|
||||
/*package*/ void requireCredential() {
|
||||
if (isAnonymous())
|
||||
throw new IllegalStateException("This operation requires a credential but none is given to the GitHub constructor");
|
||||
@@ -226,7 +234,16 @@ public class GitHub {
|
||||
* Gets the current rate limit.
|
||||
*/
|
||||
public GHRateLimit getRateLimit() throws IOException {
|
||||
return retrieve().to("/rate_limit", JsonRateLimit.class).rate;
|
||||
try {
|
||||
return retrieve().to("/rate_limit", JsonRateLimit.class).rate;
|
||||
} catch (FileNotFoundException e) {
|
||||
// GitHub Enterprise doesn't have the rate limit, so in that case
|
||||
// return some big number that's not too big.
|
||||
// see issue #78
|
||||
GHRateLimit r = new GHRateLimit();
|
||||
r.limit = r.remaining = 1000000;
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -257,6 +274,15 @@ public class GitHub {
|
||||
return u;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* clears all cached data in order for external changes (modifications and del
|
||||
*/
|
||||
public void refreshCache() {
|
||||
users.clear();
|
||||
orgs.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Interns the given {@link GHUser}.
|
||||
*/
|
||||
@@ -305,17 +331,49 @@ public class GitHub {
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets complete map of organizations/teams that current user belongs to.
|
||||
*
|
||||
* Leverages the new GitHub API /user/teams made available recently to
|
||||
* get in a single call the complete set of organizations, teams and permissions
|
||||
* in a single call.
|
||||
*/
|
||||
public Map<String, Set<GHTeam>> getMyTeams() throws IOException {
|
||||
Map<String, Set<GHTeam>> allMyTeams = new HashMap<String, Set<GHTeam>>();
|
||||
for (GHTeam team : retrieve().to("/user/teams", GHTeam[].class)) {
|
||||
team.wrapUp(this);
|
||||
String orgLogin = team.getOrganization().getLogin();
|
||||
Set<GHTeam> teamsPerOrg = allMyTeams.get(orgLogin);
|
||||
if (teamsPerOrg == null) {
|
||||
teamsPerOrg = new HashSet<GHTeam>();
|
||||
}
|
||||
teamsPerOrg.add(team);
|
||||
allMyTeams.put(orgLogin, teamsPerOrg);
|
||||
}
|
||||
return allMyTeams;
|
||||
}
|
||||
|
||||
/**
|
||||
* Public events visible to you. Equivalent of what's displayed on https://github.com/
|
||||
*/
|
||||
public List<GHEventInfo> getEvents() throws IOException {
|
||||
// TODO: pagination
|
||||
GHEventInfo[] events = retrieve().to("/events", GHEventInfo[].class);
|
||||
for (GHEventInfo e : events)
|
||||
e.wrapUp(this);
|
||||
return Arrays.asList(events);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a sigle gist by ID.
|
||||
*/
|
||||
public GHGist getGist(String id) throws IOException {
|
||||
return retrieve().to("/gists/"+id,GHGist.class).wrapUp(this);
|
||||
}
|
||||
|
||||
public GHGistBuilder createGist() {
|
||||
return new GHGistBuilder(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the GitHub event object.
|
||||
*
|
||||
@@ -332,6 +390,9 @@ public class GitHub {
|
||||
/**
|
||||
* Creates a new repository.
|
||||
*
|
||||
* To create a repository in an organization, see
|
||||
* {@link GHOrganization#createRepository(String, String, String, GHTeam, boolean)}
|
||||
*
|
||||
* @return
|
||||
* Newly created repository.
|
||||
*/
|
||||
@@ -370,6 +431,14 @@ public class GitHub {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Search issues.
|
||||
*/
|
||||
public GHIssueSearchBuilder searchIssues() {
|
||||
return new GHIssueSearchBuilder(this);
|
||||
}
|
||||
|
||||
|
||||
/*package*/ static URL parseURL(String s) {
|
||||
try {
|
||||
return s==null ? null : new URL(s);
|
||||
@@ -392,6 +461,10 @@ public class GitHub {
|
||||
throw new IllegalStateException("Unable to parse the timestamp: "+timestamp);
|
||||
}
|
||||
|
||||
/*package*/ static String printDate(Date dt) {
|
||||
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(dt);
|
||||
}
|
||||
|
||||
/*package*/ static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
|
||||
private static final String[] TIME_FORMATS = {"yyyy/MM/dd HH:mm:ss ZZZZ","yyyy-MM-dd'T'HH:mm:ss'Z'"};
|
||||
@@ -401,5 +474,5 @@ public class GitHub {
|
||||
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
}
|
||||
|
||||
private static final String GITHUB_URL = "https://api.github.com";
|
||||
/* package */ static final String GITHUB_URL = "https://api.github.com";
|
||||
}
|
||||
|
||||
175
src/main/java/org/kohsuke/github/GitHubBuilder.java
Normal file
175
src/main/java/org/kohsuke/github/GitHubBuilder.java
Normal file
@@ -0,0 +1,175 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.Proxy;
|
||||
import java.net.URL;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* @since 1.59
|
||||
*/
|
||||
public class GitHubBuilder {
|
||||
private String endpoint = GitHub.GITHUB_URL;
|
||||
|
||||
// default scoped so unit tests can read them.
|
||||
/* private */ String user;
|
||||
/* private */ String password;
|
||||
/* private */ String oauthToken;
|
||||
|
||||
private HttpConnector connector;
|
||||
|
||||
public GitHubBuilder() {
|
||||
}
|
||||
|
||||
/**
|
||||
* First check if the credentials are configured using the ~/.github properties file.
|
||||
*
|
||||
* If no user is specified it means there is no configuration present so check the environment instead.
|
||||
*
|
||||
* If there is still no user it means there are no credentials defined and throw an IOException.
|
||||
*
|
||||
* @return the configured Builder from credentials defined on the system or in the environment.
|
||||
*
|
||||
* @throws IOException If there are no credentials defined in the ~/.github properties file or the process environment.
|
||||
*/
|
||||
public static GitHubBuilder fromCredentials() throws IOException {
|
||||
|
||||
GitHubBuilder builder;
|
||||
try {
|
||||
builder = fromPropertyFile();
|
||||
|
||||
if (builder.user != null)
|
||||
return builder;
|
||||
else {
|
||||
|
||||
// this is the case where the ~/.github file exists but has no content.
|
||||
|
||||
builder = fromEnvironment();
|
||||
|
||||
if (builder.user != null)
|
||||
return builder;
|
||||
else
|
||||
throw new IOException("Failed to resolve credentials from ~/.github or the environment.");
|
||||
}
|
||||
|
||||
} catch (FileNotFoundException e) {
|
||||
builder = fromEnvironment();
|
||||
|
||||
if (builder.user != null)
|
||||
return builder;
|
||||
else
|
||||
throw new IOException("Failed to resolve credentials from ~/.github or the environment.", e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static GitHubBuilder fromEnvironment(String loginVariableName, String passwordVariableName, String oauthVariableName) throws IOException {
|
||||
|
||||
|
||||
Properties env = new Properties();
|
||||
|
||||
Object loginValue = System.getenv(loginVariableName);
|
||||
|
||||
if (loginValue != null)
|
||||
env.put("login", loginValue);
|
||||
|
||||
Object passwordValue = System.getenv(passwordVariableName);
|
||||
|
||||
if (passwordValue != null)
|
||||
env.put("password", passwordValue);
|
||||
|
||||
Object oauthValue = System.getenv(oauthVariableName);
|
||||
|
||||
if (oauthValue != null)
|
||||
env.put("oauth", oauthValue);
|
||||
|
||||
return fromProperties(env);
|
||||
|
||||
}
|
||||
|
||||
public static GitHubBuilder fromEnvironment() throws IOException {
|
||||
|
||||
Properties props = new Properties();
|
||||
|
||||
Map<String, String> env = System.getenv();
|
||||
|
||||
for (Map.Entry<String, String> element : env.entrySet()) {
|
||||
|
||||
props.put(element.getKey(), element.getValue());
|
||||
}
|
||||
|
||||
return fromProperties(props);
|
||||
}
|
||||
|
||||
public static GitHubBuilder fromPropertyFile() throws IOException {
|
||||
File homeDir = new File(System.getProperty("user.home"));
|
||||
File propertyFile = new File(homeDir, ".github");
|
||||
return fromPropertyFile(propertyFile.getPath());
|
||||
}
|
||||
|
||||
public static GitHubBuilder fromPropertyFile(String propertyFileName) throws IOException {
|
||||
Properties props = new Properties();
|
||||
FileInputStream in = null;
|
||||
try {
|
||||
in = new FileInputStream(propertyFileName);
|
||||
props.load(in);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(in);
|
||||
}
|
||||
|
||||
return fromProperties(props);
|
||||
}
|
||||
|
||||
public static GitHubBuilder fromProperties(Properties props) {
|
||||
GitHubBuilder self = new GitHubBuilder();
|
||||
self.withOAuthToken(props.getProperty("oauth"), props.getProperty("login"));
|
||||
self.withPassword(props.getProperty("login"), props.getProperty("password"));
|
||||
return self;
|
||||
}
|
||||
|
||||
public GitHubBuilder withEndpoint(String endpoint) {
|
||||
this.endpoint = endpoint;
|
||||
return this;
|
||||
}
|
||||
public GitHubBuilder withPassword(String user, String password) {
|
||||
this.user = user;
|
||||
this.password = password;
|
||||
return this;
|
||||
}
|
||||
public GitHubBuilder withOAuthToken(String oauthToken) {
|
||||
return withOAuthToken(oauthToken, null);
|
||||
}
|
||||
public GitHubBuilder withOAuthToken(String oauthToken, String user) {
|
||||
this.oauthToken = oauthToken;
|
||||
this.user = user;
|
||||
return this;
|
||||
}
|
||||
public GitHubBuilder withConnector(HttpConnector connector) {
|
||||
this.connector = connector;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures {@linkplain #withConnector(HttpConnector) connector}
|
||||
* that uses HTTP library in JRE but use a specific proxy, instead of
|
||||
* the system default one.
|
||||
*/
|
||||
public GitHubBuilder withProxy(final Proxy p) {
|
||||
return withConnector(new HttpConnector() {
|
||||
public HttpURLConnection connect(URL url) throws IOException {
|
||||
return (HttpURLConnection) url.openConnection(p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public GitHub build() throws IOException {
|
||||
return new GitHub(endpoint, user, oauthToken, password, connector);
|
||||
}
|
||||
}
|
||||
29
src/main/java/org/kohsuke/github/HttpConnector.java
Normal file
29
src/main/java/org/kohsuke/github/HttpConnector.java
Normal file
@@ -0,0 +1,29 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* Pluggability for customizing HTTP request behaviors or using altogether different library.
|
||||
*
|
||||
* <p>
|
||||
* For example, you can implement this to st custom timeouts.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public interface HttpConnector {
|
||||
/**
|
||||
* Opens a connection to the given URL.
|
||||
*/
|
||||
HttpURLConnection connect(URL url) throws IOException;
|
||||
|
||||
/**
|
||||
* Default implementation that uses {@link URL#openConnection()}.
|
||||
*/
|
||||
HttpConnector DEFAULT = new HttpConnector() {
|
||||
public HttpURLConnection connect(URL url) throws IOException {
|
||||
return (HttpURLConnection) url.openConnection();
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* {@link Iterable} that returns {@link PagedIterator}
|
||||
@@ -21,4 +23,15 @@ public abstract class PagedIterable<T> implements Iterable<T> {
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Eagerly walk {@link Iterable} and return the result in a set.
|
||||
*/
|
||||
public Set<T> asSet() {
|
||||
LinkedHashSet<T> r = new LinkedHashSet<T>();
|
||||
for(PagedIterator<T> i = iterator(); i.hasNext();) {
|
||||
r.addAll(i.nextPage());
|
||||
}
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
54
src/main/java/org/kohsuke/github/PagedSearchIterable.java
Normal file
54
src/main/java/org/kohsuke/github/PagedSearchIterable.java
Normal file
@@ -0,0 +1,54 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* {@link PagedIterable} enhanced to report search result specific information.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public abstract class PagedSearchIterable<T> extends PagedIterable<T> {
|
||||
/**
|
||||
* As soon as we have any result fetched, it's set here so that we can report the total count.
|
||||
*/
|
||||
private SearchResult<T> result;
|
||||
|
||||
/**
|
||||
* Returns the total number of hit, including the results that's not yet fetched.
|
||||
*/
|
||||
public int getTotalCount() {
|
||||
populate();
|
||||
return result.total_count;
|
||||
}
|
||||
|
||||
public boolean isIncomplete() {
|
||||
populate();
|
||||
return result.incomplete_results;
|
||||
}
|
||||
|
||||
private void populate() {
|
||||
if (result==null)
|
||||
iterator().hasNext();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adapts {@link Iterator}.
|
||||
*/
|
||||
protected Iterator<T[]> adapt(final Iterator<? extends SearchResult<T>> base) {
|
||||
return new Iterator<T[]>() {
|
||||
public boolean hasNext() {
|
||||
return base.hasNext();
|
||||
}
|
||||
|
||||
public T[] next() {
|
||||
SearchResult<T> v = base.next();
|
||||
if (result==null) result = v;
|
||||
return v.getItems();
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -23,20 +23,22 @@
|
||||
*/
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import static org.kohsuke.github.GitHub.MAPPER;
|
||||
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.io.Reader;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.ProtocolException;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
@@ -46,9 +48,13 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import static org.kohsuke.github.GitHub.MAPPER;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
|
||||
/**
|
||||
* A builder pattern for making HTTP call and parsing its output.
|
||||
@@ -128,6 +134,19 @@ class Requester {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlike {@link #with(String, String)}, overrides the existing value
|
||||
*/
|
||||
public Requester set(String key, Object value) {
|
||||
for (Entry e : args) {
|
||||
if (e.key.equals(key)) {
|
||||
e.value = value;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
return _with(key,value);
|
||||
}
|
||||
|
||||
public Requester method(String method) {
|
||||
this.method = method;
|
||||
return this;
|
||||
@@ -173,45 +192,99 @@ class Requester {
|
||||
while (true) {// loop while API rate limit is hit
|
||||
HttpURLConnection uc = setupConnection(root.getApiURL(tailApiUrl));
|
||||
|
||||
if (!method.equals("GET")) {
|
||||
uc.setDoOutput(true);
|
||||
uc.setRequestProperty("Content-type", contentType);
|
||||
|
||||
if (body == null) {
|
||||
Map json = new HashMap();
|
||||
for (Entry e : args) {
|
||||
json.put(e.key, e.value);
|
||||
}
|
||||
MAPPER.writeValue(uc.getOutputStream(), json);
|
||||
} else {
|
||||
try {
|
||||
byte[] bytes = new byte[32768];
|
||||
int read = 0;
|
||||
while ((read = body.read(bytes)) != -1) {
|
||||
uc.getOutputStream().write(bytes, 0, read);
|
||||
}
|
||||
} finally {
|
||||
body.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
buildRequest(uc);
|
||||
|
||||
try {
|
||||
return parse(uc,type,instance);
|
||||
T result = parse(uc, type, instance);
|
||||
if (type != null && type.isArray()) { // we might have to loop for pagination - done through recursion
|
||||
final String links = uc.getHeaderField("link");
|
||||
if (links != null && links.contains("rel=\"next\"")) {
|
||||
Pattern nextLinkPattern = Pattern.compile(".*<(.*)>; rel=\"next\"");
|
||||
Matcher nextLinkMatcher = nextLinkPattern.matcher(links);
|
||||
if (nextLinkMatcher.find()) {
|
||||
final String link = nextLinkMatcher.group(1);
|
||||
T nextResult = _to(link, type, instance);
|
||||
|
||||
final int resultLength = Array.getLength(result);
|
||||
final int nextResultLength = Array.getLength(nextResult);
|
||||
T concatResult = (T) Array.newInstance(type.getComponentType(), resultLength + nextResultLength);
|
||||
System.arraycopy(result, 0, concatResult, 0, resultLength);
|
||||
System.arraycopy(nextResult, 0, concatResult, resultLength, nextResultLength);
|
||||
result = concatResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
} catch (IOException e) {
|
||||
handleApiError(e,uc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes a request and just obtains the HTTP status code.
|
||||
*/
|
||||
public int asHttpStatusCode(String tailApiUrl) throws IOException {
|
||||
while (true) {// loop while API rate limit is hit
|
||||
HttpURLConnection uc = setupConnection(root.getApiURL(tailApiUrl));
|
||||
|
||||
buildRequest(uc);
|
||||
|
||||
try {
|
||||
return uc.getResponseCode();
|
||||
} catch (IOException e) {
|
||||
handleApiError(e,uc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void buildRequest(HttpURLConnection uc) throws IOException {
|
||||
if (!method.equals("GET")) {
|
||||
uc.setDoOutput(true);
|
||||
uc.setRequestProperty("Content-type", contentType);
|
||||
|
||||
if (body == null) {
|
||||
Map json = new HashMap();
|
||||
for (Entry e : args) {
|
||||
json.put(e.key, e.value);
|
||||
}
|
||||
MAPPER.writeValue(uc.getOutputStream(), json);
|
||||
} else {
|
||||
try {
|
||||
byte[] bytes = new byte[32768];
|
||||
int read = 0;
|
||||
while ((read = body.read(bytes)) != -1) {
|
||||
uc.getOutputStream().write(bytes, 0, read);
|
||||
}
|
||||
} finally {
|
||||
body.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads pagenated resources.
|
||||
*
|
||||
* Every iterator call reports a new batch.
|
||||
*/
|
||||
/*package*/ <T> Iterator<T> asIterator(final String tailApiUrl, final Class<T> type) {
|
||||
/*package*/ <T> Iterator<T> asIterator(String _tailApiUrl, final Class<T> type) {
|
||||
method("GET");
|
||||
if (!args.isEmpty()) throw new IllegalStateException();
|
||||
|
||||
if (!args.isEmpty()) {
|
||||
boolean first=true;
|
||||
try {
|
||||
for (Entry a : args) {
|
||||
_tailApiUrl += first ? '?' : '&';
|
||||
first = false;
|
||||
_tailApiUrl += URLEncoder.encode(a.key,"UTF-8")+'='+URLEncoder.encode(a.value.toString(),"UTF-8");
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new AssertionError(e); // UTF-8 is mandatory
|
||||
}
|
||||
}
|
||||
|
||||
final String tailApiUrl = _tailApiUrl;
|
||||
|
||||
return new Iterator<T>() {
|
||||
/**
|
||||
@@ -294,7 +367,7 @@ class Requester {
|
||||
|
||||
|
||||
private HttpURLConnection setupConnection(URL url) throws IOException {
|
||||
HttpsURLConnection uc = (HttpsURLConnection) url.openConnection();
|
||||
HttpURLConnection uc = root.getConnector().connect(url);
|
||||
|
||||
// if the authentication is needed but no credential is given, try it anyway (so that some calls
|
||||
// that do work with anonymous access in the reduced form should still work.)
|
||||
|
||||
13
src/main/java/org/kohsuke/github/SearchResult.java
Normal file
13
src/main/java/org/kohsuke/github/SearchResult.java
Normal file
@@ -0,0 +1,13 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
/**
|
||||
* Represents the result of a search
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
abstract class SearchResult<T> {
|
||||
int total_count;
|
||||
boolean incomplete_results;
|
||||
|
||||
public abstract T[] getItems();
|
||||
}
|
||||
32
src/main/java/org/kohsuke/github/extras/OkHttpConnector.java
Normal file
32
src/main/java/org/kohsuke/github/extras/OkHttpConnector.java
Normal file
@@ -0,0 +1,32 @@
|
||||
package org.kohsuke.github.extras;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* {@link HttpConnector} for {@link OkHttpClient}.
|
||||
*
|
||||
* Unlike {@link #DEFAULT}, OkHttp does response caching.
|
||||
* Making a conditional request against GitHubAPI and receiving a 304
|
||||
* response does not count against the rate limit.
|
||||
* See http://developer.github.com/v3/#conditional-requests
|
||||
*
|
||||
* @author Roberto Tyley
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class OkHttpConnector implements HttpConnector {
|
||||
private final OkUrlFactory urlFactory;
|
||||
|
||||
public OkHttpConnector(OkUrlFactory urlFactory) {
|
||||
this.urlFactory = urlFactory;
|
||||
}
|
||||
|
||||
public HttpURLConnection connect(URL url) throws IOException {
|
||||
return urlFactory.open(url);
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,8 @@ operations that act on them as defined as methods (such as `GHUser.follow()`), a
|
||||
are used in favor of using string handle (such as `GHUser.isMemberOf(GHOrganization)` instead of
|
||||
`GHUser.isMemberOf(String)`)
|
||||
|
||||
The library supports both github.com and GitHub Enterprise.
|
||||
|
||||
There are some corners of the GitHub API that's not yet implemented, but
|
||||
the library is implemented with the right abstractions and libraries to make it very easy to improve the coverage.
|
||||
|
||||
@@ -34,3 +36,10 @@ Alternatively, you can have just the OAuth token in this file:
|
||||
|
||||
oauth=4d98173f7c075527cb64878561d1fe70
|
||||
|
||||
OkHttp
|
||||
----
|
||||
This library comes with a pluggable connector to use different HTTP client implementations
|
||||
through `HttpConnector`. In particular, this means you can use [OkHttp](http://square.github.io/okhttp/),
|
||||
so we can make use of it's HTTP response cache.
|
||||
Making a conditional request against the GitHub API and receiving a 304 response
|
||||
[does not count against the rate limit](http://developer.github.com/v3/#conditional-requests).
|
||||
@@ -1,13 +1,17 @@
|
||||
import org.kohsuke.github.GHRepository;
|
||||
import org.kohsuke.github.GitHub;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class Foo {
|
||||
public static void main(String[] args) throws Exception {
|
||||
System.out.println(GitHub.connect().createToken(
|
||||
Arrays.asList("user", "repo", "delete_repo", "notifications", "gist"), "GitHub API", null).getToken());
|
||||
Collection<GHRepository> lst = GitHub.connect().getUser("kohsuke").getRepositories().values();
|
||||
for (GHRepository r : lst) {
|
||||
System.out.println(r.getName());
|
||||
}
|
||||
System.out.println(lst.size());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,369 +0,0 @@
|
||||
package org.kohsuke;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.kohsuke.github.GHCommit;
|
||||
import org.kohsuke.github.GHCommit.File;
|
||||
import org.kohsuke.github.GHCommitComment;
|
||||
import org.kohsuke.github.GHCommitStatus;
|
||||
import org.kohsuke.github.GHEvent;
|
||||
import org.kohsuke.github.GHEventInfo;
|
||||
import org.kohsuke.github.GHEventPayload;
|
||||
import org.kohsuke.github.GHHook;
|
||||
import org.kohsuke.github.GHBranch;
|
||||
import org.kohsuke.github.GHIssue;
|
||||
import org.kohsuke.github.GHIssueComment;
|
||||
import org.kohsuke.github.GHIssueState;
|
||||
import org.kohsuke.github.GHKey;
|
||||
import org.kohsuke.github.GHMilestone;
|
||||
import org.kohsuke.github.GHMyself;
|
||||
import org.kohsuke.github.GHOrganization;
|
||||
import org.kohsuke.github.GHOrganization.Permission;
|
||||
import org.kohsuke.github.GHPullRequest;
|
||||
import org.kohsuke.github.GHRepository;
|
||||
import org.kohsuke.github.GHTeam;
|
||||
import org.kohsuke.github.GHUser;
|
||||
import org.kohsuke.github.GitHub;
|
||||
import org.kohsuke.github.PagedIterable;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class AppTest extends TestCase {
|
||||
|
||||
private GitHub gitHub;
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
gitHub = GitHub.connect();
|
||||
}
|
||||
|
||||
public void testRepoCRUD() throws Exception {
|
||||
GHRepository existing = gitHub.getMyself().getRepository("github-api-test");
|
||||
if (existing!=null)
|
||||
existing.delete();
|
||||
GHRepository r = gitHub.createRepository("github-api-test", "a test repository", "http://github-api.kohsuke.org/", true);
|
||||
r.enableIssueTracker(false);
|
||||
r.enableDownloads(false);
|
||||
r.enableWiki(false);
|
||||
r.renameTo("github-api-test2");
|
||||
gitHub.getMyself().getRepository("github-api-test2").delete();
|
||||
}
|
||||
|
||||
public void testCredentialValid() throws IOException {
|
||||
assertTrue(gitHub.isCredentialValid());
|
||||
assertFalse(GitHub.connect("totally", "bogus").isCredentialValid());
|
||||
}
|
||||
|
||||
public void testIssueWithNoComment() throws IOException {
|
||||
GHRepository repository = gitHub.getRepository("kohsuke/test");
|
||||
List<GHIssueComment> v = repository.getIssue(4).getComments();
|
||||
System.out.println(v);
|
||||
assertTrue(v.isEmpty());
|
||||
|
||||
v = repository.getIssue(3).getComments();
|
||||
System.out.println(v);
|
||||
assertTrue(v.size() == 3);
|
||||
}
|
||||
|
||||
public void testCreateIssue() throws IOException {
|
||||
GHUser u = gitHub.getUser("kohsuke");
|
||||
GHRepository r = u.getRepository("test");
|
||||
GHMilestone someMilestone = r.listMilestones(GHIssueState.CLOSED).iterator().next();
|
||||
GHIssue o = r.createIssue("testing").body("this is body").assignee(u).label("bug").label("question").milestone(someMilestone).create();
|
||||
System.out.println(o.getUrl());
|
||||
o.close();
|
||||
}
|
||||
|
||||
public void testGetIssues() throws Exception {
|
||||
List<GHIssue> closedIssues = gitHub.getUser("kohsuke").getRepository("github-api").getIssues(GHIssueState.CLOSED);
|
||||
// prior to using PagedIterable GHRepository.getIssues(GHIssueState) would only retrieve 30 issues
|
||||
assertTrue(closedIssues.size() > 30);
|
||||
}
|
||||
|
||||
public void testRateLimit() throws IOException {
|
||||
System.out.println(gitHub.getRateLimit());
|
||||
}
|
||||
|
||||
public void testMyOrganizations() throws IOException {
|
||||
Map<String, GHOrganization> org = gitHub.getMyOrganizations();
|
||||
assertFalse(org.keySet().contains(null));
|
||||
System.out.println(org);
|
||||
}
|
||||
|
||||
public void testFetchPullRequest() throws Exception {
|
||||
GHRepository r = gitHub.getOrganization("jenkinsci").getRepository("jenkins");
|
||||
assertEquals("master",r.getMasterBranch());
|
||||
r.getPullRequest(1);
|
||||
r.getPullRequests(GHIssueState.OPEN);
|
||||
}
|
||||
|
||||
public void testFetchPullRequestAsList() throws Exception {
|
||||
GHRepository r = gitHub.getOrganization("symfony").getRepository("symfony-docs");
|
||||
assertEquals("master", r.getMasterBranch());
|
||||
PagedIterable<GHPullRequest> i = r.listPullRequests(GHIssueState.CLOSED);
|
||||
List<GHPullRequest> prs = i.asList();
|
||||
assertNotNull(prs);
|
||||
assertTrue(prs.size() > 0);
|
||||
}
|
||||
|
||||
public void testRepoPermissions() throws Exception {
|
||||
GHRepository r = gitHub.getOrganization("jenkinsci").getRepository("jenkins");
|
||||
assertTrue(r.hasPullAccess());
|
||||
|
||||
r = gitHub.getOrganization("github").getRepository("tire");
|
||||
assertFalse(r.hasAdminAccess());
|
||||
}
|
||||
|
||||
public void testGetMyself() throws Exception {
|
||||
GHMyself me = gitHub.getMyself();
|
||||
System.out.println(me);
|
||||
GHUser u = gitHub.getUser("kohsuke2");
|
||||
System.out.println(u);
|
||||
for (List<GHRepository> lst : me.iterateRepositories(100)) {
|
||||
for (GHRepository r : lst) {
|
||||
System.out.println(r.getPushedAt());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testPublicKeys() throws Exception {
|
||||
List<GHKey> keys = gitHub.getMyself().getPublicKeys();
|
||||
System.out.println(keys);
|
||||
}
|
||||
|
||||
public void tryOrgFork() throws Exception {
|
||||
gitHub.getUser("kohsuke").getRepository("rubywm").forkTo(gitHub.getOrganization("jenkinsci"));
|
||||
}
|
||||
|
||||
public void tryGetTeamsForRepo() throws Exception {
|
||||
Set<GHTeam> o = gitHub.getOrganization("jenkinsci").getRepository("rubywm").getTeams();
|
||||
System.out.println(o);
|
||||
}
|
||||
|
||||
public void testMembership() throws Exception {
|
||||
Set<String> members = gitHub.getOrganization("jenkinsci").getRepository("violations-plugin").getCollaboratorNames();
|
||||
System.out.println(members.contains("kohsuke"));
|
||||
}
|
||||
|
||||
public void testMemberOrgs() throws Exception {
|
||||
Set<GHOrganization> o = gitHub.getUser("kohsuke").getOrganizations();
|
||||
System.out.println(o);
|
||||
}
|
||||
|
||||
public void testCommit() throws Exception {
|
||||
GHCommit commit = gitHub.getUser("jenkinsci").getRepository("jenkins").getCommit("08c1c9970af4d609ae754fbe803e06186e3206f7");
|
||||
System.out.println(commit);
|
||||
assertEquals(1, commit.getParents().size());
|
||||
assertEquals(1,commit.getFiles().size());
|
||||
|
||||
File f = commit.getFiles().get(0);
|
||||
assertEquals(48,f.getLinesChanged());
|
||||
assertEquals("modified",f.getStatus());
|
||||
assertEquals("changelog.html", f.getFileName());
|
||||
}
|
||||
|
||||
public void testListCommits() throws Exception {
|
||||
List<String> sha1 = new ArrayList<String>();
|
||||
for (GHCommit c : gitHub.getUser("kohsuke").getRepository("empty-commit").listCommits()) {
|
||||
System.out.println(c.getSHA1());
|
||||
sha1.add(c.getSHA1());
|
||||
}
|
||||
assertEquals("fdfad6be4db6f96faea1f153fb447b479a7a9cb7",sha1.get(0));
|
||||
assertEquals(1,sha1.size());
|
||||
}
|
||||
|
||||
public void testBranches() throws Exception {
|
||||
Map<String,GHBranch> b =
|
||||
gitHub.getUser("jenkinsci").getRepository("jenkins").getBranches();
|
||||
System.out.println(b);
|
||||
}
|
||||
|
||||
public void testCommitComment() throws Exception {
|
||||
GHRepository r = gitHub.getUser("jenkinsci").getRepository("jenkins");
|
||||
PagedIterable<GHCommitComment> comments = r.listCommitComments();
|
||||
List<GHCommitComment> batch = comments.iterator().nextPage();
|
||||
for (GHCommitComment comment : batch) {
|
||||
System.out.println(comment.getBody());
|
||||
assertSame(comment.getOwner(), r);
|
||||
}
|
||||
}
|
||||
|
||||
public void testCreateCommitComment() throws Exception {
|
||||
GHCommit commit = gitHub.getUser("kohsuke").getRepository("sandbox-ant").getCommit("8ae38db0ea5837313ab5f39d43a6f73de3bd9000");
|
||||
GHCommitComment c = commit.createComment("[testing](http://kohsuse.org/)");
|
||||
System.out.println(c);
|
||||
c.update("updated text");
|
||||
System.out.println(c);
|
||||
c.delete();
|
||||
}
|
||||
|
||||
public void tryHook() throws Exception {
|
||||
GHRepository r = gitHub.getMyself().getRepository("test2");
|
||||
GHHook hook = r.createWebHook(new URL("http://www.google.com/"));
|
||||
System.out.println(hook);
|
||||
|
||||
for (GHHook h : r.getHooks())
|
||||
h.delete();
|
||||
}
|
||||
|
||||
public void testEventApi() throws Exception {
|
||||
for (GHEventInfo ev : gitHub.getEvents()) {
|
||||
System.out.println(ev);
|
||||
if (ev.getType()==GHEvent.PULL_REQUEST) {
|
||||
GHEventPayload.PullRequest pr = ev.getPayload(GHEventPayload.PullRequest.class);
|
||||
System.out.println(pr.getNumber());
|
||||
System.out.println(pr.getPullRequest());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testApp() throws IOException {
|
||||
System.out.println(gitHub.getMyself().getEmails());
|
||||
|
||||
// GHRepository r = gitHub.getOrganization("jenkinsci").createRepository("kktest4", "Kohsuke's test", "http://kohsuke.org/", "Everyone", true);
|
||||
// r.fork();
|
||||
|
||||
// tryDisablingIssueTrackers(gitHub);
|
||||
|
||||
// tryDisablingWiki(gitHub);
|
||||
|
||||
// GHPullRequest i = gitHub.getOrganization("jenkinsci").getRepository("sandbox").getPullRequest(1);
|
||||
// for (GHIssueComment c : i.getComments())
|
||||
// System.out.println(c);
|
||||
// System.out.println(i);
|
||||
|
||||
// gitHub.getMyself().getRepository("perforce-plugin").setEmailServiceHook("kk@kohsuke.org");
|
||||
|
||||
// tryRenaming(gitHub);
|
||||
// tryOrgFork(gitHub);
|
||||
|
||||
// testOrganization(gitHub);
|
||||
// testPostCommitHook(gitHub);
|
||||
|
||||
// tryTeamCreation(gitHub);
|
||||
|
||||
// t.add(gitHub.getMyself());
|
||||
// System.out.println(t.getMembers());
|
||||
// t.remove(gitHub.getMyself());
|
||||
// System.out.println(t.getMembers());
|
||||
|
||||
// GHRepository r = gitHub.getOrganization("HudsonLabs").createRepository("auto-test", "some description", "http://kohsuke.org/", "Plugin Developers", true);
|
||||
|
||||
// r.
|
||||
// GitHub hub = GitHub.connectAnonymously();
|
||||
//// hub.createRepository("test","test repository",null,true);
|
||||
//// hub.getUser("kohsuke").getRepository("test").delete();
|
||||
//
|
||||
// System.out.println(hub.getUser("kohsuke").getRepository("hudson").getCollaborators());
|
||||
}
|
||||
|
||||
private void tryDisablingIssueTrackers(GitHub gitHub) throws IOException {
|
||||
for (GHRepository r : gitHub.getOrganization("jenkinsci").getRepositories().values()) {
|
||||
if (r.hasIssues()) {
|
||||
if (r.getOpenIssueCount()==0) {
|
||||
System.out.println("DISABLED "+r.getName());
|
||||
r.enableIssueTracker(false);
|
||||
} else {
|
||||
System.out.println("UNTOUCHED "+r.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void tryDisablingWiki(GitHub gitHub) throws IOException {
|
||||
for (GHRepository r : gitHub.getOrganization("jenkinsci").getRepositories().values()) {
|
||||
if (r.hasWiki()) {
|
||||
System.out.println("DISABLED "+r.getName());
|
||||
r.enableWiki(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void tryUpdatingIssueTracker(GitHub gitHub) throws IOException {
|
||||
GHRepository r = gitHub.getOrganization("jenkinsci").getRepository("lib-task-reactor");
|
||||
System.out.println(r.hasIssues());
|
||||
System.out.println(r.getOpenIssueCount());
|
||||
r.enableIssueTracker(false);
|
||||
}
|
||||
|
||||
private void tryRenaming(GitHub gitHub) throws IOException {
|
||||
gitHub.getUser("kohsuke").getRepository("test").renameTo("test2");
|
||||
}
|
||||
|
||||
private void tryTeamCreation(GitHub gitHub) throws IOException {
|
||||
GHOrganization o = gitHub.getOrganization("HudsonLabs");
|
||||
GHTeam t = o.createTeam("auto team", Permission.PUSH);
|
||||
t.add(o.getRepository("auto-test"));
|
||||
}
|
||||
|
||||
private void testPostCommitHook(GitHub gitHub) throws IOException {
|
||||
GHRepository r = gitHub.getMyself().getRepository("foo");
|
||||
Set<URL> hooks = r.getPostCommitHooks();
|
||||
hooks.add(new URL("http://kohsuke.org/test"));
|
||||
System.out.println(hooks);
|
||||
hooks.remove(new URL("http://kohsuke.org/test"));
|
||||
System.out.println(hooks);
|
||||
}
|
||||
|
||||
public void testOrgRepositories() throws IOException {
|
||||
GHOrganization j = gitHub.getOrganization("jenkinsci");
|
||||
long start = System.currentTimeMillis();
|
||||
Map<String, GHRepository> repos = j.getRepositories();
|
||||
long end = System.currentTimeMillis();
|
||||
System.out.printf("%d repositories in %dms\n",repos.size(),end-start);
|
||||
}
|
||||
|
||||
public void testOrganization() throws IOException {
|
||||
GHOrganization j = gitHub.getOrganization("jenkinsci");
|
||||
GHTeam t = j.getTeams().get("Core Developers");
|
||||
|
||||
assertNotNull(j.getRepository("jenkins"));
|
||||
|
||||
// t.add(labs.getRepository("xyz"));
|
||||
}
|
||||
|
||||
public void testCommitStatus() throws Exception {
|
||||
GHRepository r = gitHub.getUser("kohsuke").getRepository("test");
|
||||
GHCommitStatus state;
|
||||
// state = r.createCommitStatus("edacdd76b06c5f3f0697a22ca75803169f25f296", GHCommitState.FAILURE, "http://jenkins-ci.org/", "oops!");
|
||||
|
||||
List<GHCommitStatus> lst = r.listCommitStatuses("edacdd76b06c5f3f0697a22ca75803169f25f296").asList();
|
||||
state = lst.get(0);
|
||||
System.out.println(state);
|
||||
assertEquals("oops!",state.getDescription());
|
||||
assertEquals("http://jenkins-ci.org/",state.getTargetUrl());
|
||||
}
|
||||
|
||||
public void testCommitShortInfo() throws Exception {
|
||||
GHCommit commit = gitHub.getUser("kohsuke").getRepository("test").getCommit("c77360d6f2ff2c2e6dd11828ad5dccf72419fa1b");
|
||||
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Kohsuke Kawaguchi");
|
||||
assertEquals(commit.getCommitShortInfo().getMessage(), "Added a file");
|
||||
}
|
||||
|
||||
public void testPullRequestPopulate() throws Exception {
|
||||
GHRepository r = gitHub.getUser("kohsuke").getRepository("github-api");
|
||||
GHPullRequest p = r.getPullRequest(17);
|
||||
GHUser u = p.getUser();
|
||||
assertNotNull(u.getName());
|
||||
}
|
||||
|
||||
public void testCheckMembership() throws Exception {
|
||||
GHOrganization j = gitHub.getOrganization("jenkinsci");
|
||||
GHUser kohsuke = gitHub.getUser("kohsuke");
|
||||
GHUser a = gitHub.getUser("a");
|
||||
|
||||
assertTrue(j.hasMember(kohsuke));
|
||||
assertFalse(j.hasMember(a));
|
||||
|
||||
assertTrue(j.hasPublicMember(kohsuke));
|
||||
assertFalse(j.hasPublicMember(a));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.kohsuke.randname.RandomNameGenerator;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public abstract class AbstractGitHubApiTestBase extends Assert {
|
||||
|
||||
protected GitHub gitHub;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
Properties props = new Properties();
|
||||
java.io.File f = new java.io.File(System.getProperty("user.home"), ".github.kohsuke2");
|
||||
if (f.exists()) {
|
||||
FileInputStream in = new FileInputStream(f);
|
||||
try {
|
||||
props.load(in);
|
||||
gitHub = GitHub.connect(props.getProperty("login"),props.getProperty("oauth"));
|
||||
} finally {
|
||||
IOUtils.closeQuietly(in);
|
||||
}
|
||||
} else {
|
||||
gitHub = GitHub.connect();
|
||||
}
|
||||
}
|
||||
|
||||
protected static final RandomNameGenerator rnd = new RandomNameGenerator();
|
||||
}
|
||||
716
src/test/java/org/kohsuke/github/AppTest.java
Executable file
716
src/test/java/org/kohsuke/github/AppTest.java
Executable file
@@ -0,0 +1,716 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.junit.Assume;
|
||||
import org.junit.Test;
|
||||
import org.kohsuke.github.GHCommit.File;
|
||||
import org.kohsuke.github.GHOrganization.Permission;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class AppTest extends AbstractGitHubApiTestBase {
|
||||
private String getTestRepositoryName() throws IOException {
|
||||
return getUser().getLogin() + "/github-api-test";
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRepoCRUD() throws Exception {
|
||||
String targetName = "github-api-test-rename2";
|
||||
|
||||
deleteRepository("github-api-test-rename");
|
||||
deleteRepository(targetName);
|
||||
GHRepository r = gitHub.createRepository("github-api-test-rename", "a test repository", "http://github-api.kohsuke.org/", true);
|
||||
r.enableIssueTracker(false);
|
||||
r.enableDownloads(false);
|
||||
r.enableWiki(false);
|
||||
r.renameTo(targetName);
|
||||
getUser().getRepository(targetName).delete();
|
||||
}
|
||||
|
||||
private void deleteRepository(final String name) throws IOException {
|
||||
GHRepository repository = getUser().getRepository(name);
|
||||
if(repository != null) {
|
||||
repository.delete();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCredentialValid() throws IOException {
|
||||
assertTrue(gitHub.isCredentialValid());
|
||||
GitHub connect = GitHub.connect("totally", "bogus");
|
||||
assertFalse(connect.isCredentialValid());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIssueWithNoComment() throws IOException {
|
||||
GHRepository repository = gitHub.getRepository("kohsuke/test");
|
||||
List<GHIssueComment> v = repository.getIssue(4).getComments();
|
||||
System.out.println(v);
|
||||
assertTrue(v.isEmpty());
|
||||
|
||||
v = repository.getIssue(3).getComments();
|
||||
System.out.println(v);
|
||||
assertTrue(v.size() == 3);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateIssue() throws IOException {
|
||||
GHUser u = getUser();
|
||||
GHRepository repository = getTestRepository();
|
||||
GHMilestone milestone = repository.createMilestone(System.currentTimeMillis() + "", "Test Milestone");
|
||||
GHIssue o = repository.createIssue("testing")
|
||||
.body("this is body")
|
||||
.assignee(u)
|
||||
.label("bug")
|
||||
.label("question")
|
||||
.milestone(milestone)
|
||||
.create();
|
||||
assertNotNull(o);
|
||||
o.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateDeployment() throws IOException {
|
||||
GHRepository repository = getTestRepository();
|
||||
GHDeployment deployment = repository.createDeployment("master")
|
||||
.payload("{\"user\":\"atmos\",\"room_id\":123456}")
|
||||
.description("question")
|
||||
.create();
|
||||
assertNotNull(deployment.getCreator());
|
||||
assertNotNull(deployment.getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testListDeployments() throws IOException {
|
||||
GHRepository repository = getTestRepository();
|
||||
GHDeployment deployment = repository.createDeployment("master")
|
||||
.payload("{\"user\":\"atmos\",\"room_id\":123456}")
|
||||
.description("question")
|
||||
.environment("unittest")
|
||||
.create();
|
||||
assertNotNull(deployment.getCreator());
|
||||
assertNotNull(deployment.getId());
|
||||
ArrayList<GHDeployment> deployments = Lists.newArrayList(repository.listDeployments(null, "master", null, "unittest"));
|
||||
assertNotNull(deployments);
|
||||
assertFalse(Iterables.isEmpty(deployments));
|
||||
GHDeployment unitTestDeployment = deployments.get(0);
|
||||
assertEquals("unittest",unitTestDeployment.getEnvironment());
|
||||
assertEquals("master", unitTestDeployment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDeploymentStatuses() throws IOException {
|
||||
GHRepository repository = getTestRepository();
|
||||
GHDeployment deployment = repository.createDeployment("master")
|
||||
.description("question")
|
||||
.payload("{\"user\":\"atmos\",\"room_id\":123456}")
|
||||
.create();
|
||||
GHDeploymentStatus ghDeploymentStatus = repository.createDeployStatus(deployment.getId(), GHDeploymentState.SUCCESS)
|
||||
.description("success")
|
||||
.targetUrl("http://www.github.com").create();
|
||||
Iterable<GHDeploymentStatus> deploymentStatuses = repository.getDeploymentStatuses(deployment.getId());
|
||||
assertNotNull(deploymentStatuses);
|
||||
assertEquals(1,Iterables.size(deploymentStatuses));
|
||||
assertEquals(ghDeploymentStatus.getId(), Iterables.get(deploymentStatuses, 0).getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetIssues() throws Exception {
|
||||
List<GHIssue> closedIssues = gitHub.getUser("kohsuke").getRepository("github-api").getIssues(GHIssueState.CLOSED);
|
||||
// prior to using PagedIterable GHRepository.getIssues(GHIssueState) would only retrieve 30 issues
|
||||
assertTrue(closedIssues.size() > 30);
|
||||
}
|
||||
|
||||
|
||||
private GHRepository getTestRepository() throws IOException {
|
||||
GHRepository repository;
|
||||
try {
|
||||
repository = gitHub.getRepository(getTestRepositoryName());
|
||||
} catch (IOException e) {
|
||||
repository = gitHub.createRepository("github-api-test", "A test repository for testing" +
|
||||
"the github-api project", "http://github-api.kohsuke.org/", true);
|
||||
try {
|
||||
Thread.sleep(2000);
|
||||
} catch (InterruptedException e1) {
|
||||
throw new RuntimeException(e.getMessage(), e);
|
||||
}
|
||||
repository.enableIssueTracker(true);
|
||||
repository.enableDownloads(true);
|
||||
repository.enableWiki(true);
|
||||
}
|
||||
return repository;
|
||||
}
|
||||
|
||||
private GHUser getUser() {
|
||||
try {
|
||||
return gitHub.getMyself();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testListIssues() throws IOException {
|
||||
GHUser u = getUser();
|
||||
GHRepository repository = getTestRepository();
|
||||
|
||||
GHMilestone milestone = repository.createMilestone(System.currentTimeMillis() + "", "Test Milestone");
|
||||
milestone.close();
|
||||
GHIssue unhomed = null;
|
||||
GHIssue homed = null;
|
||||
try {
|
||||
unhomed = repository.createIssue("testing").body("this is body")
|
||||
.assignee(u)
|
||||
.label("bug")
|
||||
.label("question")
|
||||
.create();
|
||||
assertEquals(unhomed.getNumber(), repository.getIssues(GHIssueState.OPEN, null).get(0).getNumber());
|
||||
homed = repository.createIssue("testing").body("this is body")
|
||||
.assignee(u)
|
||||
.label("bug")
|
||||
.label("question")
|
||||
.milestone(milestone)
|
||||
.create();
|
||||
assertEquals(homed.getNumber(), repository.getIssues(GHIssueState.OPEN, milestone).get(0).getNumber());
|
||||
} finally {
|
||||
if (unhomed != null) {
|
||||
unhomed.close();
|
||||
}
|
||||
if (homed != null) {
|
||||
homed.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRateLimit() throws IOException {
|
||||
System.out.println(gitHub.getRateLimit());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMyOrganizations() throws IOException {
|
||||
Map<String, GHOrganization> org = gitHub.getMyOrganizations();
|
||||
assertFalse(org.keySet().contains(null));
|
||||
System.out.println(org);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMyTeamsContainsAllMyOrganizations() throws IOException {
|
||||
Map<String, Set<GHTeam>> teams = gitHub.getMyTeams();
|
||||
Map<String, GHOrganization> myOrganizations = gitHub.getMyOrganizations();
|
||||
assertEquals(teams.keySet(), myOrganizations.keySet());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMyTeamsShouldIncludeMyself() throws IOException {
|
||||
Map<String, Set<GHTeam>> teams = gitHub.getMyTeams();
|
||||
for (Entry<String, Set<GHTeam>> teamsPerOrg : teams.entrySet()) {
|
||||
String organizationName = teamsPerOrg.getKey();
|
||||
for (GHTeam team : teamsPerOrg.getValue()) {
|
||||
String teamName = team.getName();
|
||||
assertTrue("Team " + teamName + " in organization " + organizationName
|
||||
+ " does not contain myself",
|
||||
shouldBelongToTeam(organizationName, teamName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean shouldBelongToTeam(String organizationName, String teamName) throws IOException {
|
||||
GHOrganization org = gitHub.getOrganization(organizationName);
|
||||
assertNotNull(org);
|
||||
GHTeam team = org.getTeamByName(teamName);
|
||||
assertNotNull(team);
|
||||
return team.hasMember(gitHub.getMyself());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFetchPullRequest() throws Exception {
|
||||
GHRepository r = gitHub.getOrganization("jenkinsci").getRepository("jenkins");
|
||||
assertEquals("master",r.getMasterBranch());
|
||||
r.getPullRequest(1);
|
||||
r.getPullRequests(GHIssueState.OPEN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFetchPullRequestAsList() throws Exception {
|
||||
GHRepository r = gitHub.getRepository("kohsuke/github-api");
|
||||
assertEquals("master", r.getMasterBranch());
|
||||
PagedIterable<GHPullRequest> i = r.listPullRequests(GHIssueState.CLOSED);
|
||||
List<GHPullRequest> prs = i.asList();
|
||||
assertNotNull(prs);
|
||||
assertTrue(prs.size() > 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRepoPermissions() throws Exception {
|
||||
kohsuke();
|
||||
GHRepository r = gitHub.getOrganization("jenkinsci").getRepository("jenkins");
|
||||
assertTrue(r.hasPullAccess());
|
||||
|
||||
r = gitHub.getOrganization("github").getRepository("hub");
|
||||
assertFalse(r.hasAdminAccess());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetMyself() throws Exception {
|
||||
GHMyself me = gitHub.getMyself();
|
||||
assertNotNull(me);
|
||||
assertNotNull(gitHub.getUser("kohsuke2"));
|
||||
PagedIterable<GHRepository> ghRepositories = me.listRepositories();
|
||||
assertTrue(ghRepositories.iterator().hasNext());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPublicKeys() throws Exception {
|
||||
List<GHKey> keys = gitHub.getMyself().getPublicKeys();
|
||||
assertFalse(keys.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrgFork() throws Exception {
|
||||
kohsuke();
|
||||
gitHub.getRepository("kohsuke/rubywm").forkTo(gitHub.getOrganization("github-api-test-org"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetTeamsForRepo() throws Exception {
|
||||
kohsuke();
|
||||
assertEquals(1, gitHub.getOrganization("github-api-test-org").getRepository("testGetTeamsForRepo").getTeams().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMembership() throws Exception {
|
||||
Set<String> members = gitHub.getOrganization("jenkinsci").getRepository("violations-plugin").getCollaboratorNames();
|
||||
System.out.println(members.contains("kohsuke"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMemberOrgs() throws Exception {
|
||||
Set<GHOrganization> o = gitHub.getUser("kohsuke").getOrganizations();
|
||||
System.out.println(o);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrgTeams() throws Exception {
|
||||
kohsuke();
|
||||
int sz=0;
|
||||
for (GHTeam t : gitHub.getOrganization("github-api-test-org").listTeams()) {
|
||||
assertNotNull(t.getName());
|
||||
sz++;
|
||||
}
|
||||
assertTrue(sz < 100);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrgTeamByName() throws Exception {
|
||||
kohsuke();
|
||||
GHTeam e = gitHub.getOrganization("github-api-test-org").getTeamByName("Core Developers");
|
||||
assertNotNull(e);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCommit() throws Exception {
|
||||
GHCommit commit = gitHub.getUser("jenkinsci").getRepository("jenkins").getCommit("08c1c9970af4d609ae754fbe803e06186e3206f7");
|
||||
System.out.println(commit);
|
||||
assertEquals(1, commit.getParents().size());
|
||||
assertEquals(1,commit.getFiles().size());
|
||||
|
||||
File f = commit.getFiles().get(0);
|
||||
assertEquals(48,f.getLinesChanged());
|
||||
assertEquals("modified",f.getStatus());
|
||||
assertEquals("changelog.html", f.getFileName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testListCommits() throws Exception {
|
||||
List<String> sha1 = new ArrayList<String>();
|
||||
for (GHCommit c : gitHub.getUser("kohsuke").getRepository("empty-commit").listCommits()) {
|
||||
System.out.println(c.getSHA1());
|
||||
sha1.add(c.getSHA1());
|
||||
}
|
||||
assertEquals("fdfad6be4db6f96faea1f153fb447b479a7a9cb7", sha1.get(0));
|
||||
assertEquals(1, sha1.size());
|
||||
}
|
||||
|
||||
public void testQueryCommits() throws Exception {
|
||||
List<String> sha1 = new ArrayList<String>();
|
||||
for (GHCommit c : gitHub.getUser("jenkinsci").getRepository("jenkins").queryCommits()
|
||||
.since(new Date(1199174400000L)).until(1201852800000L).path("pom.xml").list()) {
|
||||
System.out.println(c.getSHA1());
|
||||
sha1.add(c.getSHA1());
|
||||
}
|
||||
assertEquals("1cccddb22e305397151b2b7b87b4b47d74ca337b",sha1.get(0));
|
||||
assertEquals(29,sha1.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBranches() throws Exception {
|
||||
Map<String,GHBranch> b =
|
||||
gitHub.getUser("jenkinsci").getRepository("jenkins").getBranches();
|
||||
System.out.println(b);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCommitComment() throws Exception {
|
||||
GHRepository r = gitHub.getUser("jenkinsci").getRepository("jenkins");
|
||||
PagedIterable<GHCommitComment> comments = r.listCommitComments();
|
||||
List<GHCommitComment> batch = comments.iterator().nextPage();
|
||||
for (GHCommitComment comment : batch) {
|
||||
System.out.println(comment.getBody());
|
||||
assertSame(comment.getOwner(), r);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateCommitComment() throws Exception {
|
||||
GHCommit commit = gitHub.getUser("kohsuke").getRepository("sandbox-ant").getCommit("8ae38db0ea5837313ab5f39d43a6f73de3bd9000");
|
||||
GHCommitComment c = commit.createComment("[testing](http://kohsuse.org/)");
|
||||
System.out.println(c);
|
||||
c.update("updated text");
|
||||
System.out.println(c);
|
||||
c.delete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tryHook() throws Exception {
|
||||
kohsuke();
|
||||
GHRepository r = gitHub.getMyself().getRepository("test2");
|
||||
GHHook hook = r.createWebHook(new URL("http://www.google.com/"));
|
||||
System.out.println(hook);
|
||||
|
||||
for (GHHook h : r.getHooks())
|
||||
h.delete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEventApi() throws Exception {
|
||||
for (GHEventInfo ev : gitHub.getEvents()) {
|
||||
System.out.println(ev);
|
||||
if (ev.getType()==GHEvent.PULL_REQUEST) {
|
||||
GHEventPayload.PullRequest pr = ev.getPayload(GHEventPayload.PullRequest.class);
|
||||
System.out.println(pr.getNumber());
|
||||
System.out.println(pr.getPullRequest());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testApp() throws IOException {
|
||||
System.out.println(gitHub.getMyself().getEmails());
|
||||
|
||||
// GHRepository r = gitHub.getOrganization("jenkinsci").createRepository("kktest4", "Kohsuke's test", "http://kohsuke.org/", "Everyone", true);
|
||||
// r.fork();
|
||||
|
||||
// tryDisablingIssueTrackers(gitHub);
|
||||
|
||||
// tryDisablingWiki(gitHub);
|
||||
|
||||
// GHPullRequest i = gitHub.getOrganization("jenkinsci").getRepository("sandbox").getPullRequest(1);
|
||||
// for (GHIssueComment c : i.getComments())
|
||||
// System.out.println(c);
|
||||
// System.out.println(i);
|
||||
|
||||
// gitHub.getMyself().getRepository("perforce-plugin").setEmailServiceHook("kk@kohsuke.org");
|
||||
|
||||
// tryRenaming(gitHub);
|
||||
// tryOrgFork(gitHub);
|
||||
|
||||
// testOrganization(gitHub);
|
||||
// testPostCommitHook(gitHub);
|
||||
|
||||
// tryTeamCreation(gitHub);
|
||||
|
||||
// t.add(gitHub.getMyself());
|
||||
// System.out.println(t.getMembers());
|
||||
// t.remove(gitHub.getMyself());
|
||||
// System.out.println(t.getMembers());
|
||||
|
||||
// GHRepository r = gitHub.getOrganization("HudsonLabs").createRepository("auto-test", "some description", "http://kohsuke.org/", "Plugin Developers", true);
|
||||
|
||||
// r.
|
||||
// GitHub hub = GitHub.connectAnonymously();
|
||||
//// hub.createRepository("test","test repository",null,true);
|
||||
//// hub.getUser("kohsuke").getRepository("test").delete();
|
||||
//
|
||||
// System.out.println(hub.getUser("kohsuke").getRepository("hudson").getCollaborators());
|
||||
}
|
||||
|
||||
private void tryDisablingIssueTrackers(GitHub gitHub) throws IOException {
|
||||
for (GHRepository r : gitHub.getOrganization("jenkinsci").getRepositories().values()) {
|
||||
if (r.hasIssues()) {
|
||||
if (r.getOpenIssueCount()==0) {
|
||||
System.out.println("DISABLED "+r.getName());
|
||||
r.enableIssueTracker(false);
|
||||
} else {
|
||||
System.out.println("UNTOUCHED "+r.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void tryDisablingWiki(GitHub gitHub) throws IOException {
|
||||
for (GHRepository r : gitHub.getOrganization("jenkinsci").getRepositories().values()) {
|
||||
if (r.hasWiki()) {
|
||||
System.out.println("DISABLED "+r.getName());
|
||||
r.enableWiki(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void tryUpdatingIssueTracker(GitHub gitHub) throws IOException {
|
||||
GHRepository r = gitHub.getOrganization("jenkinsci").getRepository("lib-task-reactor");
|
||||
System.out.println(r.hasIssues());
|
||||
System.out.println(r.getOpenIssueCount());
|
||||
r.enableIssueTracker(false);
|
||||
}
|
||||
|
||||
private void tryRenaming(GitHub gitHub) throws IOException {
|
||||
gitHub.getUser("kohsuke").getRepository("test").renameTo("test2");
|
||||
}
|
||||
|
||||
private void tryTeamCreation(GitHub gitHub) throws IOException {
|
||||
GHOrganization o = gitHub.getOrganization("HudsonLabs");
|
||||
GHTeam t = o.createTeam("auto team", Permission.PUSH);
|
||||
t.add(o.getRepository("auto-test"));
|
||||
}
|
||||
|
||||
private void testPostCommitHook(GitHub gitHub) throws IOException {
|
||||
GHRepository r = gitHub.getMyself().getRepository("foo");
|
||||
Set<URL> hooks = r.getPostCommitHooks();
|
||||
hooks.add(new URL("http://kohsuke.org/test"));
|
||||
System.out.println(hooks);
|
||||
hooks.remove(new URL("http://kohsuke.org/test"));
|
||||
System.out.println(hooks);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrgRepositories() throws IOException {
|
||||
kohsuke();
|
||||
GHOrganization j = gitHub.getOrganization("jenkinsci");
|
||||
long start = System.currentTimeMillis();
|
||||
Map<String, GHRepository> repos = j.getRepositories();
|
||||
long end = System.currentTimeMillis();
|
||||
System.out.printf("%d repositories in %dms\n", repos.size(), end - start);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrganization() throws IOException {
|
||||
kohsuke();
|
||||
GHOrganization j = gitHub.getOrganization("github-api-test-org");
|
||||
GHTeam t = j.getTeams().get("Core Developers");
|
||||
|
||||
assertNotNull(j.getRepository("jenkins"));
|
||||
|
||||
// t.add(labs.getRepository("xyz"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCommitStatus() throws Exception {
|
||||
GHRepository r = gitHub.getRepository("kohsuke/github-api");
|
||||
|
||||
GHCommitStatus state;
|
||||
|
||||
// state = r.createCommitStatus("ecbfdd7315ef2cf04b2be7f11a072ce0bd00c396", GHCommitState.FAILURE, "http://kohsuke.org/", "testing!");
|
||||
|
||||
List<GHCommitStatus> lst = r.listCommitStatuses("ecbfdd7315ef2cf04b2be7f11a072ce0bd00c396").asList();
|
||||
state = lst.get(0);
|
||||
System.out.println(state);
|
||||
assertEquals("testing!",state.getDescription());
|
||||
assertEquals("http://kohsuke.org/", state.getTargetUrl());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCommitShortInfo() throws Exception {
|
||||
GHRepository r = gitHub.getRepository("kohsuke/github-api");
|
||||
GHCommit commit = r.getCommit("86a2e245aa6d71d54923655066049d9e21a15f23");
|
||||
assertEquals(commit.getCommitShortInfo().getAuthor().getName(), "Kohsuke Kawaguchi");
|
||||
assertEquals(commit.getCommitShortInfo().getMessage(), "doc");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPullRequestPopulate() throws Exception {
|
||||
GHRepository r = gitHub.getUser("kohsuke").getRepository("github-api");
|
||||
GHPullRequest p = r.getPullRequest(17);
|
||||
GHUser u = p.getUser();
|
||||
assertNotNull(u.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckMembership() throws Exception {
|
||||
kohsuke();
|
||||
GHOrganization j = gitHub.getOrganization("jenkinsci");
|
||||
GHUser kohsuke = gitHub.getUser("kohsuke");
|
||||
GHUser b = gitHub.getUser("b");
|
||||
|
||||
assertTrue(j.hasMember(kohsuke));
|
||||
assertFalse(j.hasMember(b));
|
||||
|
||||
assertTrue(j.hasPublicMember(kohsuke));
|
||||
assertFalse(j.hasPublicMember(b));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateRelease() throws Exception {
|
||||
kohsuke();
|
||||
|
||||
GHRepository r = gitHub.getRepository("kohsuke2/testCreateRelease");
|
||||
|
||||
String tagName = UUID.randomUUID().toString();
|
||||
String releaseName = "release-" + tagName;
|
||||
|
||||
GHRelease rel = r.createRelease(tagName)
|
||||
.name(releaseName)
|
||||
.prerelease(false)
|
||||
.create();
|
||||
|
||||
try {
|
||||
|
||||
for (GHTag tag : r.listTags()) {
|
||||
if (tagName.equals(tag.getName())) {
|
||||
String ash = tag.getCommit().getSHA1();
|
||||
GHRef ref = r.createRef("refs/heads/"+releaseName, ash);
|
||||
assertEquals(ref.getRef(),"refs/heads/"+releaseName);
|
||||
|
||||
for (Map.Entry<String, GHBranch> entry : r.getBranches().entrySet()) {
|
||||
System.out.println(entry.getKey() + "/" + entry.getValue());
|
||||
if (releaseName.equals(entry.getValue().getName())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
fail("branch not found");
|
||||
}
|
||||
}
|
||||
fail("release creation failed! tag not found");
|
||||
} finally {
|
||||
rel.delete();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRef() throws IOException {
|
||||
GHRef masterRef = gitHub.getRepository("jenkinsci/jenkins").getRef("heads/master");
|
||||
assertEquals("https://api.github.com/repos/jenkinsci/jenkins/git/refs/heads/master", masterRef.getUrl().toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void directoryListing() throws IOException {
|
||||
List<GHContent> children = gitHub.getRepository("jenkinsci/jenkins").getDirectoryContent("core");
|
||||
for (GHContent c : children) {
|
||||
System.out.println(c.getName());
|
||||
if (c.isDirectory()) {
|
||||
for (GHContent d : c.listDirectoryContent()) {
|
||||
System.out.println(" "+d.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddDeployKey() throws IOException {
|
||||
GHRepository myRepository = Iterables.get(gitHub.getMyself().getRepositories().values(),0);
|
||||
final GHDeployKey newDeployKey = myRepository.addDeployKey("test", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUt0RAycC5cS42JKh6SecfFZBR1RrF+2hYMctz4mk74/arBE+wFb7fnSHGzdGKX2h5CFOWODifRCJVhB7hlVxodxe+QkQQYAEL/x1WVCJnGgTGQGOrhOMj95V3UE5pQKhsKD608C+u5tSofcWXLToP1/wZ7U4/AHjqYi08OLsWToHCax55TZkvdt2jo0hbIoYU+XI9Q8Uv4ONDN1oabiOdgeKi8+crvHAuvNleiBhWVBzFh8KdfzaH5uNdw7ihhFjEd1vzqACsjCINCjdMfzl6jD9ExuWuE92nZJnucls2cEoNC6k2aPmrZDg9hA32FXVpyseY+bDUWFU6LO2LG6PB kohsuke@atlas");
|
||||
try {
|
||||
assertNotNull(newDeployKey.getId());
|
||||
|
||||
GHDeployKey k = Iterables.find(myRepository.getDeployKeys(), new Predicate<GHDeployKey>() {
|
||||
public boolean apply(GHDeployKey deployKey) {
|
||||
return newDeployKey.getId() == deployKey.getId();
|
||||
}
|
||||
});
|
||||
assertNotNull(k);
|
||||
} finally {
|
||||
newDeployKey.delete();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCommitStatusContext() throws IOException {
|
||||
GHRepository myRepository = Iterables.get(gitHub.getMyself().getRepositories().values(), 0);
|
||||
GHRef masterRef = myRepository.getRef("heads/master");
|
||||
GHCommitStatus commitStatus = myRepository.createCommitStatus(masterRef.getObject().getSha(), GHCommitState.SUCCESS, "http://www.example.com", "test", "test/context");
|
||||
assertEquals("test/context", commitStatus.getContext());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMemberPagenation() throws IOException {
|
||||
Set<GHUser> all = new HashSet<GHUser>();
|
||||
for (GHUser u : gitHub.getOrganization("github-api-test-org").getTeamByName("Core Developers").listMembers()) {
|
||||
System.out.println(u.getLogin());
|
||||
all.add(u);
|
||||
}
|
||||
assertFalse(all.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIssueSearch() throws IOException {
|
||||
PagedSearchIterable<GHIssue> r = gitHub.searchIssues().mentions("kohsuke").isOpen().list();
|
||||
for (GHIssue i : r) {
|
||||
System.out.println(i.getTitle());
|
||||
}
|
||||
}
|
||||
|
||||
@Test // issue #99
|
||||
public void testReadme() throws IOException {
|
||||
GHContent readme = gitHub.getRepository("github-api-test-org/test-readme").getReadme();
|
||||
assertEquals(readme.getName(),"README.md");
|
||||
assertEquals(readme.getContent(),"This is a markdown readme.\n");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRepoLabel() throws IOException {
|
||||
GHRepository r = gitHub.getRepository("github-api-test-org/test-labels");
|
||||
List<GHLabel> lst = r.listLabels().asList();
|
||||
for (GHLabel l : lst) {
|
||||
System.out.println(l.getName());
|
||||
}
|
||||
assertTrue(lst.size() > 5);
|
||||
GHLabel e = r.getLabel("enhancement");
|
||||
assertEquals("enhancement",e.getName());
|
||||
assertNotNull(e.getUrl());
|
||||
assertTrue(Pattern.matches("[0-9a-fA-F]{6}",e.getColor()));
|
||||
|
||||
{// CRUD
|
||||
GHLabel t = r.createLabel("test", "123456");
|
||||
GHLabel t2 = r.getLabel("test");
|
||||
assertEquals(t.getName(), t2.getName());
|
||||
assertEquals(t.getColor(), "123456");
|
||||
assertEquals(t.getColor(), t2.getColor());
|
||||
assertEquals(t.getUrl(), t2.getUrl());
|
||||
t.delete();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSubscribers() throws IOException {
|
||||
boolean kohsuke = false;
|
||||
GHRepository mr = gitHub.getRepository("kohsuke/github-api");
|
||||
for (GHUser u : mr.listSubscribers()) {
|
||||
System.out.println(u.getLogin());
|
||||
kohsuke |= u.getLogin().equals("kohsuke");
|
||||
}
|
||||
assertTrue(kohsuke);
|
||||
System.out.println("---");
|
||||
|
||||
boolean githubApi = false;
|
||||
for (GHRepository r : gitHub.getUser("kohsuke").listRepositories()) {
|
||||
System.out.println(r.getName());
|
||||
githubApi |= r.equals(mr);
|
||||
}
|
||||
assertTrue(githubApi);
|
||||
}
|
||||
|
||||
private void kohsuke() {
|
||||
String login = getUser().getLogin();
|
||||
Assume.assumeTrue(login.equals("kohsuke") || login.equals("kohsuke2"));
|
||||
}
|
||||
}
|
||||
16
src/test/java/org/kohsuke/github/CommitTest.java
Normal file
16
src/test/java/org/kohsuke/github/CommitTest.java
Normal file
@@ -0,0 +1,16 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class CommitTest extends AbstractGitHubApiTestBase {
|
||||
@Test // issue 152
|
||||
public void lastStatus() throws IOException {
|
||||
GHTag t = gitHub.getRepository("stapler/stapler").listTags().iterator().next();
|
||||
t.getCommit().getLastStatus();
|
||||
}
|
||||
}
|
||||
@@ -1,28 +1,26 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Integration test for {@link GHContent}.
|
||||
*/
|
||||
public class GHContentIntegrationTest extends TestCase {
|
||||
public class GHContentIntegrationTest extends AbstractGitHubApiTestBase {
|
||||
|
||||
private GitHub gitHub;
|
||||
private GHRepository repo;
|
||||
private String createdFilename;
|
||||
private String createdFilename = rnd.next();
|
||||
|
||||
@Before
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
gitHub = GitHub.connect();
|
||||
repo = gitHub.getRepository("acollign/github-api-test").fork();
|
||||
createdFilename = UUID.randomUUID().toString();
|
||||
repo = gitHub.getRepository("github-api-test-org/GHContentIntegrationTest").fork();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetFileContent() throws Exception {
|
||||
GHContent content = repo.getFileContent("ghcontent-ro/a-file-with-content");
|
||||
|
||||
@@ -30,6 +28,7 @@ public class GHContentIntegrationTest extends TestCase {
|
||||
assertEquals("thanks for reading me\n", content.getContent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetEmptyFileContent() throws Exception {
|
||||
GHContent content = repo.getFileContent("ghcontent-ro/an-empty-file");
|
||||
|
||||
@@ -37,12 +36,14 @@ public class GHContentIntegrationTest extends TestCase {
|
||||
assertEquals("", content.getContent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDirectoryContent() throws Exception {
|
||||
List<GHContent> entries = repo.getDirectoryContent("ghcontent-ro/a-dir-with-3-entries");
|
||||
|
||||
assertTrue(entries.size() == 3);
|
||||
}
|
||||
|
||||
@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);
|
||||
GHContent createdContent = created.getContent();
|
||||
|
||||
73
src/test/java/org/kohsuke/github/GistTest.java
Normal file
73
src/test/java/org/kohsuke/github/GistTest.java
Normal file
@@ -0,0 +1,73 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class GistTest extends AbstractGitHubApiTestBase {
|
||||
/**
|
||||
* CRUD operation.
|
||||
*/
|
||||
@Test
|
||||
public void lifecycleTest() throws Exception {
|
||||
GHGist gist = gitHub.createGist()
|
||||
.public_(false)
|
||||
.description("Test Gist")
|
||||
.file("abc.txt","abc")
|
||||
.file("def.txt","def")
|
||||
.create();
|
||||
|
||||
assertNotNull(gist.getCreatedAt());
|
||||
assertNotNull(gist.getUpdatedAt());
|
||||
|
||||
assertNotNull(gist.getCommentsUrl());
|
||||
assertNotNull(gist.getCommitsUrl());
|
||||
assertNotNull(gist.getGitPullUrl());
|
||||
assertNotNull(gist.getGitPushUrl());
|
||||
assertNotNull(gist.getHtmlUrl());
|
||||
|
||||
gist.delete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void starTest() throws Exception {
|
||||
GHGist gist = gitHub.getGist("9903708");
|
||||
assertEquals("rtyler",gist.getOwner().getLogin());
|
||||
|
||||
gist.star();
|
||||
assertTrue(gist.isStarred());
|
||||
gist.unstar();
|
||||
assertFalse(gist.isStarred());
|
||||
|
||||
GHGist newGist = gist.fork();
|
||||
|
||||
try {
|
||||
for (GHGist g : gist.listForks()) {
|
||||
if (g.equals(newGist)) {
|
||||
// expected to find it in the clone list
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
fail("Expected to find a newly cloned gist");
|
||||
} finally {
|
||||
newGist.delete();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void gistFile() throws Exception {
|
||||
GHGist gist = gitHub.getGist("9903708");
|
||||
|
||||
assertTrue(gist.isPublic());
|
||||
|
||||
assertEquals(1,gist.getFiles().size());
|
||||
GHGistFile f = gist.getFile("keybase.md");
|
||||
|
||||
assertEquals("text/plain", f.getType());
|
||||
assertEquals("Markdown", f.getLanguage());
|
||||
assertTrue(f.getContent().contains("### Keybase proof"));
|
||||
assertNotNull(f.getContent());
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,12 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
@@ -21,4 +28,85 @@ public class GitHubTest extends TestCase {
|
||||
GitHub hub = GitHub.connectUsingPassword("kohsuke", "bogus");
|
||||
assertEquals("https://api.github.com/test", hub.getApiURL("/test").toString());
|
||||
}
|
||||
|
||||
public void testGitHubBuilderFromEnvironment() throws IOException {
|
||||
|
||||
Map<String, String>props = new HashMap<String, String>();
|
||||
|
||||
props.put("login", "bogus");
|
||||
props.put("oauth", "bogus");
|
||||
props.put("password", "bogus");
|
||||
|
||||
setupEnvironment(props);
|
||||
|
||||
GitHubBuilder builder = GitHubBuilder.fromEnvironment();
|
||||
|
||||
assertEquals("bogus", builder.user);
|
||||
assertEquals("bogus", builder.oauthToken);
|
||||
assertEquals("bogus", builder.password);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Copied from StackOverflow: http://stackoverflow.com/a/7201825/2336755
|
||||
*
|
||||
* This allows changing the in memory process environment.
|
||||
*
|
||||
* Its used to wire in values for the github credentials to test that the GitHubBuilder works properly to resolve them.
|
||||
*/
|
||||
private void setupEnvironment(Map<String, String> newenv) {
|
||||
try
|
||||
{
|
||||
Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment");
|
||||
Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment");
|
||||
theEnvironmentField.setAccessible(true);
|
||||
Map<String, String> env = (Map<String, String>) theEnvironmentField.get(null);
|
||||
env.putAll(newenv);
|
||||
Field theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
|
||||
theCaseInsensitiveEnvironmentField.setAccessible(true);
|
||||
Map<String, String> cienv = (Map<String, String>) theCaseInsensitiveEnvironmentField.get(null);
|
||||
cienv.putAll(newenv);
|
||||
}
|
||||
catch (NoSuchFieldException e)
|
||||
{
|
||||
try {
|
||||
Class[] classes = Collections.class.getDeclaredClasses();
|
||||
Map<String, String> env = System.getenv();
|
||||
for(Class cl : classes) {
|
||||
if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
|
||||
Field field = cl.getDeclaredField("m");
|
||||
field.setAccessible(true);
|
||||
Object obj = field.get(env);
|
||||
Map<String, String> map = (Map<String, String>) obj;
|
||||
map.clear();
|
||||
map.putAll(newenv);
|
||||
}
|
||||
}
|
||||
} catch (Exception e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
} catch (Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void testGitHubBuilderFromCustomEnvironment() throws IOException {
|
||||
|
||||
Map<String, String>props = new HashMap<String, String>();
|
||||
|
||||
props.put("customLogin", "bogusLogin");
|
||||
props.put("customOauth", "bogusOauth");
|
||||
props.put("customPassword", "bogusPassword");
|
||||
|
||||
setupEnvironment(props);
|
||||
|
||||
GitHubBuilder builder = GitHubBuilder.fromEnvironment("customLogin", "customPassword", "customOauth");
|
||||
|
||||
assertEquals("bogusLogin", builder.user);
|
||||
assertEquals("bogusOauth", builder.oauthToken);
|
||||
assertEquals("bogusPassword", builder.password);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,18 +1,11 @@
|
||||
package org.kohsuke;
|
||||
package org.kohsuke.github;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.eclipse.jgit.api.Git;
|
||||
import org.eclipse.jgit.api.errors.GitAPIException;
|
||||
import org.eclipse.jgit.dircache.DirCache;
|
||||
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
|
||||
import org.kohsuke.github.GHAsset;
|
||||
import org.kohsuke.github.GHIssue;
|
||||
import org.kohsuke.github.GHMilestone;
|
||||
import org.kohsuke.github.GHMyself;
|
||||
import org.kohsuke.github.GHRelease;
|
||||
import org.kohsuke.github.GHRepository;
|
||||
import org.kohsuke.github.GitHub;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@@ -22,23 +15,19 @@ import java.io.PrintWriter;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
public class LifecycleTest extends TestCase {
|
||||
private GitHub gitHub;
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
gitHub = GitHub.connect();
|
||||
}
|
||||
|
||||
public void testCreateRepository() throws IOException, GitAPIException {
|
||||
public class LifecycleTest extends AbstractGitHubApiTestBase {
|
||||
@Test
|
||||
public void testCreateRepository() throws IOException, GitAPIException, InterruptedException {
|
||||
GHMyself myself = gitHub.getMyself();
|
||||
GHRepository repository = myself.getRepository("github-api-test");
|
||||
GHOrganization org = gitHub.getOrganization("github-api-test-org");
|
||||
GHRepository repository = org.getRepository("github-api-test");
|
||||
if (repository != null) {
|
||||
repository.delete();
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
repository = gitHub.createRepository("github-api-test",
|
||||
"a test repository used to test kohsuke's github-api", "http://github-api.kohsuke.org/", true);
|
||||
repository = org.createRepository("github-api-test",
|
||||
"a test repository used to test kohsuke's github-api", "http://github-api.kohsuke.org/", "Core Developers", true);
|
||||
Thread.sleep(1000); // wait for the repository to become ready
|
||||
|
||||
assertTrue(repository.getReleases().isEmpty());
|
||||
try {
|
||||
@@ -53,7 +42,7 @@ public class LifecycleTest extends TestCase {
|
||||
delete(repoDir);
|
||||
Git origin = Git.cloneRepository()
|
||||
.setBare(false)
|
||||
.setURI(repository.gitHttpTransportUrl())
|
||||
.setURI(repository.getSshUrl())
|
||||
.setDirectory(repoDir)
|
||||
.setCredentialsProvider(getCredentialsProvider(myself))
|
||||
.call();
|
||||
67
src/test/java/org/kohsuke/github/PullRequestTest.java
Normal file
67
src/test/java/org/kohsuke/github/PullRequestTest.java
Normal file
@@ -0,0 +1,67 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class PullRequestTest extends AbstractGitHubApiTestBase {
|
||||
@Test
|
||||
public void createPullRequest() throws Exception {
|
||||
String name = rnd.next();
|
||||
GHPullRequest p = getRepository().createPullRequest(name, "stable", "master", "## test");
|
||||
System.out.println(p.getUrl());
|
||||
assertEquals(name, p.getTitle());
|
||||
}
|
||||
|
||||
@Test // Requires push access to the test repo to pass
|
||||
public void setLabels() throws Exception {
|
||||
GHPullRequest p = getRepository().createPullRequest(rnd.next(), "stable", "master", "## test");
|
||||
String label = rnd.next();
|
||||
p.setLabels(label);
|
||||
|
||||
Collection<GHLabel> labels = getRepository().getPullRequest(p.getNumber()).getLabels();
|
||||
assertEquals(1, labels.size());
|
||||
assertEquals(label, labels.iterator().next().getName());
|
||||
}
|
||||
|
||||
@Test // Requires push access to the test repo to pass
|
||||
public void setAssignee() throws Exception {
|
||||
GHPullRequest p = getRepository().createPullRequest(rnd.next(), "stable", "master", "## test");
|
||||
GHMyself user = gitHub.getMyself();
|
||||
p.assignTo(user);
|
||||
|
||||
assertEquals(user, getRepository().getPullRequest(p.getNumber()).getAssignee());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetUser() throws IOException {
|
||||
GHPullRequest p = getRepository().createPullRequest(rnd.next(), "stable", "master", "## test");
|
||||
GHPullRequest prSingle = getRepository().getPullRequest(p.getNumber());
|
||||
assertNotNull(prSingle.getUser().root);
|
||||
prSingle.getMergeable();
|
||||
assertNotNull(prSingle.getUser().root);
|
||||
|
||||
PagedIterable<GHPullRequest> ghPullRequests = getRepository().listPullRequests(GHIssueState.OPEN);
|
||||
for (GHPullRequest pr : ghPullRequests) {
|
||||
assertNotNull(pr.getUser().root);
|
||||
assertFalse(pr.getMergeable());
|
||||
assertNotNull(pr.getUser().root);
|
||||
}
|
||||
}
|
||||
|
||||
@After
|
||||
public void cleanUp() throws Exception {
|
||||
for (GHPullRequest pr : getRepository().getPullRequests(GHIssueState.OPEN)) {
|
||||
pr.close();
|
||||
}
|
||||
}
|
||||
|
||||
private GHRepository getRepository() throws IOException {
|
||||
return gitHub.getOrganization("github-api-test-org").getRepository("jenkins");
|
||||
}
|
||||
}
|
||||
89
src/test/java/org/kohsuke/github/RepositoryMockTest.java
Normal file
89
src/test/java/org/kohsuke/github/RepositoryMockTest.java
Normal file
@@ -0,0 +1,89 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* @author Luciano P. Sabenca (luciano.sabenca [at] movile [com] | lucianosabenca [at] gmail [dot] com
|
||||
*/
|
||||
public class RepositoryMockTest {
|
||||
|
||||
@Mock
|
||||
GitHub mockGitHub;
|
||||
|
||||
@Mock
|
||||
Iterator<GHUser[]> iterator;
|
||||
|
||||
@Mock
|
||||
GHRepository mockRepository;
|
||||
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void listCollaborators() throws Exception {
|
||||
GHUser user1 = new GHUser();
|
||||
user1.login = "login1";
|
||||
|
||||
GHUser user2 = new GHUser();
|
||||
user2.login = "login2";
|
||||
|
||||
|
||||
when(iterator.hasNext()).thenReturn(true, false, true);
|
||||
when(iterator.next()).thenReturn(new GHUser[]{user1}, new GHUser[]{user2});
|
||||
|
||||
Requester requester = Mockito.mock(Requester.class);
|
||||
when(mockGitHub.retrieve()).thenReturn(requester);
|
||||
|
||||
|
||||
when(requester.asIterator("/repos/*/*/collaborators",
|
||||
GHUser[].class)).thenReturn(iterator, iterator);
|
||||
|
||||
|
||||
PagedIterable<GHUser> pagedIterable = Mockito.mock(PagedIterable.class);
|
||||
when(mockRepository.listCollaborators()).thenReturn(pagedIterable);
|
||||
|
||||
PagedIterator<GHUser> userPagedIterator = new PagedIterator<GHUser>(iterator) {
|
||||
@Override
|
||||
protected void wrapUp(GHUser[] page) {
|
||||
|
||||
}
|
||||
};
|
||||
PagedIterator<GHUser> userPagedIterator2 = new PagedIterator<GHUser>(iterator) {
|
||||
@Override
|
||||
protected void wrapUp(GHUser[] page) {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
when(pagedIterable.iterator()).thenReturn(userPagedIterator, userPagedIterator2);
|
||||
|
||||
Iterator<GHUser> returnIterator1 = mockRepository.listCollaborators().iterator();
|
||||
|
||||
|
||||
Assert.assertTrue(returnIterator1.hasNext());
|
||||
GHUser user = returnIterator1.next();
|
||||
Assert.assertEquals(user, user1);
|
||||
Assert.assertFalse(returnIterator1.hasNext());
|
||||
|
||||
|
||||
Iterator returnIterator2 = mockRepository.listCollaborators().iterator();
|
||||
|
||||
|
||||
Assert.assertTrue(returnIterator2.hasNext());
|
||||
user = returnIterator1.next();
|
||||
Assert.assertEquals(user, user2);
|
||||
}
|
||||
}
|
||||
46
src/test/java/org/kohsuke/github/RepositoryTest.java
Normal file
46
src/test/java/org/kohsuke/github/RepositoryTest.java
Normal file
@@ -0,0 +1,46 @@
|
||||
package org.kohsuke.github;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.kohsuke.github.GHRepository.Contributor;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class RepositoryTest extends AbstractGitHubApiTestBase {
|
||||
@Test
|
||||
public void subscription() throws Exception {
|
||||
GHRepository r = getRepository();
|
||||
assertNull(r.getSubscription());
|
||||
|
||||
GHSubscription s = r.subscribe(true, false);
|
||||
assertEquals(s.getRepository(), r);
|
||||
|
||||
s.delete();
|
||||
|
||||
assertNull(r.getSubscription());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void listContributors() throws IOException {
|
||||
GHRepository r = gitHub.getOrganization("stapler").getRepository("stapler");
|
||||
int i=0;
|
||||
boolean kohsuke = false;
|
||||
|
||||
for (Contributor c : r.listContributors()) {
|
||||
System.out.println(c.getName());
|
||||
assertTrue(c.getContributions()>0);
|
||||
if (c.getLogin().equals("kohsuke"))
|
||||
kohsuke = true;
|
||||
if (i++ > 5)
|
||||
break;
|
||||
}
|
||||
|
||||
assertTrue(kohsuke);
|
||||
}
|
||||
|
||||
private GHRepository getRepository() throws IOException {
|
||||
return gitHub.getOrganization("github-api-test-org").getRepository("jenkins");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user