|
| 1 | +package command |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + "strconv" |
| 6 | + |
| 7 | + "github.com/github/gh-cli/api" |
| 8 | + "github.com/github/gh-cli/utils" |
| 9 | + "github.com/spf13/cobra" |
| 10 | +) |
| 11 | + |
| 12 | +func init() { |
| 13 | + RootCmd.AddCommand(issueCmd) |
| 14 | + issueCmd.AddCommand( |
| 15 | + &cobra.Command{ |
| 16 | + Use: "list", |
| 17 | + Short: "List issues", |
| 18 | + RunE: issueList, |
| 19 | + }, |
| 20 | + &cobra.Command{ |
| 21 | + Use: "view issue-number", |
| 22 | + Args: cobra.MinimumNArgs(1), |
| 23 | + Short: "Open a issue in the browser", |
| 24 | + RunE: issueView, |
| 25 | + }, |
| 26 | + ) |
| 27 | +} |
| 28 | + |
| 29 | +var issueCmd = &cobra.Command{ |
| 30 | + Use: "issue", |
| 31 | + Short: "Work with GitHub issues", |
| 32 | + Long: `This command allows you to work with issues.`, |
| 33 | + Args: cobra.MinimumNArgs(1), |
| 34 | + RunE: func(cmd *cobra.Command, args []string) error { |
| 35 | + return fmt.Errorf("%+v is not a valid issue command", args) |
| 36 | + }, |
| 37 | +} |
| 38 | + |
| 39 | +func issueList(cmd *cobra.Command, args []string) error { |
| 40 | + cmd.SilenceUsage = true |
| 41 | + |
| 42 | + ctx := contextForCommand(cmd) |
| 43 | + apiClient, err := apiClientForContext(ctx) |
| 44 | + if err != nil { |
| 45 | + return err |
| 46 | + } |
| 47 | + |
| 48 | + baseRepo, err := ctx.BaseRepo() |
| 49 | + if err != nil { |
| 50 | + return err |
| 51 | + } |
| 52 | + |
| 53 | + currentUser, err := ctx.AuthLogin() |
| 54 | + if err != nil { |
| 55 | + return err |
| 56 | + } |
| 57 | + |
| 58 | + issuePayload, err := api.Issues(apiClient, baseRepo, currentUser) |
| 59 | + if err != nil { |
| 60 | + return err |
| 61 | + } |
| 62 | + |
| 63 | + printHeader("Issues assigned to you") |
| 64 | + if issuePayload.Assigned != nil { |
| 65 | + printIssues(issuePayload.Assigned...) |
| 66 | + } else { |
| 67 | + message := fmt.Sprintf(" There are no issues assgined to you") |
| 68 | + printMessage(message) |
| 69 | + } |
| 70 | + fmt.Println() |
| 71 | + |
| 72 | + printHeader("Issues mentioning you") |
| 73 | + if len(issuePayload.Mentioned) > 0 { |
| 74 | + printIssues(issuePayload.Mentioned...) |
| 75 | + } else { |
| 76 | + printMessage(" There are no issues mentioning you") |
| 77 | + } |
| 78 | + fmt.Println() |
| 79 | + |
| 80 | + printHeader("Recent issues") |
| 81 | + if len(issuePayload.Recent) > 0 { |
| 82 | + printIssues(issuePayload.Recent...) |
| 83 | + } else { |
| 84 | + printMessage(" There are no recent issues") |
| 85 | + } |
| 86 | + fmt.Println() |
| 87 | + |
| 88 | + return nil |
| 89 | +} |
| 90 | + |
| 91 | +func issueView(cmd *cobra.Command, args []string) error { |
| 92 | + cmd.SilenceUsage = true |
| 93 | + |
| 94 | + ctx := contextForCommand(cmd) |
| 95 | + |
| 96 | + baseRepo, err := ctx.BaseRepo() |
| 97 | + if err != nil { |
| 98 | + return err |
| 99 | + } |
| 100 | + |
| 101 | + var openURL string |
| 102 | + if number, err := strconv.Atoi(args[0]); err == nil { |
| 103 | + // TODO: move URL generation into GitHubRepository |
| 104 | + openURL = fmt.Sprintf("https://github.com/%s/%s/issues/%d", baseRepo.RepoOwner(), baseRepo.RepoName(), number) |
| 105 | + } else { |
| 106 | + return fmt.Errorf("invalid issue number: '%s'", args[0]) |
| 107 | + } |
| 108 | + |
| 109 | + fmt.Printf("Opening %s in your browser.\n", openURL) |
| 110 | + return utils.OpenInBrowser(openURL) |
| 111 | +} |
| 112 | + |
| 113 | +func printIssues(issues ...api.Issue) { |
| 114 | + for _, issue := range issues { |
| 115 | + fmt.Printf(" #%d %s\n", issue.Number, truncateTitle(issue.Title, 70)) |
| 116 | + } |
| 117 | +} |
0 commit comments