未验证 提交 9c2d6c2b 编写于 作者: M Mislav Marohnić 提交者: GitHub

Merge pull request #1581 from patheticpat/limit-flags

Add limit flag for issue and release commands
......@@ -17,7 +17,7 @@ var (
cmdIssue = &Command{
Run: listIssues,
Usage: `
issue [-a <ASSIGNEE>] [-c <CREATOR>] [-@ <USER>] [-s <STATE>] [-f <FORMAT>] [-M <MILESTONE>] [-l <LABELS>] [-d <DATE>] [-o <SORT_KEY> [-^]]
issue [-a <ASSIGNEE>] [-c <CREATOR>] [-@ <USER>] [-s <STATE>] [-f <FORMAT>] [-M <MILESTONE>] [-l <LABELS>] [-d <DATE>] [-o <SORT_KEY> [-^]] [-L <LIMIT>]
issue create [-oc] [-m <MESSAGE>|-F <FILE>] [-a <USERS>] [-M <MILESTONE>] [-l <LABELS>]
`,
Long: `Manage GitHub issues for the current project.
......@@ -131,6 +131,9 @@ With no arguments, show a list of open issues.
-^ --sort-ascending
Sort by ascending dates instead of descending.
-L, --limit <LIMIT>
Display only the first <LIMIT> issues.
--include-pulls
Include pull requests as well as issues.
`,
......@@ -165,6 +168,8 @@ With no arguments, show a list of open issues.
flagIssueAssignees,
flagIssueLabels listFlag
flagIssueLimit int
)
func init() {
......@@ -188,6 +193,7 @@ func init() {
cmdIssue.Flag.StringVarP(&flagIssueSort, "sort", "o", "created", "SORT_KEY")
cmdIssue.Flag.BoolVarP(&flagIssueSortAscending, "sort-ascending", "^", false, "SORT_KEY")
cmdIssue.Flag.BoolVarP(&flagIssueIncludePulls, "include-pulls", "", false, "INCLUDE_PULLS")
cmdIssue.Flag.IntVarP(&flagIssueLimit, "limit", "L", -1, "LIMIT")
cmdIssue.Use(cmdCreateIssue)
CmdRunner.Use(cmdIssue)
......@@ -233,7 +239,9 @@ func listIssues(cmd *Command, args *Args) {
}
}
issues, err := gh.FetchIssues(project, filters)
issues, err := gh.FetchIssues(project, filters, flagIssueLimit, func(issue *github.Issue) bool {
return issue.PullRequest == nil || flagIssueIncludePulls
})
utils.Check(err)
maxNumWidth := 0
......@@ -245,10 +253,6 @@ func listIssues(cmd *Command, args *Args) {
colorize := ui.IsTerminal(os.Stdout)
for _, issue := range issues {
if !flagIssueIncludePulls && issue.PullRequest != nil {
continue
}
ui.Printf(formatIssue(issue, flagIssueFormat, colorize))
}
}
......
......@@ -16,7 +16,7 @@ var (
cmdRelease = &Command{
Run: listReleases,
Usage: `
release [--include-drafts] [--exclude-prereleases]
release [--include-drafts] [--exclude-prereleases] [-L <LIMIT>]
release show <TAG>
release create [-dpoc] [-a <FILE>] [-m <MESSAGE>|-F <FILE>] [-t <TARGET>] <TAG>
release edit [<options>] <TAG>
......@@ -55,6 +55,9 @@ With '--exclude-prereleases', exclude non-stable releases from the listing.
Delete the release and associated assets for the specified <TAG>.
## Options:
-L, --limit
Display only the first <LIMIT> releases.
-d, --draft
Create a draft release.
......@@ -134,11 +137,14 @@ hub(1), git-tag(1)
flagReleaseCommitish string
flagReleaseAssets stringSliceValue
flagReleaseLimit int
)
func init() {
cmdRelease.Flag.BoolVarP(&flagReleaseIncludeDrafts, "include-drafts", "d", false, "DRAFTS")
cmdRelease.Flag.BoolVarP(&flagReleaseExcludePrereleases, "exclude-prereleases", "p", false, "PRERELEASE")
cmdRelease.Flag.IntVarP(&flagReleaseLimit, "limit", "L", -1, "LIMIT")
cmdShowRelease.Flag.BoolVarP(&flagReleaseShowDownloads, "show-downloads", "d", false, "DRAFTS")
......@@ -180,14 +186,14 @@ func listReleases(cmd *Command, args *Args) {
if args.Noop {
ui.Printf("Would request list of releases for %s\n", project)
} else {
releases, err := gh.FetchReleases(project)
releases, err := gh.FetchReleases(project, flagReleaseLimit, func(release *github.Release) bool {
return (!release.Draft || flagReleaseIncludeDrafts) &&
(!release.Prerelease || !flagReleaseExcludePrereleases)
})
utils.Check(err)
for _, release := range releases {
if (!release.Draft || flagReleaseIncludeDrafts) &&
(!release.Prerelease || !flagReleaseExcludePrereleases) {
ui.Println(release.TagName)
}
ui.Println(release.TagName)
}
}
......
......@@ -38,6 +38,38 @@ Feature: hub issue
#13 Second issue\n
"""
Scenario: List limited number of issues
Given the GitHub API server:
"""
get('/repos/github/hub/issues') {
response.headers["Link"] = %(<https://api.github.com/repositories/12345/issues?per_page=100&page=2>; rel="next")
assert :per_page => "3"
json [
{ :number => 102,
:title => "First issue",
:state => "open",
:user => { :login => "octocat" },
},
{ :number => 13,
:title => "Second issue",
:state => "open",
:user => { :login => "octocat" },
},
{ :number => 999,
:title => "Third issue",
:state => "open",
:user => { :login => "octocat" },
},
]
}
"""
When I successfully run `hub issue -L 2`
Then the output should contain exactly:
"""
#102 First issue
#13 Second issue\n
"""
Scenario: Fetch issues and pull requests
Given the GitHub API server:
"""
......
......@@ -147,6 +147,38 @@ Feature: hub release
v1.0.0\n
"""
Scenario: List limited number of releases
Given the GitHub API server:
"""
get('/repos/mislav/will_paginate/releases') {
response.headers["Link"] = %(<https://api.github.com/repositories/12345?per_page=100&page=2>; rel="next")
assert :per_page => "3"
json [
{ tag_name: 'v1.2.0',
name: 'will_paginate 1.2.0',
draft: false,
prerelease: false,
},
{ 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,
},
]
}
"""
When I successfully run `hub release -L 2`
Then the output should contain exactly:
"""
v1.2.0
v1.2.0-pre\n
"""
Scenario: Repository not found when listing releases
Given the GitHub API server:
"""
......
......@@ -246,13 +246,13 @@ type ReleaseAsset struct {
ApiUrl string `json:"url"`
}
func (client *Client) FetchReleases(project *Project) (releases []Release, err error) {
func (client *Client) FetchReleases(project *Project, limit int, filter func(*Release) bool) (releases []Release, err error) {
api, err := client.simpleApi()
if err != nil {
return
}
path := fmt.Sprintf("repos/%s/%s/releases?per_page=100", project.Owner, project.Name)
path := fmt.Sprintf("repos/%s/%s/releases?per_page=%d", project.Owner, project.Name, perPage(limit, 100))
releases = []Release{}
var res *simpleResponse
......@@ -268,29 +268,33 @@ func (client *Client) FetchReleases(project *Project) (releases []Release, err e
if err = res.Unmarshal(&releasesPage); err != nil {
return
}
releases = append(releases, releasesPage...)
for _, release := range releasesPage {
if filter == nil || filter(&release) {
releases = append(releases, release)
if limit > 0 && len(releases) == limit {
path = ""
break
}
}
}
}
return
}
func (client *Client) FetchRelease(project *Project, tagName string) (foundRelease *Release, err error) {
releases, err := client.FetchReleases(project)
if err != nil {
return
}
for _, release := range releases {
if release.TagName == tagName {
foundRelease = &release
break
}
func (client *Client) FetchRelease(project *Project, tagName string) (*Release, error) {
releases, err := client.FetchReleases(project, 1, func(release *Release) bool {
return release.TagName == tagName
})
if err != nil && len(releases) < 1 {
err = fmt.Errorf("Unable to find release with tag name `%s'", tagName)
}
if foundRelease == nil {
err = fmt.Errorf("Unable to find release with tag name `%s'", tagName)
if err == nil {
return &releases[0], nil
} else {
return nil, err
}
return
}
func (client *Client) CreateRelease(project *Project, releaseParams *Release) (release *Release, err error) {
......@@ -480,13 +484,13 @@ type Milestone struct {
Title string `json:"title"`
}
func (client *Client) FetchIssues(project *Project, filterParams map[string]interface{}) (issues []Issue, err error) {
func (client *Client) FetchIssues(project *Project, filterParams map[string]interface{}, limit int, filter func(*Issue) bool) (issues []Issue, err error) {
api, err := client.simpleApi()
if err != nil {
return
}
path := fmt.Sprintf("repos/%s/%s/issues?per_page=100", project.Owner, project.Name)
path := fmt.Sprintf("repos/%s/%s/issues?per_page=%d", project.Owner, project.Name, perPage(limit, 100))
if filterParams != nil {
query := url.Values{}
for key, value := range filterParams {
......@@ -512,7 +516,15 @@ func (client *Client) FetchIssues(project *Project, filterParams map[string]inte
if err = res.Unmarshal(&issuesPage); err != nil {
return
}
issues = append(issues, issuesPage...)
for _, issue := range issuesPage {
if filter == nil || filter(&issue) {
issues = append(issues, issue)
if limit > 0 && len(issues) == limit {
path = ""
break
}
}
}
}
return
......@@ -765,3 +777,13 @@ func authTokenNote(num int) (string, error) {
return fmt.Sprintf("hub for %s@%s", n, h), nil
}
func perPage(limit, max int) int {
if limit > 0 {
limit = limit + (limit / 2)
if limit < max {
return limit
}
}
return max
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册