diff --git a/github.go b/github.go index 989399a..79bd546 100644 --- a/github.go +++ b/github.go @@ -49,7 +49,7 @@ func NewGitHubClient(source Source) (*GitHubClient, error) { if source.Insecure { httpClient.Transport = &http.Transport{ - Proxy: http.ProxyFromEnvironment, + Proxy: http.ProxyFromEnvironment, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } ctx = context.WithValue(ctx, oauth2.HTTPClient, httpClient) @@ -99,17 +99,25 @@ func NewGitHubClient(source Source) (*GitHubClient, error) { } func (g *GitHubClient) ListReleases() ([]*github.RepositoryRelease, error) { - releases, res, err := g.client.Repositories.ListReleases(context.TODO(), g.owner, g.repository, nil) - if err != nil { - return []*github.RepositoryRelease{}, err - } - - err = res.Body.Close() - if err != nil { - return nil, err + opt := &github.ListOptions{PerPage: 100} + var allReleases []*github.RepositoryRelease + for { + releases, res, err := g.client.Repositories.ListReleases(context.TODO(), g.owner, g.repository, opt) + if err != nil { + return []*github.RepositoryRelease{}, err + } + allReleases = append(allReleases, releases...) + if res.NextPage == 0 { + err = res.Body.Close() + if err != nil { + return nil, err + } + break + } + opt.Page = res.NextPage } - return releases, nil + return allReleases, nil } func (g *GitHubClient) GetReleaseByTag(tag string) (*github.RepositoryRelease, error) { diff --git a/github_test.go b/github_test.go index 7150a27..f4ce287 100644 --- a/github_test.go +++ b/github_test.go @@ -119,6 +119,42 @@ var _ = Describe("GitHub Client", func() { }) }) + Describe("ListReleases", func() { + BeforeEach(func() { + source = Source{ + Owner: "concourse", + Repository: "concourse", + } + }) + Context("When list of releases return more then 100 items", func() { + BeforeEach(func() { + var result []*github.RepositoryRelease + for i := 1; i < 102; i++ { + result = append(result, &github.RepositoryRelease{ID: github.Int(i)}) + + } + + server.AppendHandlers( + ghttp.CombineHandlers( + ghttp.VerifyRequest("GET", "/repos/concourse/concourse/releases", "per_page=100"), + ghttp.RespondWithJSONEncoded(200, result[:100], http.Header{"Link": []string{`; rel="next"`}}), + ), + ghttp.CombineHandlers( + ghttp.VerifyRequest("GET", "/repos/concourse/concourse/releases", "per_page=100&page=2"), + ghttp.RespondWithJSONEncoded(200, result[100:]), + ), + ) + }) + + It("list releases", func() { + releases, err := client.ListReleases() + Ω(err).ShouldNot(HaveOccurred()) + Expect(releases).To(HaveLen(101)) + Expect(server.ReceivedRequests()).To(HaveLen(2)) + }) + }) + }) + Describe("GetRelease", func() { BeforeEach(func() { source = Source{