Merge pull request #1677 from venyii/milestone-name

Add milestone to PR by name instead of number
This commit is contained in:
Mislav Marohnić 2018-04-06 11:36:01 +02:00 коммит произвёл GitHub
Родитель 80955f42f4 c8d2cc0247
Коммит 1e5bb959dc
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 127 добавлений и 10 удалений

Просмотреть файл

@ -63,8 +63,9 @@ pull-request -i <ISSUE>
-a, --assign <USERS>
A comma-separated list of GitHub handles to assign to this pull request.
-M, --milestone <ID>
Add this pull request to a GitHub milestone with id <ID>.
-M, --milestone <NAME>
The milestone name to add to this pull request. Passing the milestone number
is deprecated.
-l, --labels <LABELS>
Add a comma-separated list of labels to this pull request.
@ -85,6 +86,7 @@ var (
flagPullRequestHead,
flagPullRequestIssue,
flagPullRequestMessage,
flagPullRequestMilestone,
flagPullRequestFile string
flagPullRequestBrowse,
@ -93,8 +95,6 @@ var (
flagPullRequestPush,
flagPullRequestForce bool
flagPullRequestMilestone uint64
flagPullRequestAssignees,
flagPullRequestReviewers,
flagPullRequestLabels listFlag
@ -113,7 +113,7 @@ func init() {
cmdPullRequest.Flag.StringVarP(&flagPullRequestFile, "file", "F", "", "FILE")
cmdPullRequest.Flag.VarP(&flagPullRequestAssignees, "assign", "a", "USERS")
cmdPullRequest.Flag.VarP(&flagPullRequestReviewers, "reviewer", "r", "USERS")
cmdPullRequest.Flag.Uint64VarP(&flagPullRequestMilestone, "milestone", "M", 0, "MILESTONE")
cmdPullRequest.Flag.StringVarP(&flagPullRequestMilestone, "milestone", "M", "", "MILESTONE")
cmdPullRequest.Flag.VarP(&flagPullRequestLabels, "labels", "l", "LABELS")
CmdRunner.Use(cmdPullRequest)
@ -288,6 +288,18 @@ of text is the title and the rest is the description.`, fullBase, fullHead))
}
}
milestoneNumber := 0
if flagPullRequestMilestone != "" {
// BC: Don't try to resolve milestone name if it's an integer
milestoneNumber, err = strconv.Atoi(flagPullRequestMilestone)
if err != nil {
milestones, err := client.FetchMilestones(baseProject)
utils.Check(err)
milestoneNumber, err = findMilestoneNumber(milestones, flagPullRequestMilestone)
utils.Check(err)
}
}
var pullRequestURL string
if args.Noop {
args.Before(fmt.Sprintf("Would request a pull request to %s from %s", fullBase, fullHead), "")
@ -357,8 +369,8 @@ of text is the title and the rest is the description.`, fullBase, fullHead))
if len(flagPullRequestAssignees) > 0 {
params["assignees"] = flagPullRequestAssignees
}
if flagPullRequestMilestone > 0 {
params["milestone"] = flagPullRequestMilestone
if milestoneNumber > 0 {
params["milestone"] = milestoneNumber
}
if len(params) > 0 {
@ -423,3 +435,13 @@ func parsePullRequestIssueNumber(url string) string {
return ""
}
func findMilestoneNumber(milestones []github.Milestone, name string) (int, error) {
for _, milestone := range milestones {
if strings.EqualFold(milestone.Title, name) {
return milestone.Number, nil
}
}
return 0, fmt.Errorf("error: no milestone found with name '%s'", name)
}

Просмотреть файл

@ -38,7 +38,7 @@ complete -f -c hub -n ' __fish_hub_using_command pull-request' -s p -d "Push the
complete -f -c hub -n ' __fish_hub_using_command pull-request' -s b -d 'The base branch in "[OWNER:]BRANCH" format'
complete -f -c hub -n ' __fish_hub_using_command pull-request' -s h -d 'The head branch in "[OWNER:]BRANCH" format'
complete -f -c hub -n ' __fish_hub_using_command pull-request' -s a -d 'A comma-separated list of GitHub handles to assign to this pull request'
complete -f -c hub -n ' __fish_hub_using_command pull-request' -s M -d "Add this pull request to a GitHub milestone with id <ID>"
complete -f -c hub -n ' __fish_hub_using_command pull-request' -s M -d "The milestone name to add to this pull request. Passing the milestone number is deprecated."
complete -f -c hub -n ' __fish_hub_using_command pull-request' -s l -d "Add a comma-separated list of labels to this pull request"
# fork
complete -f -c hub -n ' __fish_hub_using_command fork' -l no-remote -d "Skip adding a git remote for the fork"

Просмотреть файл

@ -757,19 +757,86 @@ BODY
Given I am on the "feature" branch with upstream "origin/feature"
Given the GitHub API server:
"""
get('/repos/mislav/coral/milestones') {
status 200
json [
{ :number => 237, :title => "prerelease" },
{ :number => 1337, :title => "v1" },
{ :number => 41319, :title => "Hello World!" }
]
}
post('/repos/mislav/coral/pulls') {
assert :head => "mislav:feature"
status 201
json :html_url => "the://url", :number => 1234
}
patch('/repos/mislav/coral/issues/1234') {
assert :milestone => 1234
assert :milestone => 41319
json :html_url => "the://url"
}
"""
When I successfully run `hub pull-request -m hereyougo -M 1234`
When I successfully run `hub pull-request -m hereyougo -M "Hello World!"`
Then the output should contain exactly "the://url\n"
Scenario: Pull request with case-insensitive milestone
Given I am on the "feature" branch with upstream "origin/feature"
Given the GitHub API server:
"""
get('/repos/mislav/coral/milestones') {
status 200
json [
{ :number => 237, :title => "prerelease" },
{ :number => 1337, :title => "v1" },
{ :number => 41319, :title => "Hello World!" }
]
}
post('/repos/mislav/coral/pulls') {
assert :head => "mislav:feature"
status 201
json :html_url => "the://url", :number => 1234
}
patch('/repos/mislav/coral/issues/1234') {
assert :milestone => 41319
json :html_url => "the://url"
}
"""
When I successfully run `hub pull-request -m hereyougo -M "hello world!"`
Then the output should contain exactly "the://url\n"
Scenario: Pull request uses integer milestone number for BC
Given I am on the "feature" branch with upstream "origin/feature"
Given the GitHub API server:
"""
get('/repos/mislav/coral/milestones') {
status 200
json [{ :number => 237, :title => "prerelease" }]
}
post('/repos/mislav/coral/pulls') {
assert :head => "mislav:feature"
status 201
json :html_url => "the://url", :number => 1234
}
patch('/repos/mislav/coral/issues/1234') {
assert :milestone => 55
json :html_url => "the://url"
}
"""
When I successfully run `hub pull-request -m hereyougo -M 55`
Then the output should contain exactly "the://url\n"
Scenario: Pull request fails with unknown milestone before it's created
Given I am on the "feature" branch with upstream "origin/feature"
Given the GitHub API server:
"""
get('/repos/mislav/coral/milestones') {
status 200
json []
}
"""
When I run `hub pull-request -m hereyougo -M "unknown"`
Then the exit status should be 1
And the stderr should contain exactly "error: no milestone found with name 'unknown'\n"
Scenario: Pull request with labels
Given I am on the "feature" branch with upstream "origin/feature"
Given the GitHub API server:

Просмотреть файл

@ -635,6 +635,34 @@ func (client *Client) FetchLabels(project *Project) (labels []IssueLabel, err er
return
}
func (client *Client) FetchMilestones(project *Project) (milestones []Milestone, err error) {
api, err := client.simpleApi()
if err != nil {
return
}
path := fmt.Sprintf("repos/%s/%s/milestones?per_page=100", project.Owner, project.Name)
milestones = []Milestone{}
var res *simpleResponse
for path != "" {
res, err = api.Get(path)
if err = checkStatus(200, "fetching milestones", res, err); err != nil {
return
}
path = res.Link("next")
milestonesPage := []Milestone{}
if err = res.Unmarshal(&milestonesPage); err != nil {
return
}
milestones = append(milestones, milestonesPage...)
}
return
}
func (client *Client) CurrentUser() (user *User, err error) {
api, err := client.simpleApi()
if err != nil {