Support --web flag in issue and pr list

This commit is contained in:
AliabbasMerchant 2020-06-28 19:50:42 +05:30
parent 15a7ab6b92
commit c12243ce10
3 changed files with 77 additions and 2 deletions

View file

@ -37,6 +37,7 @@ func init() {
issueCreateCmd.Flags().StringP("milestone", "m", "", "Add the issue to a milestone by `name`")
issueCmd.AddCommand(issueListCmd)
issueListCmd.Flags().BoolP("web", "w", false, "Open the browser to list the issue(s)")
issueListCmd.Flags().StringP("assignee", "a", "", "Filter by assignee")
issueListCmd.Flags().StringSliceP("label", "l", nil, "Filter by labels")
issueListCmd.Flags().StringP("state", "s", "open", "Filter by state: {open|closed|all}")
@ -84,6 +85,7 @@ var issueListCmd = &cobra.Command{
Example: heredoc.Doc(`
$ gh issue list -l "help wanted"
$ gh issue list -A monalisa
$ gh issue list --web
`),
Args: cmdutil.NoArgsQuoteReminder,
RunE: issueList,
@ -116,6 +118,33 @@ var issueReopenCmd = &cobra.Command{
RunE: issueReopen,
}
func listURLWithQuery(listURL, entity, state, assignee string, labels []string, author, baseBranch string) (string, error) {
u, err := url.Parse(listURL)
if err != nil {
return "", err
}
queries := fmt.Sprintf("is:%s ", entity)
if state != "all" {
queries += fmt.Sprintf("is:%s ", state)
}
if assignee != "" {
queries += fmt.Sprintf("assignee:%s ", assignee)
}
for _, label := range labels {
queries += fmt.Sprintf("label:%s ", label)
}
if author != "" {
queries += fmt.Sprintf("author:%s ", author)
}
if baseBranch != "" {
queries += fmt.Sprintf("base:%s ", baseBranch)
}
q := u.Query()
q.Set("q", queries)
u.RawQuery = q.Encode()
return u.String(), nil
}
func issueList(cmd *cobra.Command, args []string) error {
ctx := contextForCommand(cmd)
apiClient, err := apiClientForContext(ctx)
@ -128,6 +157,11 @@ func issueList(cmd *cobra.Command, args []string) error {
return err
}
web, err := cmd.Flags().GetBool("web")
if err != nil {
return err
}
state, err := cmd.Flags().GetString("state")
if err != nil {
return err
@ -156,6 +190,19 @@ func issueList(cmd *cobra.Command, args []string) error {
return err
}
if web {
issueListURL := fmt.Sprintf(
"https://github.com/%s/issues",
ghrepo.FullName(baseRepo),
)
openURL, err := listURLWithQuery(issueListURL, "issue", state, assignee, labels, author, "")
if err != nil {
return err
}
fmt.Fprintf(cmd.ErrOrStderr(), "Opening %s in your browser.\n", openURL)
return utils.OpenInBrowser(openURL)
}
listResult, err := api.IssueList(apiClient, baseRepo, state, labels, assignee, limit, author)
if err != nil {
return err

View file

@ -37,11 +37,13 @@ func init() {
prCmd.AddCommand(prReadyCmd)
prCmd.AddCommand(prListCmd)
prListCmd.Flags().BoolP("web", "w", false, "Open the browser to list the pull request(s)")
prListCmd.Flags().IntP("limit", "L", 30, "Maximum number of items to fetch")
prListCmd.Flags().StringP("state", "s", "open", "Filter by state: {open|closed|merged|all}")
prListCmd.Flags().StringP("base", "B", "", "Filter by base branch")
prListCmd.Flags().StringSliceP("label", "l", nil, "Filter by label")
prListCmd.Flags().StringSliceP("label", "l", nil, "Filter by labels")
prListCmd.Flags().StringP("assignee", "a", "", "Filter by assignee")
prListCmd.Flags().StringP("author", "A", "", "Filter by author")
prCmd.AddCommand(prViewCmd)
prViewCmd.Flags().BoolP("web", "w", false, "Open a pull request in the browser")
@ -71,6 +73,7 @@ var prListCmd = &cobra.Command{
$ gh pr list --limit 999
$ gh pr list --state closed
$ gh pr list --label "priority 1" --label "bug"
$ gh pr list --web
`),
RunE: prList,
}
@ -194,6 +197,11 @@ func prList(cmd *cobra.Command, args []string) error {
return err
}
web, err := cmd.Flags().GetBool("web")
if err != nil {
return err
}
limit, err := cmd.Flags().GetInt("limit")
if err != nil {
return err
@ -218,6 +226,26 @@ func prList(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}
author, err := cmd.Flags().GetString("author")
if err != nil {
return err
}
if author != "" && !web {
return errors.New("the --author flag is currently supported only with --web")
}
if web {
prListURL := fmt.Sprintf(
"https://github.com/%s/pulls",
ghrepo.FullName(baseRepo),
)
openURL, err := listURLWithQuery(prListURL, "pr", state, assignee, labels, author, baseBranch)
if err != nil {
return err
}
fmt.Fprintf(cmd.ErrOrStderr(), "Opening %s in your browser.\n", openURL)
return utils.OpenInBrowser(openURL)
}
var graphqlState []string
switch state {

View file

@ -412,7 +412,7 @@ func determineTrackingBranch(remotes context.Remotes, headBranch string) *git.Tr
func withPrAndIssueQueryParams(baseURL, title, body string, assignees, labels, projects []string, milestone string) (string, error) {
u, err := url.Parse(baseURL)
if err != nil {
return "", nil
return "", err
}
q := u.Query()
if title != "" {