Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
github
hub
提交
9c2d6c2b
H
hub
项目概览
github
/
hub
12 个月 前同步成功
通知
3
Star
22523
Fork
2406
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hub
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
9c2d6c2b
编写于
1月 29, 2018
作者:
M
Mislav Marohnić
提交者:
GitHub
1月 29, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1581 from patheticpat/limit-flags
Add limit flag for issue and release commands
上级
70e63ece
91193b52
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
128 addition
and
32 deletion
+128
-32
commands/issue.go
commands/issue.go
+10
-6
commands/release.go
commands/release.go
+12
-6
features/issue.feature
features/issue.feature
+32
-0
features/release.feature
features/release.feature
+32
-0
github/client.go
github/client.go
+42
-20
未找到文件。
commands/issue.go
浏览文件 @
9c2d6c2b
...
...
@@ -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
))
}
}
...
...
commands/release.go
浏览文件 @
9c2d6c2b
...
...
@@ -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
)
}
}
...
...
features/issue.feature
浏览文件 @
9c2d6c2b
...
...
@@ -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
:
"""
...
...
features/release.feature
浏览文件 @
9c2d6c2b
...
...
@@ -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
:
"""
...
...
github/client.go
浏览文件 @
9c2d6c2b
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录