diff --git a/pom.xml b/pom.xml index bba5978ae8..965f1b2294 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ github-api - 1.29 + 1.30 GitHub API for Java http://github-api.kohsuke.org/ GitHub API for Java diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 6ff0553580..15877e2bd7 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -358,12 +358,28 @@ public GHPullRequest getPullRequest(int i) throws IOException { /** * Retrieves all the pull requests of a particular state. + * + * @see #listPullRequests(GHIssueState) */ public List getPullRequests(GHIssueState state) throws IOException { - GHPullRequest[] r = root.retrieveWithAuth("/repos/" + owner.login + '/' + name + "/pulls?state=" + state.name().toLowerCase(Locale.ENGLISH), GHPullRequest[].class); - for (GHPullRequest p : r) - p.wrapUp(this); - return new ArrayList(Arrays.asList(r)); + return listPullRequests(state).asList(); + } + + /** + * Retrieves all the pull requests of a particular state. + */ + public PagedIterable listPullRequests(final GHIssueState state) { + return new PagedIterable() { + public PagedIterator iterator() { + return new PagedIterator(root.retrievePaged(String.format("/repos/%s/%s/pulls?state=%s", owner.login,name,state.name().toLowerCase(Locale.ENGLISH)), GHPullRequest[].class, false)) { + @Override + protected void wrapUp(GHPullRequest[] page) { + for (GHPullRequest pr : page) + pr.wrap(GHRepository.this); + } + }; + } + }; } /** diff --git a/src/main/java/org/kohsuke/github/PagedIterable.java b/src/main/java/org/kohsuke/github/PagedIterable.java index 2470ca7297..7cbfe6dc3d 100644 --- a/src/main/java/org/kohsuke/github/PagedIterable.java +++ b/src/main/java/org/kohsuke/github/PagedIterable.java @@ -1,8 +1,24 @@ package org.kohsuke.github; +import java.util.ArrayList; +import java.util.List; + /** + * {@link Iterable} that returns {@link PagedIterator} + * * @author Kohsuke Kawaguchi */ -public interface PagedIterable extends Iterable { - PagedIterator iterator(); +public abstract class PagedIterable implements Iterable { + public abstract PagedIterator iterator(); + + /** + * Eagerly walk {@link Iterable} and return the result in a list. + */ + public List asList() { + List r = new ArrayList(); + for(PagedIterator i = iterator(); i.hasNext();) { + r.addAll(i.nextPage()); + } + return r; + } } diff --git a/src/test/java/org/kohsuke/AppTest.java b/src/test/java/org/kohsuke/AppTest.java index 120ef0e7c1..1b93cee1d1 100644 --- a/src/test/java/org/kohsuke/AppTest.java +++ b/src/test/java/org/kohsuke/AppTest.java @@ -14,11 +14,13 @@ import org.kohsuke.github.GHMyself; import org.kohsuke.github.GHOrganization; import org.kohsuke.github.GHOrganization.Permission; +import org.kohsuke.github.GHPullRequest; import org.kohsuke.github.GHRepository; import org.kohsuke.github.GHTeam; import org.kohsuke.github.GHUser; import org.kohsuke.github.GitHub; import org.kohsuke.github.PagedIterable; +import org.kohsuke.github.PagedIterator; import java.io.IOException; import java.net.URL; @@ -64,6 +66,16 @@ public void testFetchPullRequest() throws Exception { r.getPullRequests(GHIssueState.OPEN); } + public void testFetchPullRequestAsList() throws Exception { + GitHub gh = GitHub.connect(); + GHRepository r = gh.getOrganization("symfony").getRepository("symfony-docs"); + assertEquals("master", r.getMasterBranch()); + PagedIterable i = r.listPullRequests(GHIssueState.CLOSED); + List prs = i.asList(); + assertNotNull(prs); + assertTrue(prs.size() > 0); + } + public void testRepoPermissions() throws Exception { GitHub gh = GitHub.connect(); GHRepository r = gh.getOrganization("jenkinsci").getRepository("jenkins");