diff --git a/pom.xml b/pom.xml index fffadeffd9..bc4e873120 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ github-api - 1.89 + 1.90 GitHub API for Java http://github-api.kohsuke.org/ GitHub API for Java @@ -16,7 +16,7 @@ scm:git:git@github.com/kohsuke/${project.artifactId}.git scm:git:ssh://git@github.com/kohsuke/${project.artifactId}.git http://${project.artifactId}.kohsuke.org/ - github-api-1.89 + github-api-1.90 @@ -64,7 +64,7 @@ com.infradna.tool bridge-method-injector - 1.14 + 1.18 @@ -108,7 +108,7 @@ junit junit - 4.11 + 4.12 test @@ -120,7 +120,7 @@ com.fasterxml.jackson.core jackson-databind - 2.2.3 + 2.9.2 commons-io @@ -130,7 +130,7 @@ com.infradna.tool bridge-method-annotation - 1.14 + 1.17 org.kohsuke.stapler @@ -141,7 +141,7 @@ org.eclipse.jgit org.eclipse.jgit - 3.1.0.201310021548-r + 4.9.0.201710071750-r test @@ -153,25 +153,25 @@ com.squareup.okhttp3 okhttp-urlconnection - 3.4.0 + 3.9.0 true org.kohsuke wordnet-random-name - 1.2 + 1.3 test org.mockito mockito-all - 1.9.5 + 1.10.19 test com.google.code.findbugs annotations - 3.0.0 + 3.0.1 provided diff --git a/src/main/java/org/kohsuke/github/GHDeployment.java b/src/main/java/org/kohsuke/github/GHDeployment.java index 0cef10ee52..42118f3329 100644 --- a/src/main/java/org/kohsuke/github/GHDeployment.java +++ b/src/main/java/org/kohsuke/github/GHDeployment.java @@ -3,6 +3,13 @@ import java.io.IOException; import java.net.URL; +/** + * Represents a deployment + * + * @see documentation + * @see GHRepository#listDeployments(String, String, String, String) + * @see GHRepository#getDeployment(long) + */ public class GHDeployment extends GHObject { private GHRepository owner; private GitHub root; @@ -58,4 +65,23 @@ public String getSha(){ public URL getHtmlUrl() { return null; } + + public GHDeploymentStatusBuilder createStatus(GHDeploymentState state) { + return new GHDeploymentStatusBuilder(owner,id,state); + } + + public PagedIterable listStatuses() { + return new PagedIterable() { + public PagedIterator _iterator(int pageSize) { + return new PagedIterator(root.retrieve().asIterator(statuses_url, GHDeploymentStatus[].class, pageSize)) { + @Override + protected void wrapUp(GHDeploymentStatus[] page) { + for (GHDeploymentStatus c : page) + c.wrap(owner); + } + }; + } + }; + } + } diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java index f028b6f889..821a3e744e 100644 --- a/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java +++ b/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java @@ -2,12 +2,26 @@ import java.io.IOException; +/** + * Creates a new deployment status. + * + * @see + * GHDeployment#createStatus(GHDeploymentState) + */ public class GHDeploymentStatusBuilder { private final Requester builder; private GHRepository repo; - private int deploymentId; + private long deploymentId; + /** + * @deprecated + * Use {@link GHDeployment#createStatus(GHDeploymentState)} + */ public GHDeploymentStatusBuilder(GHRepository repo, int deploymentId, GHDeploymentState state) { + this(repo,(long)deploymentId,state); + } + + /*package*/ GHDeploymentStatusBuilder(GHRepository repo, long deploymentId, GHDeploymentState state) { this.repo = repo; this.deploymentId = deploymentId; this.builder = new Requester(repo.root); @@ -25,6 +39,6 @@ public GHDeploymentStatusBuilder targetUrl(String targetUrl) { } public GHDeploymentStatus create() throws IOException { - return builder.to(repo.getApiTailUrl("deployments")+"/"+deploymentId+"/statuses",GHDeploymentStatus.class).wrap(repo); + return builder.to(repo.getApiTailUrl("deployments/"+deploymentId+"/statuses"),GHDeploymentStatus.class).wrap(repo); } } diff --git a/src/main/java/org/kohsuke/github/GHIssue.java b/src/main/java/org/kohsuke/github/GHIssue.java index 6b416ca1d3..117c06f8d8 100644 --- a/src/main/java/org/kohsuke/github/GHIssue.java +++ b/src/main/java/org/kohsuke/github/GHIssue.java @@ -68,6 +68,7 @@ public class GHIssue extends GHObject implements Reactable{ protected GHIssue.PullRequest pull_request; protected GHMilestone milestone; protected GHUser closed_by; + protected boolean locked; /** * @deprecated use {@link GHLabel} @@ -129,6 +130,10 @@ public String getTitle() { return title; } + public boolean isLocked() { + return locked; + } + public GHIssueState getState() { return Enum.valueOf(GHIssueState.class, state.toUpperCase(Locale.ENGLISH)); } @@ -148,6 +153,14 @@ public URL getApiURL(){ return GitHub.parseURL(url); } + public void lock() throws IOException { + new Requester(root).method("PUT").to(getApiRoute()+"/lock"); + } + + public void unlock() throws IOException { + new Requester(root).method("PUT").to(getApiRoute()+"/lock"); + } + /** * Updates the issue by adding a comment. * diff --git a/src/main/java/org/kohsuke/github/GHLabel.java b/src/main/java/org/kohsuke/github/GHLabel.java index 5d1b3b48a2..3792fdcca3 100644 --- a/src/main/java/org/kohsuke/github/GHLabel.java +++ b/src/main/java/org/kohsuke/github/GHLabel.java @@ -34,4 +34,12 @@ public String getColor() { public void delete() throws IOException { repo.root.retrieve().method("DELETE").to(url); } + + /** + * @param newColor + * 6-letter hex color code, like "f29513" + */ + public void setColor(String newColor) throws IOException { + repo.root.retrieve().method("PATCH").with("name", name).with("color", newColor).to(url); + } } diff --git a/src/main/java/org/kohsuke/github/GHObject.java b/src/main/java/org/kohsuke/github/GHObject.java index 96e41a2559..3b26ed77cc 100644 --- a/src/main/java/org/kohsuke/github/GHObject.java +++ b/src/main/java/org/kohsuke/github/GHObject.java @@ -25,7 +25,7 @@ public abstract class GHObject { protected Map> responseHeaderFields; protected String url; - protected int id; + protected long id; protected String created_at; protected String updated_at; @@ -84,14 +84,18 @@ public Date getUpdatedAt() throws IOException { /** * Unique ID number of this resource. */ - @WithBridgeMethods(value=String.class, adapterMethod="intToString") - public int getId() { + @WithBridgeMethods(value={String.class,int.class}, adapterMethod="longToStringOrInt") + public long getId() { return id; } @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "Bridge method of getId") - private Object intToString(int id, Class type) { - return String.valueOf(id); + private Object longToStringOrInt(long id, Class type) { + if (type==String.class) + return String.valueOf(id); + if (type==int.class) + return (int)id; + throw new AssertionError("Unexpected type: "+type); } @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "Bridge method of getHtmlUrl") diff --git a/src/main/java/org/kohsuke/github/GHPullRequest.java b/src/main/java/org/kohsuke/github/GHPullRequest.java index 6e1a5d90e5..9342623829 100644 --- a/src/main/java/org/kohsuke/github/GHPullRequest.java +++ b/src/main/java/org/kohsuke/github/GHPullRequest.java @@ -50,8 +50,8 @@ public class GHPullRequest extends GHIssue { // details that are only available when obtained from ID private GHUser merged_by; - private int review_comments, additions; - private boolean merged; + private int review_comments, additions, commits; + private boolean merged, maintainer_can_modify; private Boolean mergeable; private int deletions; private String mergeable_state; @@ -167,11 +167,21 @@ public int getAdditions() throws IOException { return additions; } + public int getCommits() throws IOException { + populate(); + return commits; + } + public boolean isMerged() throws IOException { populate(); return merged; } + public boolean canMaintainerModify() throws IOException { + populate(); + return maintainer_can_modify; + } + public Boolean getMergeable() throws IOException { populate(); return mergeable; diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 29cac80d44..4dfd1397bc 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -95,18 +95,12 @@ public GHDeploymentBuilder createDeployment(String ref) { return new GHDeploymentBuilder(this,ref); } - public PagedIterable getDeploymentStatuses(final int id) { - return new PagedIterable() { - public PagedIterator _iterator(int pageSize) { - return new PagedIterator(root.retrieve().asIterator(getApiTailUrl("deployments")+"/"+id+"/statuses", GHDeploymentStatus[].class, pageSize)) { - @Override - protected void wrapUp(GHDeploymentStatus[] page) { - for (GHDeploymentStatus c : page) - c.wrap(GHRepository.this); - } - }; - } - }; + /** + * @deprecated + * Use {@code getDeployment(id).listStatuses()} + */ + public PagedIterable getDeploymentStatuses(final int id) throws IOException { + return getDeployment(id).listStatuses(); } public PagedIterable listDeployments(String sha,String ref,String task,String environment){ @@ -123,7 +117,13 @@ protected void wrapUp(GHDeployment[] page) { }; } }; + } + /** + * Obtains a single {@link GHDeployment} by its ID. + */ + public GHDeployment getDeployment(long id) throws IOException { + return root.retrieve().to("deployments/" + id, GHDeployment.class).wrap(this); } private String join(List params, String joinStr) { @@ -140,8 +140,12 @@ 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); + /** + * @deprecated + * Use {@code getDeployment(deploymentId).createStatus(ghDeploymentState)} + */ + public GHDeploymentStatusBuilder createDeployStatus(int deploymentId, GHDeploymentState ghDeploymentState) throws IOException { + return getDeployment(deploymentId).createStatus(ghDeploymentState); } private static class GHRepoPermission { diff --git a/src/main/java/org/kohsuke/github/GitHub.java b/src/main/java/org/kohsuke/github/GitHub.java index 62c1b4e80c..67fc1f8fe4 100644 --- a/src/main/java/org/kohsuke/github/GitHub.java +++ b/src/main/java/org/kohsuke/github/GitHub.java @@ -166,6 +166,16 @@ public static GitHub connect() throws IOException { return GitHubBuilder.fromCredentials().build(); } + /** + * Version that connects to GitHub Enterprise. + * + * @deprecated + * Use {@link #connectToEnterpriseWithOAuth(String, String, String)} + */ + public static GitHub connectToEnterprise(String apiUrl, String oauthAccessToken) throws IOException { + return connectToEnterpriseWithOAuth(apiUrl,null,oauthAccessToken); + } + /** * Version that connects to GitHub Enterprise. * @@ -174,10 +184,16 @@ public static GitHub connect() throws IOException { * "http://ghe.acme.com/api/v3". Note that GitHub Enterprise has /api/v3 in the URL. * 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 new GitHubBuilder().withEndpoint(apiUrl).withOAuthToken(oauthAccessToken).build(); + public static GitHub connectToEnterpriseWithOAuth(String apiUrl, String login, String oauthAccessToken) throws IOException { + return new GitHubBuilder().withEndpoint(apiUrl).withOAuthToken(oauthAccessToken, login).build(); } + /** + * Version that connects to GitHub Enterprise. + * + * @deprecated + * Use with caution. Login with password is not a preferred method. + */ public static GitHub connectToEnterprise(String apiUrl, String login, String password) throws IOException { return new GitHubBuilder().withEndpoint(apiUrl).withPassword(login, password).build(); } @@ -793,7 +809,7 @@ public PagedIterable listAllPublicRepositories() { * This provides a dump of every public repository, in the order that they were created. * * @param since - * The integer ID of the last Repository that you’ve seen. See {@link GHRepository#getId()} + * The numeric ID of the last Repository that you’ve seen. See {@link GHRepository#getId()} * @see documentation */ public PagedIterable listAllPublicRepositories(final String since) { diff --git a/src/main/java/org/kohsuke/github/GitHubBuilder.java b/src/main/java/org/kohsuke/github/GitHubBuilder.java index 62a99a6272..e54359892c 100644 --- a/src/main/java/org/kohsuke/github/GitHubBuilder.java +++ b/src/main/java/org/kohsuke/github/GitHubBuilder.java @@ -154,6 +154,12 @@ public static GitHubBuilder fromProperties(Properties props) { return self; } + /** + * @param endpoint + * The URL of GitHub (or GitHub enterprise) API endpoint, such as "https://api.github.com" or + * "http://ghe.acme.com/api/v3". Note that GitHub Enterprise has /api/v3 in the URL. + * For historical reasons, this parameter still accepts the bare domain name, but that's considered deprecated. + */ public GitHubBuilder withEndpoint(String endpoint) { this.endpoint = endpoint; return this; diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index 7087920dd7..e069a74edb 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -134,10 +134,10 @@ public void testGetDeploymentStatuses() throws IOException { .description("question") .payload("{\"user\":\"atmos\",\"room_id\":123456}") .create(); - GHDeploymentStatus ghDeploymentStatus = repository.createDeployStatus(deployment.getId(), GHDeploymentState.SUCCESS) + GHDeploymentStatus ghDeploymentStatus = deployment.createStatus(GHDeploymentState.SUCCESS) .description("success") .targetUrl("http://www.github.com").create(); - Iterable deploymentStatuses = repository.getDeploymentStatuses(deployment.getId()); + Iterable deploymentStatuses = deployment.listStatuses(); assertNotNull(deploymentStatuses); assertEquals(1,Iterables.size(deploymentStatuses)); assertEquals(ghDeploymentStatus.getId(), Iterables.get(deploymentStatuses, 0).getId()); @@ -753,6 +753,10 @@ public void testRepoLabel() throws IOException { assertEquals(t.getColor(), "123456"); assertEquals(t.getColor(), t2.getColor()); assertEquals(t.getUrl(), t2.getUrl()); + + t.setColor("000000"); + GHLabel t3 = r.getLabel("test"); + assertEquals(t3.getColor(), "000000"); t.delete(); } } @@ -784,7 +788,7 @@ public void testListAllRepositories() throws Exception { GHRepository r = itr.next(); System.out.println(r.getFullName()); assertNotNull(r.getUrl()); - assertNotEquals(0,r.getId()); + assertNotEquals(0L,r.getId()); } }