提交 5c9731c9 编写于 作者: M Michael Kaiser

Fetch all releases when doing `hub release`

As suggested at #1511, instead of fetching only the first 30 releases,
follow the `next` link to fetch all pages.
上级 e39364d5
......@@ -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"] = %(<https://api.github.com/repositories/12345?per_page=100&page=2>; 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"] = %(<https://api.github.com/repositories/12345?per_page=100&page=3>; 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:
"""
......
......@@ -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
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册