From af3099c526e2b434678baf1f95f832e8b531b1ec Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Wed, 8 Oct 2014 12:17:53 -0700 Subject: [PATCH 01/26] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5ab01b8766..2080f84e31 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ github-api - 1.59 + 1.60-SNAPSHOT GitHub API for Java http://github-api.kohsuke.org/ GitHub API for Java From e7262b8fbee1175d6a59bb2ba9f98b2e56d357d2 Mon Sep 17 00:00:00 2001 From: Roberto Tyley Date: Thu, 6 Nov 2014 09:40:37 +0000 Subject: [PATCH 02/26] Add paging support for Team's Repositories The team repositories endpoint does do paging, so gotta support that. --- src/main/java/org/kohsuke/github/GHTeam.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHTeam.java b/src/main/java/org/kohsuke/github/GHTeam.java index 56dafe3978..b8c6b1cb6f 100644 --- a/src/main/java/org/kohsuke/github/GHTeam.java +++ b/src/main/java/org/kohsuke/github/GHTeam.java @@ -68,14 +68,27 @@ public boolean hasMember(GHUser user) { } public Map getRepositories() throws IOException { - GHRepository[] repos = org.root.retrieve().to(api("/repos"), GHRepository[].class); Map m = new TreeMap(); - 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 listRepositories() { + return new PagedIterable() { + public PagedIterator iterator() { + return new PagedIterator(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. * From a7f75c9a6cf2f5a2933a4a8d2c9bab8addcce18c Mon Sep 17 00:00:00 2001 From: Simone Carriero Date: Thu, 6 Nov 2014 12:18:16 +0100 Subject: [PATCH 03/26] added 'diverged' constant to GHCompare.Status enum --- src/main/java/org/kohsuke/github/GHCompare.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/kohsuke/github/GHCompare.java b/src/main/java/org/kohsuke/github/GHCompare.java index d61991fa13..9ca63b6e3b 100644 --- a/src/main/java/org/kohsuke/github/GHCompare.java +++ b/src/main/java/org/kohsuke/github/GHCompare.java @@ -148,6 +148,6 @@ public static class User extends GitUser { } public static enum Status { - behind, ahead, identical + behind, ahead, identical, diverged } } From 3c3d4fc15142e73d3f295845fe05e10899480b0d Mon Sep 17 00:00:00 2001 From: Matt Farmer Date: Sun, 16 Nov 2014 15:31:04 -0500 Subject: [PATCH 04/26] Put mockito in the test scope. --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 2080f84e31..749c8cb24a 100644 --- a/pom.xml +++ b/pom.xml @@ -107,6 +107,7 @@ org.mockito mockito-all 1.9.5 + test From 5121fe1cbfb5364e32308510d92bc2f188f7d985 Mon Sep 17 00:00:00 2001 From: mendeza Date: Thu, 18 Dec 2014 21:03:28 -0800 Subject: [PATCH 05/26] Added binary content support. --- src/main/java/org/kohsuke/github/GHContent.java | 14 +++++++++++--- .../java/org/kohsuke/github/GHRepository.java | 17 +++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHContent.java b/src/main/java/org/kohsuke/github/GHContent.java index 443dd5918d..dbc56a9537 100644 --- a/src/main/java/org/kohsuke/github/GHContent.java +++ b/src/main/java/org/kohsuke/github/GHContent.java @@ -129,11 +129,19 @@ protected void wrapUp(GHContent[] page) { } 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()); + public GHContentUpdateResponse update(String newContent, String commitMessage, String branch) throws IOException { + 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) diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 4e3441166c..740ae21227 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -939,15 +939,24 @@ public GHContent getReadme() throws Exception { return getFileContent("readme"); } - public GHContentUpdateResponse createContent(String content, String commitMessage, String path) throws IOException { - return createContent(content, commitMessage, path, null); + + public GHContentUpdateResponse createContent(String content, String commitMessage, String path) throws IOException { + 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(String content, String commitMessage, String path, String branch) throws IOException { + 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) { From 7e959d6a87dd5ff53a6e3dcd353469e342b5f8c3 Mon Sep 17 00:00:00 2001 From: mendeza Date: Thu, 18 Dec 2014 21:15:29 -0800 Subject: [PATCH 06/26] Added binary content support - without tabs. --- src/main/java/org/kohsuke/github/GHContent.java | 12 ++++++------ src/main/java/org/kohsuke/github/GHRepository.java | 13 ++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHContent.java b/src/main/java/org/kohsuke/github/GHContent.java index dbc56a9537..4900a19214 100644 --- a/src/main/java/org/kohsuke/github/GHContent.java +++ b/src/main/java/org/kohsuke/github/GHContent.java @@ -132,13 +132,13 @@ public GHContentUpdateResponse update(String newContent, String commitMessage) t return update(newContent.getBytes(), commitMessage, null); } - public GHContentUpdateResponse update(String newContent, String commitMessage, String branch) throws IOException { - return update(newContent.getBytes(), commitMessage, branch); - } + public GHContentUpdateResponse update(String newContent, String commitMessage, String branch) throws IOException { + 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) throws IOException { + return update(newContentBytes, commitMessage, null); + } public GHContentUpdateResponse update(byte[] newContentBytes, String commitMessage, String branch) throws IOException { String encodedContent = DatatypeConverter.printBase64Binary(newContentBytes); diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 740ae21227..f3d52f202d 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -939,14 +939,13 @@ public GHContent getReadme() throws Exception { return getFileContent("readme"); } + public GHContentUpdateResponse createContent(String content, String commitMessage, String path) throws IOException { + return createContent(content.getBytes(), commitMessage, path, null); + } - public GHContentUpdateResponse createContent(String content, String commitMessage, String path) throws IOException { - 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(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); From a2fa526aa072756871a503ff2c57c8f01ff23d3d Mon Sep 17 00:00:00 2001 From: Surya Gaddipati Date: Fri, 19 Dec 2014 12:47:00 -0600 Subject: [PATCH 07/26] Add code for creating deployments for a repo --- .../java/org/kohsuke/github/GHDeployment.java | 12 +++++++ .../kohsuke/github/GHDeploymentBuilder.java | 32 +++++++++++++++++++ .../java/org/kohsuke/github/GHRepository.java | 25 +++++---------- src/test/java/org/kohsuke/github/AppTest.java | 31 +++++++++++------- 4 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 src/main/java/org/kohsuke/github/GHDeployment.java create mode 100644 src/main/java/org/kohsuke/github/GHDeploymentBuilder.java diff --git a/src/main/java/org/kohsuke/github/GHDeployment.java b/src/main/java/org/kohsuke/github/GHDeployment.java new file mode 100644 index 0000000000..a6045a32fe --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHDeployment.java @@ -0,0 +1,12 @@ +package org.kohsuke.github; + +public class GHDeployment { + private GHRepository owner; + private GitHub root; + + GHDeployment wrap(GHRepository owner) { + this.owner = owner; + this.root = owner.root; + return this; + } +} diff --git a/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java new file mode 100644 index 0000000000..3a2830befa --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java @@ -0,0 +1,32 @@ +package org.kohsuke.github; + +import java.io.IOException; + +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 ref(String branch) { + builder.with("ref",branch); + return this; + } + + public GHDeploymentBuilder payload(String payload) { + builder.with("payload",payload); + 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); + } +} diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 4e3441166c..204a8004c0 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -25,28 +25,15 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.infradna.tool.bridge_method_injector.WithBridgeMethods; -import java.io.FileNotFoundException; 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 static java.util.Arrays.*; +import java.util.*; + +import static java.util.Arrays.asList; /** * A repository on GitHub. @@ -74,6 +61,10 @@ public class GHRepository { private GHRepoPermission permissions; + public GHDeploymentBuilder createDeployment() { + return new GHDeploymentBuilder(this); + } + private static class GHRepoPermission { boolean pull,push,admin; } diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index 07b386314b..a92b40242f 100644 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -1,22 +1,16 @@ package org.kohsuke.github; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.UUID; - +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import org.junit.Assume; import org.junit.Test; import org.kohsuke.github.GHCommit.File; import org.kohsuke.github.GHOrganization.Permission; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; +import java.io.IOException; +import java.net.URL; +import java.util.*; +import java.util.Map.Entry; /** * Unit test for simple App. @@ -82,6 +76,19 @@ public void testCreateIssue() throws IOException { o.close(); } + @Test + public void testCreateDeployment() throws IOException { + GHUser u = getUser(); + GHRepository repository = getTestRepository(); + //GHMilestone milestone = repository.createMilestone(System.currentTimeMillis() + "", "Test Milestone"); + GHDeployment o = repository.createDeployment() + .ref("master") + .payload("{\"user\":\"atmos\",\"room_id\":123456}") + .description("question") + .create(); + assertNotNull(o); + } + @Test public void testGetIssues() throws Exception { List closedIssues = gitHub.getUser("kohsuke").getRepository("github-api").getIssues(GHIssueState.CLOSED); From bc518a9ae8281edd559cb2b0a0d7036d9b22ab45 Mon Sep 17 00:00:00 2001 From: Surya Gaddipati Date: Sat, 20 Dec 2014 11:52:49 -0600 Subject: [PATCH 08/26] Complete implementation of create deployment api --- .../java/org/kohsuke/github/GHDeployment.java | 44 +++++++++++++++++++ .../kohsuke/github/GHDeploymentBuilder.java | 21 ++++++++- .../java/org/kohsuke/github/GHRepository.java | 4 +- src/test/java/org/kohsuke/github/AppTest.java | 8 ++-- 4 files changed, 69 insertions(+), 8 deletions(-) mode change 100644 => 100755 src/main/java/org/kohsuke/github/GHDeployment.java mode change 100644 => 100755 src/main/java/org/kohsuke/github/GHDeploymentBuilder.java mode change 100644 => 100755 src/main/java/org/kohsuke/github/GHRepository.java mode change 100644 => 100755 src/test/java/org/kohsuke/github/AppTest.java diff --git a/src/main/java/org/kohsuke/github/GHDeployment.java b/src/main/java/org/kohsuke/github/GHDeployment.java old mode 100644 new mode 100755 index a6045a32fe..0a56ccb361 --- a/src/main/java/org/kohsuke/github/GHDeployment.java +++ b/src/main/java/org/kohsuke/github/GHDeployment.java @@ -1,12 +1,56 @@ package org.kohsuke.github; +import java.net.URL; +import java.util.Date; + public class GHDeployment { private GHRepository owner; private GitHub root; + protected String url; + protected String sha; + protected int id; + protected String task; + protected String payload; + protected String environment; + protected String description; + protected String statuses_url; + protected String repository_url; + protected String created_at; + protected String updated_at; + protected GHUser creator; + GHDeployment wrap(GHRepository owner) { this.owner = owner; this.root = owner.root; + if(creator != null) creator.wrapUp(root); return this; } + public Date getCreatedAt() { + return GitHub.parseDate(created_at); + } + + public URL getUrl() { + return GitHub.parseURL(url); + } + + public URL getStatusesUrl() { + return GitHub.parseURL(statuses_url); + } + + public URL getRepositoryUrl() { + return GitHub.parseURL(repository_url); + } + + public GHUser getCreator() { + return creator; + } + + public Date getUpdatedAt() { + return GitHub.parseDate(updated_at); + } + + public int getId() { + return id; + } } diff --git a/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java old mode 100644 new mode 100755 index 3a2830befa..d4b48518a4 --- a/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java +++ b/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java @@ -1,26 +1,45 @@ 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) { + public GHDeploymentBuilder(GHRepository repo, String ref) { this.repo = repo; this.builder = new Requester(repo.root); + 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 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; diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java old mode 100644 new mode 100755 index 204a8004c0..8bed568299 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -61,8 +61,8 @@ public class GHRepository { private GHRepoPermission permissions; - public GHDeploymentBuilder createDeployment() { - return new GHDeploymentBuilder(this); + public GHDeploymentBuilder createDeployment(String ref) { + return new GHDeploymentBuilder(this,ref); } private static class GHRepoPermission { diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java old mode 100644 new mode 100755 index a92b40242f..a3b96e8064 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -78,15 +78,13 @@ public void testCreateIssue() throws IOException { @Test public void testCreateDeployment() throws IOException { - GHUser u = getUser(); GHRepository repository = getTestRepository(); - //GHMilestone milestone = repository.createMilestone(System.currentTimeMillis() + "", "Test Milestone"); - GHDeployment o = repository.createDeployment() - .ref("master") + GHDeployment deployment = repository.createDeployment("master") .payload("{\"user\":\"atmos\",\"room_id\":123456}") .description("question") .create(); - assertNotNull(o); + assertNotNull(deployment.getCreator()); + assertNotNull(deployment.getId()); } @Test From 2f318152d82a5cabb810acc46aa2ebc164a0525f Mon Sep 17 00:00:00 2001 From: Surya Gaddipati Date: Sat, 20 Dec 2014 17:09:59 -0600 Subject: [PATCH 09/26] Complete api implementation for setting/retriving deployment status on a deployment --- .../java/org/kohsuke/github/GHDeployment.java | 21 ++--------- .../org/kohsuke/github/GHDeploymentState.java | 8 +++++ .../kohsuke/github/GHDeploymentStatus.java | 36 +++++++++++++++++++ .../github/GHDeploymentStatusBuilder.java | 30 ++++++++++++++++ .../java/org/kohsuke/github/GHRepository.java | 18 ++++++++++ .../java/org/kohsuke/github/Identifiable.java | 27 ++++++++++++++ src/test/java/org/kohsuke/github/AppTest.java | 16 +++++++++ 7 files changed, 137 insertions(+), 19 deletions(-) create mode 100755 src/main/java/org/kohsuke/github/GHDeploymentState.java create mode 100755 src/main/java/org/kohsuke/github/GHDeploymentStatus.java create mode 100755 src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java create mode 100755 src/main/java/org/kohsuke/github/Identifiable.java diff --git a/src/main/java/org/kohsuke/github/GHDeployment.java b/src/main/java/org/kohsuke/github/GHDeployment.java index 0a56ccb361..7471a03e17 100755 --- a/src/main/java/org/kohsuke/github/GHDeployment.java +++ b/src/main/java/org/kohsuke/github/GHDeployment.java @@ -1,22 +1,19 @@ package org.kohsuke.github; + import java.net.URL; import java.util.Date; -public class GHDeployment { +public class GHDeployment extends Identifiable { private GHRepository owner; private GitHub root; - protected String url; protected String sha; - protected int id; protected String task; protected String payload; protected String environment; protected String description; protected String statuses_url; protected String repository_url; - protected String created_at; - protected String updated_at; protected GHUser creator; @@ -26,13 +23,6 @@ GHDeployment wrap(GHRepository owner) { if(creator != null) creator.wrapUp(root); return this; } - public Date getCreatedAt() { - return GitHub.parseDate(created_at); - } - - public URL getUrl() { - return GitHub.parseURL(url); - } public URL getStatusesUrl() { return GitHub.parseURL(statuses_url); @@ -46,11 +36,4 @@ public GHUser getCreator() { return creator; } - public Date getUpdatedAt() { - return GitHub.parseDate(updated_at); - } - - public int getId() { - return id; - } } diff --git a/src/main/java/org/kohsuke/github/GHDeploymentState.java b/src/main/java/org/kohsuke/github/GHDeploymentState.java new file mode 100755 index 0000000000..ff53a6d490 --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHDeploymentState.java @@ -0,0 +1,8 @@ +package org.kohsuke.github; + +/** + * Represents the state of deployment + */ +public enum GHDeploymentState { + PENDING, SUCCESS, ERROR, FAILURE +} diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java new file mode 100755 index 0000000000..d50d0fe6a1 --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java @@ -0,0 +1,36 @@ +package org.kohsuke.github; + +import java.net.URL; + +public class GHDeploymentStatus extends Identifiable { + 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 GHCommitState getState() { + return GHCommitState.valueOf(state.toUpperCase()); + } + + +} diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java new file mode 100755 index 0000000000..6adf170fad --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java @@ -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); + } +} diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 8bed568299..91bb796d07 100755 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -65,6 +65,24 @@ public GHDeploymentBuilder createDeployment(String ref) { return new GHDeploymentBuilder(this,ref); } + public PagedIterable getDeploymentStatuses(final int id) { + return new PagedIterable() { + public PagedIterator iterator() { + return new PagedIterator(root.retrieve().asIterator(getApiTailUrl("deployments")+"/"+id+"/statuses", GHDeploymentStatus[].class)) { + @Override + protected void wrapUp(GHDeploymentStatus[] page) { + for (GHDeploymentStatus c : page) + c.wrap(GHRepository.this); + } + }; + } + }; + } + + public GHDeploymentStatusBuilder createDeployStatus(int deploymentId, GHDeploymentState ghDeploymentState) { + return new GHDeploymentStatusBuilder(this,deploymentId,ghDeploymentState); + } + private static class GHRepoPermission { boolean pull,push,admin; } diff --git a/src/main/java/org/kohsuke/github/Identifiable.java b/src/main/java/org/kohsuke/github/Identifiable.java new file mode 100755 index 0000000000..1d80fe99ef --- /dev/null +++ b/src/main/java/org/kohsuke/github/Identifiable.java @@ -0,0 +1,27 @@ +package org.kohsuke.github; + +import java.net.URL; +import java.util.Date; + +public class Identifiable { + protected String url; + protected int id; + protected String created_at; + protected String updated_at; + + public Date getCreatedAt() { + return GitHub.parseDate(created_at); + } + + public URL getUrl() { + return GitHub.parseURL(url); + } + + public Date getUpdatedAt() { + return GitHub.parseDate(updated_at); + } + + public int getId() { + return id; + } +} diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index a3b96e8064..399415b3d7 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -87,6 +87,22 @@ public void testCreateDeployment() throws IOException { assertNotNull(deployment.getId()); } + @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 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 closedIssues = gitHub.getUser("kohsuke").getRepository("github-api").getIssues(GHIssueState.CLOSED); From e35667525f09032859136b7a95846003c4edbc55 Mon Sep 17 00:00:00 2001 From: Rob Schoening Date: Sun, 28 Dec 2014 15:19:20 -0800 Subject: [PATCH 10/26] fix #145 GHTeam.getMembers() does not page properly --- src/main/java/org/kohsuke/github/GHTeam.java | 31 ++++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHTeam.java b/src/main/java/org/kohsuke/github/GHTeam.java index b8c6b1cb6f..acdc711cfb 100644 --- a/src/main/java/org/kohsuke/github/GHTeam.java +++ b/src/main/java/org/kohsuke/github/GHTeam.java @@ -2,10 +2,14 @@ import java.io.IOException; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.TreeSet; /** * A team in GitHub organization. @@ -48,12 +52,27 @@ public int getId() { return id; } - /** - * Retrieves the current members. - */ - public Set getMembers() throws IOException { - return new HashSet(Arrays.asList(GHUser.wrap(org.root.retrieve().to(api("/members"), GHUser[].class), org.root))); - } + /** + * Retrieves the current members. + */ + public Set getMembers() throws IOException { + + Set members = new LinkedHashSet(); + + Iterator pageIterator = org.root.retrieve().asIterator(api("/members"), + GHUser[].class); + while (pageIterator != null && pageIterator.hasNext()) { + GHUser[] users = pageIterator.next(); + if (users != null) { + GHUser.wrap(users, org.root); + for (GHUser user : users) { + members.add(user); + } + } + } + + return Collections.unmodifiableSet(members); + } /** * Checks if this team has the specified user as a member. From 5d838940560d5df05a648f3a23eb58875bef9d97 Mon Sep 17 00:00:00 2001 From: Surya Gaddipati Date: Fri, 2 Jan 2015 14:47:02 -0600 Subject: [PATCH 11/26] Add method for listing deployments --- .../java/org/kohsuke/github/GHDeployment.java | 20 ++++++++++-- .../java/org/kohsuke/github/GHRepository.java | 32 +++++++++++++++++++ src/test/java/org/kohsuke/github/AppTest.java | 21 +++++++++++- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHDeployment.java b/src/main/java/org/kohsuke/github/GHDeployment.java index 7471a03e17..753364409d 100755 --- a/src/main/java/org/kohsuke/github/GHDeployment.java +++ b/src/main/java/org/kohsuke/github/GHDeployment.java @@ -2,14 +2,14 @@ import java.net.URL; -import java.util.Date; public class GHDeployment extends Identifiable { private GHRepository owner; private GitHub root; protected String sha; + protected String ref; protected String task; - protected String payload; + protected Object payload; protected String environment; protected String description; protected String statuses_url; @@ -32,8 +32,22 @@ 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; + } } diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 91bb796d07..82c75394ec 100755 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -25,6 +25,7 @@ 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; @@ -79,6 +80,37 @@ protected void wrapUp(GHDeploymentStatus[] page) { }; } + public PagedIterable listDeployments(String sha,String ref,String task,String environment){ + List 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() { + public PagedIterator iterator() { + return new PagedIterator(root.retrieve().asIterator(deploymentsUrl, GHDeployment[].class)) { + @Override + protected void wrapUp(GHDeployment[] page) { + for (GHDeployment c : page) + c.wrap(GHRepository.this); + } + }; + } + }; + + } + + private String join(List 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); } diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index 399415b3d7..361f32445a 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -2,6 +2,7 @@ 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; @@ -87,6 +88,24 @@ public void testCreateDeployment() throws IOException { 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 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(); @@ -100,7 +119,7 @@ public void testGetDeploymentStatuses() throws IOException { Iterable deploymentStatuses = repository.getDeploymentStatuses(deployment.getId()); assertNotNull(deploymentStatuses); assertEquals(1,Iterables.size(deploymentStatuses)); - assertEquals(ghDeploymentStatus.getId(),Iterables.get(deploymentStatuses,0).getId()); + assertEquals(ghDeploymentStatus.getId(), Iterables.get(deploymentStatuses, 0).getId()); } @Test From 58143c26bc592c31f39e50f6daf9a974fa954694 Mon Sep 17 00:00:00 2001 From: Surya Gaddipati Date: Mon, 12 Jan 2015 10:04:01 -0600 Subject: [PATCH 12/26] Use GHCommitState for deployment status state --- src/main/java/org/kohsuke/github/GHDeploymentStatus.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java index d50d0fe6a1..055b3cb700 100755 --- a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java +++ b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java @@ -28,8 +28,8 @@ public URL getDeploymentUrl() { public URL getRepositoryUrl() { return GitHub.parseURL(repository_url); } - public GHCommitState getState() { - return GHCommitState.valueOf(state.toUpperCase()); + public GHDeploymentState getState() { + return GHDeploymentState.valueOf(state.toUpperCase()); } From 052902fb496243f3253f5de4b15b8efedd4fadc3 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 06:40:42 -0800 Subject: [PATCH 13/26] Merge pull request #146 --- src/main/java/org/kohsuke/github/GHTeam.java | 37 ++++++++----------- .../org/kohsuke/github/PagedIterable.java | 13 +++++++ src/test/java/org/kohsuke/github/AppTest.java | 10 +++++ 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHTeam.java b/src/main/java/org/kohsuke/github/GHTeam.java index acdc711cfb..4ec4c7cf87 100644 --- a/src/main/java/org/kohsuke/github/GHTeam.java +++ b/src/main/java/org/kohsuke/github/GHTeam.java @@ -1,15 +1,10 @@ package org.kohsuke.github; import java.io.IOException; -import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.TreeSet; /** * A team in GitHub organization. @@ -55,23 +50,21 @@ public int getId() { /** * Retrieves the current members. */ - public Set getMembers() throws IOException { - - Set members = new LinkedHashSet(); - - Iterator pageIterator = org.root.retrieve().asIterator(api("/members"), - GHUser[].class); - while (pageIterator != null && pageIterator.hasNext()) { - GHUser[] users = pageIterator.next(); - if (users != null) { - GHUser.wrap(users, org.root); - for (GHUser user : users) { - members.add(user); - } - } - } - - return Collections.unmodifiableSet(members); + public PagedIterable listMembers() throws IOException { + return new PagedIterable() { + public PagedIterator iterator() { + return new PagedIterator(org.root.retrieve().asIterator(api("/members"), GHUser[].class)) { + @Override + protected void wrapUp(GHUser[] page) { + GHUser.wrap(page, org.root); + } + }; + } + }; + } + + public Set getMembers() throws IOException { + return Collections.unmodifiableSet(listMembers().asSet()); } /** diff --git a/src/main/java/org/kohsuke/github/PagedIterable.java b/src/main/java/org/kohsuke/github/PagedIterable.java index 7cbfe6dc3d..8085e1ed53 100644 --- a/src/main/java/org/kohsuke/github/PagedIterable.java +++ b/src/main/java/org/kohsuke/github/PagedIterable.java @@ -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 List asList() { } return r; } + + /** + * Eagerly walk {@link Iterable} and return the result in a set. + */ + public Set asSet() { + LinkedHashSet r = new LinkedHashSet(); + for(PagedIterator i = iterator(); i.hasNext();) { + r.addAll(i.nextPage()); + } + return r; + } } diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index a92b40242f..0a86b330d6 100644 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -607,6 +607,16 @@ public void testCommitStatusContext() throws IOException { } + @Test + public void testMemberPagenation() throws IOException { + Set all = new HashSet(); + for (GHUser u : gitHub.getOrganization("github-api-test-org").getTeamByName("Core Developers").listMembers()) { + System.out.println(u.getLogin()); + all.add(u); + } + assertFalse(all.isEmpty()); + } + private void kohsuke() { String login = getUser().getLogin(); Assume.assumeTrue(login.equals("kohsuke") || login.equals("kohsuke2")); From a30c78cd12f04ffb971350a92fd05510949e5a87 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 06:46:27 -0800 Subject: [PATCH 14/26] restored backward compatibility in the public API --- src/main/java/org/kohsuke/github/GHDeploymentBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java index d4b48518a4..00d10fad1b 100755 --- a/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java +++ b/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java @@ -8,9 +8,13 @@ public class GHDeploymentBuilder { private final GHRepository repo; private final Requester builder; - public GHDeploymentBuilder(GHRepository repo, String ref) { + public GHDeploymentBuilder(GHRepository repo) { this.repo = repo; this.builder = new Requester(repo.root); + } + + public GHDeploymentBuilder(GHRepository repo, String ref) { + this(repo); ref(ref); } From 3b6ca3020e611a705813cf132984edb7c874952b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 06:47:52 -0800 Subject: [PATCH 15/26] Pull request #143 introduced wrong file permissions --- src/main/java/org/kohsuke/github/GHDeployment.java | 0 src/main/java/org/kohsuke/github/GHDeploymentBuilder.java | 0 src/main/java/org/kohsuke/github/GHDeploymentState.java | 0 src/main/java/org/kohsuke/github/GHDeploymentStatus.java | 0 src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java | 0 src/main/java/org/kohsuke/github/GHRepository.java | 0 src/main/java/org/kohsuke/github/Identifiable.java | 0 7 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeployment.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeploymentBuilder.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeploymentState.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeploymentStatus.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHRepository.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/Identifiable.java diff --git a/src/main/java/org/kohsuke/github/GHDeployment.java b/src/main/java/org/kohsuke/github/GHDeployment.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHDeploymentState.java b/src/main/java/org/kohsuke/github/GHDeploymentState.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/Identifiable.java b/src/main/java/org/kohsuke/github/Identifiable.java old mode 100755 new mode 100644 From 21ea916e0d52cd33b152f83848bb6170e497308d Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 06:47:52 -0800 Subject: [PATCH 16/26] Pull request #143 introduced wrong file permissions --- src/main/java/org/kohsuke/github/GHDeployment.java | 0 src/main/java/org/kohsuke/github/GHDeploymentBuilder.java | 0 src/main/java/org/kohsuke/github/GHDeploymentState.java | 0 src/main/java/org/kohsuke/github/GHDeploymentStatus.java | 0 src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java | 0 src/main/java/org/kohsuke/github/GHRepository.java | 0 src/main/java/org/kohsuke/github/Identifiable.java | 0 7 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeployment.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeploymentBuilder.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeploymentState.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeploymentStatus.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/GHRepository.java mode change 100755 => 100644 src/main/java/org/kohsuke/github/Identifiable.java diff --git a/src/main/java/org/kohsuke/github/GHDeployment.java b/src/main/java/org/kohsuke/github/GHDeployment.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentBuilder.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHDeploymentState.java b/src/main/java/org/kohsuke/github/GHDeploymentState.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/kohsuke/github/Identifiable.java b/src/main/java/org/kohsuke/github/Identifiable.java old mode 100755 new mode 100644 From 41e0329f55d8cb0138eeb71af7de341a3743a04a Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 06:52:48 -0800 Subject: [PATCH 17/26] doc improvement --- .../java/org/kohsuke/github/Identifiable.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/org/kohsuke/github/Identifiable.java b/src/main/java/org/kohsuke/github/Identifiable.java index 1d80fe99ef..702a4ce86b 100644 --- a/src/main/java/org/kohsuke/github/Identifiable.java +++ b/src/main/java/org/kohsuke/github/Identifiable.java @@ -3,24 +3,39 @@ import java.net.URL; import java.util.Date; +/** + * Most (all?) domain objects in GitHub seems to have these 4 properties. + */ public class Identifiable { protected String url; protected int id; protected String created_at; protected String updated_at; + /** + * When was this resource created? + */ public Date getCreatedAt() { return GitHub.parseDate(created_at); } + /** + * API URL of this object. + */ public URL getUrl() { return GitHub.parseURL(url); } + /** + * When was this resource last updated? + */ public Date getUpdatedAt() { return GitHub.parseDate(updated_at); } + /** + * Unique ID number of this resource. + */ public int getId() { return id; } From edd9a2d5b6057a00afbe1d6c7cf329262713afc3 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 06:59:46 -0800 Subject: [PATCH 18/26] Using newly added GHObject in more places. --- src/main/java/org/kohsuke/github/GHAsset.java | 23 +---- .../org/kohsuke/github/GHAuthorization.java | 18 +--- .../java/org/kohsuke/github/GHDeployment.java | 2 +- .../kohsuke/github/GHDeploymentStatus.java | 2 +- src/main/java/org/kohsuke/github/GHGist.java | 29 +----- src/main/java/org/kohsuke/github/GHHook.java | 11 +-- .../{Identifiable.java => GHObject.java} | 91 ++++++++++--------- .../java/org/kohsuke/github/GHRepository.java | 16 +--- 8 files changed, 61 insertions(+), 131 deletions(-) rename src/main/java/org/kohsuke/github/{Identifiable.java => GHObject.java} (82%) diff --git a/src/main/java/org/kohsuke/github/GHAsset.java b/src/main/java/org/kohsuke/github/GHAsset.java index 902356eebf..fb79e758d6 100644 --- a/src/main/java/org/kohsuke/github/GHAsset.java +++ b/src/main/java/org/kohsuke/github/GHAsset.java @@ -1,26 +1,21 @@ 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() { @@ -32,18 +27,10 @@ public void setContentType(String contentType) throws IOException { 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; } @@ -73,14 +60,6 @@ public String getState() { return state; } - public Date getUpdatedAt() { - return updated_at; - } - - public String getUrl() { - return url; - } - public String getBrowserDownloadUrl() { return browser_download_url; } diff --git a/src/main/java/org/kohsuke/github/GHAuthorization.java b/src/main/java/org/kohsuke/github/GHAuthorization.java index 7fe8fdaf94..b464b9cb68 100644 --- a/src/main/java/org/kohsuke/github/GHAuthorization.java +++ b/src/main/java/org/kohsuke/github/GHAuthorization.java @@ -12,7 +12,7 @@ * @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"; @@ -33,24 +33,16 @@ public class GHAuthorization { public static final String ADMIN_KEY = "admin:public_key"; private GitHub root; - private int id; - private String url; private List 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 getScopes() { return scopes; } @@ -78,14 +70,6 @@ public String getNote() { 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; diff --git a/src/main/java/org/kohsuke/github/GHDeployment.java b/src/main/java/org/kohsuke/github/GHDeployment.java index 753364409d..58fff1a0d4 100644 --- a/src/main/java/org/kohsuke/github/GHDeployment.java +++ b/src/main/java/org/kohsuke/github/GHDeployment.java @@ -3,7 +3,7 @@ import java.net.URL; -public class GHDeployment extends Identifiable { +public class GHDeployment extends GHObject { private GHRepository owner; private GitHub root; protected String sha; diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java index 055b3cb700..d23989b3f6 100644 --- a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java +++ b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java @@ -2,7 +2,7 @@ import java.net.URL; -public class GHDeploymentStatus extends Identifiable { +public class GHDeploymentStatus extends GHObject { private GHRepository owner; private GitHub root; protected GHUser creator; diff --git a/src/main/java/org/kohsuke/github/GHGist.java b/src/main/java/org/kohsuke/github/GHGist.java index 6cfada36d0..6e3f35d989 100644 --- a/src/main/java/org/kohsuke/github/GHGist.java +++ b/src/main/java/org/kohsuke/github/GHGist.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -17,16 +16,16 @@ * @see GitHub#getGist(String) * @see GitHub#createGist() */ -public class GHGist { +public class GHGist extends GHObject { /*package almost final*/ GHUser owner; /*package almost final*/ GitHub root; - private String url, forks_url, commits_url, id, git_pull_url, git_push_url, html_url; + private String forks_url, commits_url, id, git_pull_url, git_push_url, html_url; @JsonProperty("public") private boolean _public; - private String created_at, updated_at, description; + private String description; private int comments; @@ -41,13 +40,6 @@ public GHUser getOwner() { return owner; } - /** - * API URL of this gist, such as 'https://api.github.com/gists/12345' - */ - public String getUrl() { - return url; - } - public String getForksUrl() { return forks_url; } @@ -56,13 +48,6 @@ public String getCommitsUrl() { return commits_url; } - /** - * ID of this gist, such as '12345' - */ - public String getId() { - return id; - } - /** * URL like https://gist.github.com/gists/12345.git */ @@ -82,14 +67,6 @@ public boolean isPublic() { return _public; } - public Date getCreatedAt() { - return GitHub.parseDate(created_at); - } - - public Date getUpdatedAt() { - return GitHub.parseDate(updated_at); - } - public String getDescription() { return description; } diff --git a/src/main/java/org/kohsuke/github/GHHook.java b/src/main/java/org/kohsuke/github/GHHook.java index 4a8ce78b88..7b9c523a05 100644 --- a/src/main/java/org/kohsuke/github/GHHook.java +++ b/src/main/java/org/kohsuke/github/GHHook.java @@ -10,18 +10,17 @@ /** * @author Kohsuke Kawaguchi */ -public 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 events; boolean active; Map config; - int id; - + /*package*/ GHHook wrap(GHRepository owner) { this.repository = owner; return this; @@ -46,10 +45,6 @@ public Map getConfig() { return Collections.unmodifiableMap(config); } - public int getId() { - return id; - } - /** * Deletes this hook. */ diff --git a/src/main/java/org/kohsuke/github/Identifiable.java b/src/main/java/org/kohsuke/github/GHObject.java similarity index 82% rename from src/main/java/org/kohsuke/github/Identifiable.java rename to src/main/java/org/kohsuke/github/GHObject.java index 702a4ce86b..18c7a36827 100644 --- a/src/main/java/org/kohsuke/github/Identifiable.java +++ b/src/main/java/org/kohsuke/github/GHObject.java @@ -1,42 +1,49 @@ -package org.kohsuke.github; - -import java.net.URL; -import java.util.Date; - -/** - * Most (all?) domain objects in GitHub seems to have these 4 properties. - */ -public class Identifiable { - protected String url; - protected int id; - protected String created_at; - protected String updated_at; - - /** - * When was this resource created? - */ - public Date getCreatedAt() { - return GitHub.parseDate(created_at); - } - - /** - * API URL of this object. - */ - public URL getUrl() { - return GitHub.parseURL(url); - } - - /** - * When was this resource last updated? - */ - public Date getUpdatedAt() { - return GitHub.parseDate(updated_at); - } - - /** - * Unique ID number of this resource. - */ - public int getId() { - return id; - } -} +package org.kohsuke.github; + +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? + */ + public Date getCreatedAt() { + return GitHub.parseDate(created_at); + } + + /** + * API URL of this object. + * + * TODO: need to also return String + */ + public URL getUrl() { + return GitHub.parseURL(url); + } + + /** + * When was this resource last updated? + */ + public Date getUpdatedAt() { + return GitHub.parseDate(updated_at); + } + + /** + * Unique ID number of this resource. + * + * TODO: need to also return String + */ + public int getId() { + return id; + } +} diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 82c75394ec..1a6d15b8e4 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -42,11 +42,10 @@ * @author Kohsuke Kawaguchi */ @SuppressWarnings({"UnusedDeclaration"}) -public class GHRepository { +public class GHRepository extends GHObject { /*package almost final*/ GitHub root; private String description, homepage, name, full_name; - private String url; // this is the API url 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. @@ -54,7 +53,7 @@ public class GHRepository { @JsonProperty("private") private boolean _private; private int watchers,forks,open_issues,size,network_count,subscribers_count; - private String created_at, pushed_at; + private String pushed_at; private Map milestones = new HashMap(); private String default_branch,language; @@ -128,13 +127,6 @@ public String getHomepage() { 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. @@ -346,10 +338,6 @@ public Date getPushedAt() { 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. * From f421067a0d3a9bd0ba111114e6f01d78e2c6f9f2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 07:01:32 -0800 Subject: [PATCH 19/26] Looks like Windows line ends have crept in. --- .../kohsuke/github/GHDeploymentStatus.java | 72 +++++++++---------- .../github/GHDeploymentStatusBuilder.java | 60 ++++++++-------- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java index d23989b3f6..78cf1b2ba2 100644 --- a/src/main/java/org/kohsuke/github/GHDeploymentStatus.java +++ b/src/main/java/org/kohsuke/github/GHDeploymentStatus.java @@ -1,36 +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()); - } - - -} +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()); + } + + +} diff --git a/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java b/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java index 6adf170fad..4310153800 100644 --- a/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java +++ b/src/main/java/org/kohsuke/github/GHDeploymentStatusBuilder.java @@ -1,30 +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); - } -} +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); + } +} From 50f43cc178d1d510b0858cf4a07140ccbd035b4b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 08:26:49 -0800 Subject: [PATCH 20/26] Inserted backward compatibility methods --- .../java/org/kohsuke/github/GHObject.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHObject.java b/src/main/java/org/kohsuke/github/GHObject.java index 18c7a36827..bf1a3b2948 100644 --- a/src/main/java/org/kohsuke/github/GHObject.java +++ b/src/main/java/org/kohsuke/github/GHObject.java @@ -1,5 +1,8 @@ package org.kohsuke.github; +import com.infradna.tool.bridge_method_injector.WithBridgeMethods; + +import java.io.IOException; import java.net.URL; import java.util.Date; @@ -18,15 +21,19 @@ public abstract class GHObject { /** * When was this resource created? */ - public Date getCreatedAt() { + @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. - * - * TODO: need to also return String */ + @WithBridgeMethods(value=String.class, adapterMethod="urlToString") public URL getUrl() { return GitHub.parseURL(url); } @@ -34,16 +41,23 @@ public URL getUrl() { /** * When was this resource last updated? */ - public Date getUpdatedAt() { + public Date getUpdatedAt() throws IOException { return GitHub.parseDate(updated_at); } /** * Unique ID number of this resource. - * - * TODO: need to also return String */ + @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(); + } } From b6e48cc4f9c7b13895673a7b4aa6399b7e236b1f Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 14 Feb 2015 08:26:54 -0800 Subject: [PATCH 21/26] Use GHObject as much as we can --- pom.xml | 4 +-- .../org/kohsuke/github/GHCommitComment.java | 18 ++---------- .../org/kohsuke/github/GHCommitStatus.java | 24 +-------------- src/main/java/org/kohsuke/github/GHIssue.java | 16 ++-------- .../org/kohsuke/github/GHIssueComment.java | 22 ++------------ .../java/org/kohsuke/github/GHMilestone.java | 12 ++------ .../java/org/kohsuke/github/GHPerson.java | 24 +++++++-------- .../java/org/kohsuke/github/GHRelease.java | 29 +------------------ 8 files changed, 24 insertions(+), 125 deletions(-) diff --git a/pom.xml b/pom.xml index 749c8cb24a..ddc44fb1f5 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ com.infradna.tool bridge-method-injector - 1.12 + 1.14 @@ -77,7 +77,7 @@ com.infradna.tool bridge-method-annotation - 1.12 + 1.14 org.kohsuke.stapler diff --git a/src/main/java/org/kohsuke/github/GHCommitComment.java b/src/main/java/org/kohsuke/github/GHCommitComment.java index a5f23877f8..7deebbc6ad 100644 --- a/src/main/java/org/kohsuke/github/GHCommitComment.java +++ b/src/main/java/org/kohsuke/github/GHCommitComment.java @@ -12,13 +12,11 @@ * @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 GHRepository getOwner() { 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 int getLine() { return line!=null ? line : -1; } - public int getId() { - return id; - } - /** * Gets the user who put this comment. */ diff --git a/src/main/java/org/kohsuke/github/GHCommitStatus.java b/src/main/java/org/kohsuke/github/GHCommitStatus.java index af9f1d31ca..98112ae2e7 100644 --- a/src/main/java/org/kohsuke/github/GHCommitStatus.java +++ b/src/main/java/org/kohsuke/github/GHCommitStatus.java @@ -10,12 +10,9 @@ * @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; @@ -27,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)) @@ -56,17 +45,6 @@ public String getDescription() { return description; } - public int getId() { - return id; - } - - /** - * API URL of this commit status. - */ - public String getUrl() { - return url; - } - public GHUser getCreator() { return creator; } diff --git a/src/main/java/org/kohsuke/github/GHIssue.java b/src/main/java/org/kohsuke/github/GHIssue.java index bed8ba30f0..b66483f832 100644 --- a/src/main/java/org/kohsuke/github/GHIssue.java +++ b/src/main/java/org/kohsuke/github/GHIssue.java @@ -38,7 +38,7 @@ * @author Eric Maupin * @author Kohsuke Kawaguchi */ -public class GHIssue { +public class GHIssue extends GHObject { GitHub root; GHRepository owner; @@ -51,11 +51,9 @@ public class GHIssue { protected String body; protected List