github.com/matthewdale/lab@v0.14.0/cmd/issue_show.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "log" 6 "strings" 7 "time" 8 9 "github.com/spf13/cobra" 10 "github.com/xanzy/go-gitlab" 11 lab "github.com/zaquestion/lab/internal/gitlab" 12 ) 13 14 var issueShowCmd = &cobra.Command{ 15 Use: "show [remote] <id>", 16 Aliases: []string{"get"}, 17 ArgAliases: []string{"s"}, 18 Short: "Describe an issue", 19 Long: ``, 20 Run: func(cmd *cobra.Command, args []string) { 21 rn, issueNum, err := parseArgs(args) 22 if err != nil { 23 log.Fatal(err) 24 } 25 26 issue, err := lab.IssueGet(rn, int(issueNum)) 27 if err != nil { 28 log.Fatal(err) 29 } 30 31 printIssue(issue, rn) 32 }, 33 } 34 35 func printIssue(issue *gitlab.Issue, project string) { 36 milestone := "None" 37 timestats := "None" 38 dueDate := "None" 39 state := map[string]string{ 40 "opened": "Open", 41 "closed": "Closed", 42 }[issue.State] 43 if issue.Milestone != nil { 44 milestone = issue.Milestone.Title 45 } 46 if issue.TimeStats != nil && issue.TimeStats.HumanTimeEstimate != "" && 47 issue.TimeStats.HumanTotalTimeSpent != "" { 48 timestats = fmt.Sprintf( 49 "Estimated %s, Spent %s", 50 issue.TimeStats.HumanTimeEstimate, 51 issue.TimeStats.HumanTotalTimeSpent) 52 } 53 if issue.DueDate != nil { 54 dueDate = time.Time(*issue.DueDate).String() 55 } 56 assignees := make([]string, len(issue.Assignees)) 57 if len(issue.Assignees) > 0 && issue.Assignees[0].Username != "" { 58 for i, a := range issue.Assignees { 59 assignees[i] = a.Username 60 } 61 } 62 63 fmt.Printf(` 64 #%d %s 65 =================================== 66 %s 67 ----------------------------------- 68 Project: %s 69 Status: %s 70 Assignees: %s 71 Author: %s 72 Milestone: %s 73 Due Date: %s 74 Time Stats: %s 75 Labels: %s 76 WebURL: %s 77 `, 78 issue.IID, issue.Title, issue.Description, project, state, strings.Join(assignees, ", "), 79 issue.Author.Username, milestone, dueDate, timestats, 80 strings.Join(issue.Labels, ", "), issue.WebURL, 81 ) 82 } 83 84 func init() { 85 issueCmd.AddCommand(issueShowCmd) 86 }