From a1df526f937efae5e6290e4b4a45d54e1a761131 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 21 Nov 2016 08:53:42 -0800 Subject: [PATCH 01/14] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a2254c512d..df146ab5c9 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ github-api - 1.81 + 1.82-SNAPSHOT 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.81 + HEAD From 68ebc08c9d8bfdc48253f265c2c1484fd28e678b Mon Sep 17 00:00:00 2001 From: David Xia Date: Sat, 26 Nov 2016 00:44:52 -0500 Subject: [PATCH 02/14] Fix typos in javadocs Replace "pagenated" with "paginated". --- src/main/java/org/kohsuke/github/GHPerson.java | 4 ++-- src/main/java/org/kohsuke/github/PagedIterator.java | 2 +- src/main/java/org/kohsuke/github/Requester.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHPerson.java b/src/main/java/org/kohsuke/github/GHPerson.java index 67e157173f..f9872699ce 100644 --- a/src/main/java/org/kohsuke/github/GHPerson.java +++ b/src/main/java/org/kohsuke/github/GHPerson.java @@ -93,10 +93,10 @@ protected void wrapUp(GHRepository[] page) { } /** - * Loads repository list in a pagenated fashion. + * Loads repository list in a paginated fashion. * *

- * For a person with a lot of repositories, GitHub returns the list of repositories in a pagenated fashion. + * For a person with a lot of repositories, GitHub returns the list of repositories in a paginated fashion. * Unlike {@link #getRepositories()}, this method allows the caller to start processing data as it arrives. * * Every {@link Iterator#next()} call results in I/O. Exceptions that occur during the processing is wrapped diff --git a/src/main/java/org/kohsuke/github/PagedIterator.java b/src/main/java/org/kohsuke/github/PagedIterator.java index 9149290911..aaa8182076 100644 --- a/src/main/java/org/kohsuke/github/PagedIterator.java +++ b/src/main/java/org/kohsuke/github/PagedIterator.java @@ -6,7 +6,7 @@ import java.util.NoSuchElementException; /** - * Iterator over a pagenated data source. + * Iterator over a paginated data source. * * Aside from the normal iterator operation, this method exposes {@link #nextPage()} * that allows the caller to retrieve items per page. diff --git a/src/main/java/org/kohsuke/github/Requester.java b/src/main/java/org/kohsuke/github/Requester.java index 3d240abd65..70c48940c0 100644 --- a/src/main/java/org/kohsuke/github/Requester.java +++ b/src/main/java/org/kohsuke/github/Requester.java @@ -355,7 +355,7 @@ private boolean isMethodWithBody() { } /** - * Loads pagenated resources. + * Loads paginated resources. * * Every iterator call reports a new batch. */ From 0731f63237cc7c09c708db3b83089fa561e361a6 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 26 Nov 2016 14:45:03 -0800 Subject: [PATCH 03/14] Added order parameter --- src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java | 5 +++++ .../java/org/kohsuke/github/GHRepositorySearchBuilder.java | 5 +++++ src/main/java/org/kohsuke/github/GHUserSearchBuilder.java | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java b/src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java index ff574025c0..f9634a59f1 100644 --- a/src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java +++ b/src/main/java/org/kohsuke/github/GHIssueSearchBuilder.java @@ -41,6 +41,11 @@ public GHIssueSearchBuilder isMerged() { return q("is:merged"); } + public GHIssueSearchBuilder order(GHDirection v) { + req.with("order",v); + return this; + } + public GHIssueSearchBuilder sort(Sort sort) { req.with("sort",sort); return this; diff --git a/src/main/java/org/kohsuke/github/GHRepositorySearchBuilder.java b/src/main/java/org/kohsuke/github/GHRepositorySearchBuilder.java index 8d30aaaf6b..03b12f5133 100644 --- a/src/main/java/org/kohsuke/github/GHRepositorySearchBuilder.java +++ b/src/main/java/org/kohsuke/github/GHRepositorySearchBuilder.java @@ -57,6 +57,11 @@ public GHRepositorySearchBuilder stars(String v) { return q("stars:"+v); } + public GHRepositorySearchBuilder order(GHDirection v) { + req.with("order",v); + return this; + } + public GHRepositorySearchBuilder sort(Sort sort) { req.with("sort",sort); return this; diff --git a/src/main/java/org/kohsuke/github/GHUserSearchBuilder.java b/src/main/java/org/kohsuke/github/GHUserSearchBuilder.java index fa5161683f..ca40f4d050 100644 --- a/src/main/java/org/kohsuke/github/GHUserSearchBuilder.java +++ b/src/main/java/org/kohsuke/github/GHUserSearchBuilder.java @@ -49,6 +49,11 @@ public GHUserSearchBuilder followers(String v) { return q("followers:"+v); } + public GHUserSearchBuilder order(GHDirection v) { + req.with("order",v); + return this; + } + public GHUserSearchBuilder sort(Sort sort) { req.with("sort",sort); return this; From 0780e10fa2eac368c5adf4f824c6bbdb3030c31d Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 13 Dec 2016 04:17:27 +0300 Subject: [PATCH 04/14] Added ghRepo.getBlob(String) method Signed-off-by: Kanstantsin Shautsou --- src/main/java/org/kohsuke/github/GHBlob.java | 30 +++++++++++++++++++ .../java/org/kohsuke/github/GHRepository.java | 8 +++++ .../java/org/kohsuke/github/GHTreeEntry.java | 4 +-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/kohsuke/github/GHBlob.java diff --git a/src/main/java/org/kohsuke/github/GHBlob.java b/src/main/java/org/kohsuke/github/GHBlob.java new file mode 100644 index 0000000000..f795da00d4 --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHBlob.java @@ -0,0 +1,30 @@ +package org.kohsuke.github; + +/** + * @author Kanstantsin Shautsou + * @see Get a blob + */ +public class GHBlob { + private String content, encoding, url, sha; + private long size; + + public String getEncoding() { + return encoding; + } + + public String getUrl() { + return url; + } + + public String getSha() { + return sha; + } + + public long getSize() { + return size; + } + + public String getContent() { + return content; + } +} diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index f34ea85004..88346ea4cd 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -817,6 +817,14 @@ public GHTree getTreeRecursive(String sha, int recursive) throws IOException { return root.retrieve().to(url, GHTree.class).wrap(root); } + /** + * @see Get a blob + */ + public GHBlob getBlob(String blobSha) throws IOException { + String target = getApiTailUrl("git/blobs/" + blobSha); + return root.retrieve().to(target, GHBlob.class); + } + /** * Gets a commit object in this repository. */ diff --git a/src/main/java/org/kohsuke/github/GHTreeEntry.java b/src/main/java/org/kohsuke/github/GHTreeEntry.java index e3d831c073..8359c40cda 100644 --- a/src/main/java/org/kohsuke/github/GHTreeEntry.java +++ b/src/main/java/org/kohsuke/github/GHTreeEntry.java @@ -54,14 +54,14 @@ public String getType() { /** - * SHA1 of this object. + * SHA1 of this blob object. */ public String getSha() { return sha; } /** - * API URL to this Git data, such as + * API URL to this Git blob data, such as * https://api.github.com/repos/jenkinsci * /jenkins/git/commits/b72322675eb0114363a9a86e9ad5a170d1d07ac0 */ From c5009ab44b87a250d6272f51ad60d44c7b8474df Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 16 Dec 2016 15:04:10 -0500 Subject: [PATCH 05/14] Fix syntactically malformed test JSON. --- .../org/kohsuke/github/GHEventPayloadTest/label.json | 3 +-- .../org/kohsuke/github/GHEventPayloadTest/milestone.json | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/test/resources/org/kohsuke/github/GHEventPayloadTest/label.json b/src/test/resources/org/kohsuke/github/GHEventPayloadTest/label.json index f85f636f89..b7a0be1b2e 100644 --- a/src/test/resources/org/kohsuke/github/GHEventPayloadTest/label.json +++ b/src/test/resources/org/kohsuke/github/GHEventPayloadTest/label.json @@ -65,8 +65,7 @@ "issues_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}", "pulls_url": "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}", "milestones_url": "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}", - "notifications_url": "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all, - participating}", + "notifications_url": "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}", "releases_url": "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}", "deployments_url": "https://api.github.com/repos/baxterandthehackers/public-repo/deployments", diff --git a/src/test/resources/org/kohsuke/github/GHEventPayloadTest/milestone.json b/src/test/resources/org/kohsuke/github/GHEventPayloadTest/milestone.json index 7f262abd5c..1cd673eef5 100644 --- a/src/test/resources/org/kohsuke/github/GHEventPayloadTest/milestone.json +++ b/src/test/resources/org/kohsuke/github/GHEventPayloadTest/milestone.json @@ -2,8 +2,7 @@ "action": "created", "milestone": { "url": "https://api.github.com/repos/baxterandthehackers/public-repo/milestones/3", - "html_url": "https://github.com/baxterandthehackers/public-repo/milestones/Test%20milestone%20creation%20webhook - %20from%20command%20line2", + "html_url": "https://github.com/baxterandthehackers/public-repo/milestones/Test%20milestone%20creation%20webhook%20from%20command%20line2", "labels_url": "https://api.github.com/repos/baxterandthehackers/public-repo/milestones/3/labels", "id": 2055681, "number": 3, @@ -96,8 +95,7 @@ "issues_url": "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}", "pulls_url": "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}", "milestones_url": "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}", - "notifications_url": "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all, - participating}", + "notifications_url": "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}", "releases_url": "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}", "deployments_url": "https://api.github.com/repos/baxterandthehackers/public-repo/deployments", From 6380cf9ed0551ecaf6dbec27262f7ce79e2e33c9 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 06:46:33 -0800 Subject: [PATCH 06/14] Added a method to retrieve the actual bytes of BLOB ... which is probably more useful than the getContent() method --- src/main/java/org/kohsuke/github/GHBlob.java | 45 +++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHBlob.java b/src/main/java/org/kohsuke/github/GHBlob.java index f795da00d4..7327fbfb13 100644 --- a/src/main/java/org/kohsuke/github/GHBlob.java +++ b/src/main/java/org/kohsuke/github/GHBlob.java @@ -1,30 +1,63 @@ package org.kohsuke.github; +import org.apache.commons.codec.binary.Base64InputStream; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URL; + /** * @author Kanstantsin Shautsou + * @author Kohsuke Kawaguchi + * @see GHRepository#getBlob(String) * @see Get a blob */ public class GHBlob { private String content, encoding, url, sha; private long size; - public String getEncoding() { - return encoding; - } - - public String getUrl() { - return url; + /** + * API URL of this blob. + */ + public URL getUrl() { + return GitHub.parseURL(url); } public String getSha() { return sha; } + /** + * Number of bytes in this blob. + */ public long getSize() { return size; } + public String getEncoding() { + return encoding; + } + + /** + * Encoded content. You probably want {@link #read()} + */ public String getContent() { return content; } + + /** + * Retrieves the actual bytes of the blob. + */ + public InputStream read() { + if (encoding.equals("base64")) { + try { + return new Base64InputStream(new ByteArrayInputStream(content.getBytes("US-ASCII")), false); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); // US-ASCII is mandatory + } + } + + throw new UnsupportedOperationException("Unrecognized encoding: "+encoding); + } } From e6ee278fdef1d498deee8cd30bf1fd62eed52898 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 06:55:44 -0800 Subject: [PATCH 07/14] Another version that directly reads BLOB without going through an intermediate object. --- .../java/org/kohsuke/github/GHRepository.java | 18 ++++++++++++++++ src/test/java/org/kohsuke/github/AppTest.java | 21 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 88346ea4cd..ac0d57b5fc 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -31,6 +31,7 @@ import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.InterruptedIOException; import java.io.Reader; @@ -818,13 +819,30 @@ public GHTree getTreeRecursive(String sha, int recursive) throws IOException { } /** + * Obtains the metadata & the content of a blob. + * + *

+ * This method retrieves the whole content in memory, so beware when you are dealing with large BLOB. + * * @see Get a blob + * @see #readBlob(String) */ public GHBlob getBlob(String blobSha) throws IOException { String target = getApiTailUrl("git/blobs/" + blobSha); return root.retrieve().to(target, GHBlob.class); } + /** + * Reads the content of a blob as a stream for better efficiency. + * + * @see Get a blob + * @see #getBlob(String) + */ + public InputStream readBlob(String blobSha) throws IOException { + String target = getApiTailUrl("git/blobs/" + blobSha); + return root.retrieve().withHeader("Accept","application/vnd.github.VERSION.raw").asStream(target); + } + /** * Gets a commit object in this repository. */ diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index 0a958418be..157d105408 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -12,6 +12,7 @@ import org.kohsuke.github.GHOrganization.Permission; import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.util.*; import java.util.Map.Entry; @@ -903,6 +904,26 @@ public void listOrgMemberships() throws Exception { } } + @Test + public void blob() throws Exception { + GHRepository r = gitHub.getRepository("kohsuke/github-api"); + String sha1 = "a12243f2fc5b8c2ba47dd677d0b0c7583539584d"; + + assertBlobContent(r.readBlob(sha1)); + + GHBlob blob = r.getBlob(sha1); + assertBlobContent(blob.read()); + assertThat(blob.getSha(),is("a12243f2fc5b8c2ba47dd677d0b0c7583539584d")); + assertThat(blob.getSize(),is(1104L)); + } + + private void assertBlobContent(InputStream is) throws Exception { + String content = new String(IOUtils.toByteArray(is),"UTF-8"); + assertThat(content,containsString("Copyright (c) 2011- Kohsuke Kawaguchi and other contributors")); + assertThat(content,containsString("FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR")); + assertThat(content.length(),is(1104)); + } + private void kohsuke() { String login = getUser().getLogin(); Assume.assumeTrue(login.equals("kohsuke") || login.equals("kohsuke2")); From 88d52c44ad51c22dd32ec9f40651d3ef4f6f6422 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 07:03:40 -0800 Subject: [PATCH 08/14] Recording parent GHRepository --- src/main/java/org/kohsuke/github/GHRepository.java | 4 ++-- src/main/java/org/kohsuke/github/GHTree.java | 9 ++++++--- src/main/java/org/kohsuke/github/GHTreeEntry.java | 2 ++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index ac0d57b5fc..3442e37d32 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -800,7 +800,7 @@ public GHRef getRef(String refName) throws IOException { */ public GHTree getTree(String sha) throws IOException { String url = String.format("/repos/%s/%s/git/trees/%s", getOwnerName(), name, sha); - return root.retrieve().to(url, GHTree.class).wrap(root); + return root.retrieve().to(url, GHTree.class).wrap(this); } /** @@ -815,7 +815,7 @@ public GHTree getTree(String sha) throws IOException { */ public GHTree getTreeRecursive(String sha, int recursive) throws IOException { String url = String.format("/repos/%s/%s/git/trees/%s?recursive=%d", getOwnerName(), name, sha, recursive); - return root.retrieve().to(url, GHTree.class).wrap(root); + return root.retrieve().to(url, GHTree.class).wrap(this); } /** diff --git a/src/main/java/org/kohsuke/github/GHTree.java b/src/main/java/org/kohsuke/github/GHTree.java index aaf98e77e2..38b53cd4a1 100644 --- a/src/main/java/org/kohsuke/github/GHTree.java +++ b/src/main/java/org/kohsuke/github/GHTree.java @@ -13,7 +13,7 @@ * @see GHRepository#getTree(String) */ public class GHTree { - /* package almost final */GitHub root; + /* package almost final */GHRepository repo; private boolean truncated; private String sha, url; @@ -50,8 +50,11 @@ public URL getUrl() { return GitHub.parseURL(url); } - /* package */GHTree wrap(GitHub root) { - this.root = root; + /* package */GHTree wrap(GHRepository repo) { + this.repo = repo; + for (GHTreeEntry e : tree) { + e.tree = this; + } return this; } diff --git a/src/main/java/org/kohsuke/github/GHTreeEntry.java b/src/main/java/org/kohsuke/github/GHTreeEntry.java index 8359c40cda..3c069853c0 100644 --- a/src/main/java/org/kohsuke/github/GHTreeEntry.java +++ b/src/main/java/org/kohsuke/github/GHTreeEntry.java @@ -10,6 +10,8 @@ * @see GHTree */ public class GHTreeEntry { + /* package almost final */GHTree tree; + private String path, mode, type, sha, url; private long size; From 11651da411006f3fdbfa824d197566dc4f87a19f Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 07:04:14 -0800 Subject: [PATCH 09/14] not always a blob, for example it could be a tree. --- src/main/java/org/kohsuke/github/GHTreeEntry.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHTreeEntry.java b/src/main/java/org/kohsuke/github/GHTreeEntry.java index 3c069853c0..e368bb6680 100644 --- a/src/main/java/org/kohsuke/github/GHTreeEntry.java +++ b/src/main/java/org/kohsuke/github/GHTreeEntry.java @@ -46,7 +46,7 @@ public long getSize() { /** * Gets the type such as: - * "blob" + * "blob", "tree", etc. * * @return The type */ @@ -56,14 +56,14 @@ public String getType() { /** - * SHA1 of this blob object. + * SHA1 of this object. */ public String getSha() { return sha; } /** - * API URL to this Git blob data, such as + * API URL to this Git data, such as * https://api.github.com/repos/jenkinsci * /jenkins/git/commits/b72322675eb0114363a9a86e9ad5a170d1d07ac0 */ From b5386a35ee59c223ab2b692e87d6120c3761e59c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 07:09:29 -0800 Subject: [PATCH 10/14] Defining better traversal methods for apps that walk trees --- src/main/java/org/kohsuke/github/GHBlob.java | 1 + src/main/java/org/kohsuke/github/GHTree.java | 1 + .../java/org/kohsuke/github/GHTreeEntry.java | 35 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/src/main/java/org/kohsuke/github/GHBlob.java b/src/main/java/org/kohsuke/github/GHBlob.java index 7327fbfb13..a38a18219c 100644 --- a/src/main/java/org/kohsuke/github/GHBlob.java +++ b/src/main/java/org/kohsuke/github/GHBlob.java @@ -10,6 +10,7 @@ /** * @author Kanstantsin Shautsou * @author Kohsuke Kawaguchi + * @see GHTreeEntry#asBlob() * @see GHRepository#getBlob(String) * @see Get a blob */ diff --git a/src/main/java/org/kohsuke/github/GHTree.java b/src/main/java/org/kohsuke/github/GHTree.java index 38b53cd4a1..de60611253 100644 --- a/src/main/java/org/kohsuke/github/GHTree.java +++ b/src/main/java/org/kohsuke/github/GHTree.java @@ -11,6 +11,7 @@ * * @author Daniel Teixeira - https://github.com/ddtxra * @see GHRepository#getTree(String) + * @see GHTreeEntry#asTree() */ public class GHTree { /* package almost final */GHRepository repo; diff --git a/src/main/java/org/kohsuke/github/GHTreeEntry.java b/src/main/java/org/kohsuke/github/GHTreeEntry.java index e368bb6680..ba6d45e15e 100644 --- a/src/main/java/org/kohsuke/github/GHTreeEntry.java +++ b/src/main/java/org/kohsuke/github/GHTreeEntry.java @@ -1,5 +1,7 @@ package org.kohsuke.github; +import java.io.IOException; +import java.io.InputStream; import java.net.URL; /** @@ -70,4 +72,37 @@ public String getSha() { public URL getUrl() { return GitHub.parseURL(url); } + + /** + * If this tree entry represents a file, then return its information. + * Otherwise null. + */ + public GHBlob asBlob() throws IOException { + if (type.equals("blob")) + return tree.repo.getBlob(sha); + else + return null; + } + + /** + * If this tree entry represents a file, then return its content. + * Otherwise null. + */ + public InputStream readAsBlob() throws IOException { + if (type.equals("blob")) + return tree.repo.readBlob(sha); + else + return null; + } + + /** + * If this tree entry represents a directory, then return it. + * Otherwise null. + */ + public GHTree asTree() throws IOException { + if (type.equals("tree")) + return tree.repo.getTree(sha); + else + return null; + } } From a454fb10ec6fb562329dcaf192708e2e85a8bfdb Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 07:21:31 -0800 Subject: [PATCH 11/14] Tree traversal from commit & its associated tests --- src/main/java/org/kohsuke/github/GHCommit.java | 13 +++++++++++++ src/main/java/org/kohsuke/github/GHTree.java | 14 ++++++++++++++ src/test/java/org/kohsuke/github/AppTest.java | 5 +++++ 3 files changed, 32 insertions(+) diff --git a/src/main/java/org/kohsuke/github/GHCommit.java b/src/main/java/org/kohsuke/github/GHCommit.java index 3740778480..ec5dfbffc1 100644 --- a/src/main/java/org/kohsuke/github/GHCommit.java +++ b/src/main/java/org/kohsuke/github/GHCommit.java @@ -37,6 +37,12 @@ public static class ShortInfo { private int comment_count; + static class Tree { + String sha; + } + + private Tree tree; + @WithBridgeMethods(value = GHAuthor.class, castRequired = true) public GitUser getAuthor() { return author; @@ -224,6 +230,13 @@ public int getLinesDeleted() throws IOException { return stats.deletions; } + /** + * Use this method to walk the tree + */ + public GHTree getTree() throws IOException { + return owner.getTree(getCommitShortInfo().tree.sha); + } + /** * URL of this commit like "https://github.com/kohsuke/sandbox-ant/commit/8ae38db0ea5837313ab5f39d43a6f73de3bd9000" */ diff --git a/src/main/java/org/kohsuke/github/GHTree.java b/src/main/java/org/kohsuke/github/GHTree.java index de60611253..59c7cd287e 100644 --- a/src/main/java/org/kohsuke/github/GHTree.java +++ b/src/main/java/org/kohsuke/github/GHTree.java @@ -10,6 +10,7 @@ * https://developer.github.com/v3/git/trees/ * * @author Daniel Teixeira - https://github.com/ddtxra + * @see GHCommit#getTree() * @see GHRepository#getTree(String) * @see GHTreeEntry#asTree() */ @@ -35,6 +36,19 @@ public List getTree() { return Collections.unmodifiableList(Arrays.asList(tree)); } + /** + * Finds a tree entry by its name. + * + * IOW, find a directory entry by a file name. + */ + public GHTreeEntry getEntry(String path) { + for (GHTreeEntry e : tree) { + if (e.getPath().equals(path)) + return e; + } + return null; + } + /** * Returns true if the number of items in the tree array exceeded the GitHub maximum limit. * @return true true if the number of items in the tree array exceeded the GitHub maximum limit otherwise false. diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index 157d105408..e1d513d739 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -363,6 +363,11 @@ public void testCommit() throws Exception { assertEquals(48,f.getLinesChanged()); assertEquals("modified",f.getStatus()); assertEquals("changelog.html", f.getFileName()); + + // walk the tree + GHTree t = commit.getTree(); + assertThat(IOUtils.toString(t.getEntry("todo.txt").readAsBlob()), containsString("executor rendering")); + assertNotNull(t.getEntry("war").asTree()); } @Test From 3a66e90b7aadbd43c70a2ae391c39af037ae0415 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 07:28:28 -0800 Subject: [PATCH 12/14] Fixed issue #319 getApiUrl() is unreliable given that we collapse issue & PR into one object. --- src/main/java/org/kohsuke/github/GHPullRequest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHPullRequest.java b/src/main/java/org/kohsuke/github/GHPullRequest.java index a6becf495c..04898039bc 100644 --- a/src/main/java/org/kohsuke/github/GHPullRequest.java +++ b/src/main/java/org/kohsuke/github/GHPullRequest.java @@ -213,7 +213,7 @@ private void populate() throws IOException { public PagedIterable listFiles() { return new PagedIterable() { public PagedIterator _iterator(int pageSize) { - return new PagedIterator(root.retrieve().asIterator(String.format("%s/files", getApiURL()), + return new PagedIterator(root.retrieve().asIterator(String.format("%s/files", getApiRoute()), GHPullRequestFileDetail[].class, pageSize)) { @Override protected void wrapUp(GHPullRequestFileDetail[] page) { @@ -247,7 +247,7 @@ public PagedIterable listCommits() { return new PagedIterable() { public PagedIterator _iterator(int pageSize) { return new PagedIterator(root.retrieve().asIterator( - String.format("%s/commits", getApiURL()), + String.format("%s/commits", getApiRoute()), GHPullRequestCommitDetail[].class, pageSize)) { @Override protected void wrapUp(GHPullRequestCommitDetail[] page) { From 32177283b3e4f321a5ae26e5175def5936a3440d Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 07:30:14 -0800 Subject: [PATCH 13/14] Fixed issue #317 There's no need for the library to replicate a logic when GitHub does that (and does that correctly.) Looking at the commit history, I couldn't see why this was added in the first place. --- src/main/java/org/kohsuke/github/GHRepository.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 3442e37d32..4a0d410621 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -505,7 +505,6 @@ public void removeCollaborators(Collection users) throws IOException { } private void modifyCollaborators(Collection users, String method) throws IOException { - verifyMine(); for (GHUser user : users) { new Requester(root).method(method).to(getApiTailUrl("collaborators/" + user.getLogin())); } @@ -1118,11 +1117,6 @@ public GHHook createWebHook(URL url) throws IOException { // return root.retrieveWithAuth("/pulls/"+owner+'/'+name,JsonPullRequests.class).wrap(root); // } - private void verifyMine() throws IOException { - if (!root.login.equals(getOwnerName())) - throw new IOException("Operation not applicable to a repository owned by someone else: " + getOwnerName()); - } - /** * Returns a set that represents the post-commit hook URLs. * The returned set is live, and changes made to them are reflected to GitHub. From 3dbb516084f0d1e2c02c83d20e1ed1d2ce0b6c5c Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 17 Dec 2016 07:50:48 -0800 Subject: [PATCH 14/14] [maven-release-plugin] prepare release github-api-1.82 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index df146ab5c9..bd00bca40c 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ github-api - 1.82-SNAPSHOT + 1.82 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/ - HEAD + github-api-1.82