diff --git a/commands/pr.go b/commands/pr.go index ca786d5fcac3d8b1c583f7f7489b0c3f29c346db..8e0637ce6e1a8e906f5a50c9d572e676e470d02c 100644 --- a/commands/pr.go +++ b/commands/pr.go @@ -17,7 +17,7 @@ var ( Usage: ` pr list [-s ] [-h ] [-b ] [-o [-^]] [-f ] [-L ] pr checkout [] -pr show [-uc] [-h ] +pr show [-uc] [-h ] [-f ] pr show [-uc] `, Long: `Manage GitHub Pull Requests for the current repository. @@ -160,13 +160,9 @@ hub-issue(1), hub-pull-request(1), hub(1) } cmdShowPr = &Command{ - Key: "show", - Run: showPr, - KnownFlags: ` - -h, --head HEAD - -u, --url - -c, --copy -`, + Key: "show", + Run: showPr, + Long: cmdPr.Long, } ) @@ -283,8 +279,9 @@ func showPr(command *Command, args *Args) { words := args.Words() openUrl := "" + prNumber := 0 if len(words) > 0 { - if prNumber, err := strconv.Atoi(words[0]); err == nil { + if prNumber, err = strconv.Atoi(words[0]); err == nil { openUrl = baseProject.WebURL("", "", fmt.Sprintf("pull/%d", prNumber)) } else { utils.Check(fmt.Errorf("invalid pull request number: '%s'", words[0])) @@ -293,12 +290,26 @@ func showPr(command *Command, args *Args) { pr, err := findCurrentPullRequest(localRepo, baseProject, args.Flag.Value("--head")) utils.Check(err) openUrl = pr.HtmlUrl + prNumber = pr.Number } args.NoForward() - printUrl := args.Flag.Bool("--url") - copyUrl := args.Flag.Bool("--copy") - printBrowseOrCopy(args, openUrl, !printUrl && !copyUrl, copyUrl) + if format := args.Flag.Value("--format"); format != "" { + host, err := github.CurrentConfig().PromptForHost(baseProject.Host) + utils.Check(err) + client := github.NewClientWithHost(host) + pr, err := client.PullRequest(baseProject, strconv.Itoa(prNumber)) + utils.Check(err) + + // ui.Println(pr.Number) + colorize := colorizeOutput(args.Flag.HasReceived("--color"), args.Flag.Value("--color")) + ui.Println(formatPullRequest(*pr, format, colorize)) + } else { + printUrl := args.Flag.Bool("--url") + copyUrl := args.Flag.Bool("--copy") + + printBrowseOrCopy(args, openUrl, !printUrl && !copyUrl, copyUrl) + } } func findCurrentPullRequest(localRepo *github.GitHubRepo, baseProject *github.Project, headArg string) (*github.PullRequest, error) { diff --git a/features/pr-show.feature b/features/pr-show.feature index f39e6b5401e9a853ddebfbee8403f2c2ffaee0ba..5b69eb0261f8a80b0d0fee529e0653c273732f97 100644 --- a/features/pr-show.feature +++ b/features/pr-show.feature @@ -35,6 +35,48 @@ Feature: hub pr show And the output should contain exactly: """ https://github.com/ashemesh/hub/pull/102\n + """ + + Scenario: Format Current branch output URL + Given I am on the "topic" branch + Given the GitHub API server: + """ + get('/repos/ashemesh/hub/pulls'){ + assert :state => "open", + :head => "ashemesh:topic" + json [ + { + :html_url => "https://github.com/ashemesh/hub/pull/102", + :number => 102 + }, + ] + } + + get('/repos/ashemesh/hub/pulls/102') { + json :number => 999, + :title => "First", + :state => "open", + :base => { + :ref => "master", + :label => "github:master", + :repo => { :owner => { :login => "github" } } + }, + :head => { :ref => "patch-1", :label => "octocat:patch-1" }, + :user => { :login => "octocat" }, + :requested_reviewers => [ + { :login => "rey" }, + ], + :requested_teams => [ + { :slug => "troopers" }, + { :slug => "cantina-band" }, + ] + } + """ + When I successfully run `hub pr show -f "%sC%>(8)%i %rs%n"` + Then "open https://github.com/ashemesh/hub/pull/102" should not be run + And the output should contain exactly: + """ + #999 rey, github/troopers, github/cantina-band\n """ Scenario: Current branch in fork @@ -146,6 +188,36 @@ Feature: hub pr show When I successfully run `hub pr show 102` Then "open https://github.com/ashemesh/hub/pull/102" should be run + Scenario: Format pull request by number + Given the GitHub API server: + """ + get('/repos/ashemesh/hub/pulls/102') { + json :number => 999, + :title => "First", + :state => "open", + :base => { + :ref => "master", + :label => "github:master", + :repo => { :owner => { :login => "github" } } + }, + :head => { :ref => "patch-1", :label => "octocat:patch-1" }, + :user => { :login => "octocat" }, + :requested_reviewers => [ + { :login => "rey" }, + ], + :requested_teams => [ + { :slug => "troopers" }, + { :slug => "cantina-band" }, + ] + } + """ + When I successfully run `hub pr show 102 -f "%sC%>(8)%i %rs%n"` + Then "open https://github.com/ashemesh/hub/pull/102" should not be run + And the output should contain exactly: + """ + #999 rey, github/troopers, github/cantina-band\n + """ + Scenario: Show pull request by invalid number When I run `hub pr show XYZ` Then the exit status should be 1