diff --git a/features/release.feature b/features/release.feature index 0cab16f51779d5540031412c31f12c8104e1091e..93131f094ab8a02bfe486152cbbdb25ab47ab4e1 100644 --- a/features/release.feature +++ b/features/release.feature @@ -94,6 +94,59 @@ Feature: hub release v1.0.2\n """ + Scenario: Fetch releases across multiple pages + Given the GitHub API server: + """ + get('/repos/mislav/will_paginate/releases') { + assert :per_page => "100", :page => :no + response.headers["Link"] = %(; rel="next") + json [ + { tag_name: 'v1.2.0', + name: 'will_paginate 1.2.0', + draft: false, + prerelease: false, + }, + ] + } + + get('/repositories/12345') { + assert :per_page => "100" + if params[:page] == "2" + response.headers["Link"] = %(; rel="next") + json [ + { tag_name: 'v1.2.0-pre', + name: 'will_paginate 1.2.0-pre', + draft: false, + prerelease: true, + }, + { tag_name: 'v1.0.2', + name: 'will_paginate 1.0.2', + draft: false, + prerelease: false, + }, + ] + elsif params[:page] == "3" + json [ + { tag_name: 'v1.0.0', + name: 'will_paginate 1.0.0', + draft: false, + prerelease: true, + }, + ] + else + status 400 + end + } + """ + When I successfully run `hub release` + Then the output should contain exactly: + """ + v1.2.0 + v1.2.0-pre + v1.0.2 + v1.0.0\n + """ + Scenario: Repository not found when listing releases Given the GitHub API server: """ diff --git a/github/client.go b/github/client.go index 14343c6e97f30107b76b598d7e6033afafb96051..b7ffd84e1237aada0d3645082b9ffb5a3ad1f78b 100644 --- a/github/client.go +++ b/github/client.go @@ -274,19 +274,30 @@ type ReleaseAsset struct { ApiUrl string `json:"url"` } -func (client *Client) FetchReleases(project *Project) (response []Release, err error) { +func (client *Client) FetchReleases(project *Project) (releases []Release, err error) { api, err := client.simpleApi() if err != nil { return } - res, err := api.Get(fmt.Sprintf("repos/%s/%s/releases", project.Owner, project.Name)) - if err = checkStatus(200, "fetching releases", res, err); err != nil { - return - } + path := fmt.Sprintf("repos/%s/%s/releases?per_page=100", project.Owner, project.Name) + + releases = []Release{} + var res *simpleResponse - response = []Release{} - err = res.Unmarshal(&response) + for path != "" { + res, err = api.Get(path) + if err = checkStatus(200, "fetching releases", res, err); err != nil { + return + } + path = res.Link("next") + + releasesPage := []Release{} + if err = res.Unmarshal(&releasesPage); err != nil { + return + } + releases = append(releases, releasesPage...) + } return }