1package commands
2
3import (
4 "fmt"
5 "strings"
6
7 "github.com/MichaelMure/git-bug/bug"
8 "github.com/MichaelMure/git-bug/cache"
9 "github.com/MichaelMure/git-bug/util/colors"
10 "github.com/spf13/cobra"
11)
12
13var (
14 lsStatusQuery []string
15 lsAuthorQuery []string
16 lsLabelQuery []string
17 lsNoQuery []string
18 lsSortBy string
19 lsSortDirection string
20)
21
22func runLsBug(cmd *cobra.Command, args []string) error {
23 backend, err := cache.NewRepoCache(repo)
24 if err != nil {
25 return err
26 }
27 defer backend.Close()
28
29 var query *cache.Query
30 if len(args) >= 1 {
31 query, err = cache.ParseQuery(strings.Join(args, " "))
32
33 if err != nil {
34 return err
35 }
36 } else {
37 query, err = lsQueryFromFlags()
38 if err != nil {
39 return err
40 }
41 }
42
43 allIds := backend.QueryBugs(query)
44
45 for _, id := range allIds {
46 b, err := backend.ResolveBug(id)
47 if err != nil {
48 return err
49 }
50
51 snapshot := b.Snapshot()
52
53 var author bug.Person
54
55 if len(snapshot.Comments) > 0 {
56 create := snapshot.Comments[0]
57 author = create.Author
58 }
59
60 // truncate + pad if needed
61 titleFmt := fmt.Sprintf("%-50.50s", snapshot.Title)
62 authorFmt := fmt.Sprintf("%-15.15s", author.DisplayName())
63
64 fmt.Printf("%s %s\t%s\t%s\t%s\n",
65 colors.Cyan(b.HumanId()),
66 colors.Yellow(snapshot.Status),
67 titleFmt,
68 colors.Magenta(authorFmt),
69 snapshot.Summary(),
70 )
71 }
72
73 return nil
74}
75
76// Transform the command flags into a query
77func lsQueryFromFlags() (*cache.Query, error) {
78 query := cache.NewQuery()
79
80 for _, status := range lsStatusQuery {
81 f, err := cache.StatusFilter(status)
82 if err != nil {
83 return nil, err
84 }
85 query.Status = append(query.Status, f)
86 }
87
88 for _, author := range lsAuthorQuery {
89 f := cache.AuthorFilter(author)
90 query.Author = append(query.Author, f)
91 }
92
93 for _, label := range lsLabelQuery {
94 f := cache.LabelFilter(label)
95 query.Label = append(query.Label, f)
96 }
97
98 for _, no := range lsNoQuery {
99 switch no {
100 case "label":
101 query.NoFilters = append(query.NoFilters, cache.NoLabelFilter())
102 default:
103 return nil, fmt.Errorf("unknown \"no\" filter %s", no)
104 }
105 }
106
107 switch lsSortBy {
108 case "id":
109 query.OrderBy = cache.OrderById
110 case "creation":
111 query.OrderBy = cache.OrderByCreation
112 case "edit":
113 query.OrderBy = cache.OrderByEdit
114 default:
115 return nil, fmt.Errorf("unknown sort flag %s", lsSortBy)
116 }
117
118 switch lsSortDirection {
119 case "asc":
120 query.OrderDirection = cache.OrderAscending
121 case "desc":
122 query.OrderDirection = cache.OrderDescending
123 default:
124 return nil, fmt.Errorf("unknown sort direction %s", lsSortDirection)
125 }
126
127 return query, nil
128}
129
130var lsCmd = &cobra.Command{
131 Use: "ls [<query>]",
132 Short: "List bugs",
133 Long: `Display a summary of each bugs.
134
135You can pass an additional query to filter and order the list. This query can be expressed either with a simple query language or with flags.`,
136 Example: `List open bugs sorted by last edition with a query:
137git bug ls status:open sort:edit-desc
138
139List closed bugs sorted by creation with flags:
140git bug ls --status closed --by creation
141`,
142 RunE: runLsBug,
143}
144
145func init() {
146 RootCmd.AddCommand(lsCmd)
147
148 lsCmd.Flags().SortFlags = false
149
150 lsCmd.Flags().StringSliceVarP(&lsStatusQuery, "status", "s", nil,
151 "Filter by status. Valid values are [open,closed]")
152 lsCmd.Flags().StringSliceVarP(&lsAuthorQuery, "author", "a", nil,
153 "Filter by author")
154 lsCmd.Flags().StringSliceVarP(&lsLabelQuery, "label", "l", nil,
155 "Filter by label")
156 lsCmd.Flags().StringSliceVarP(&lsNoQuery, "no", "n", nil,
157 "Filter by absence of something. Valid values are [label]")
158 lsCmd.Flags().StringVarP(&lsSortBy, "by", "b", "creation",
159 "Sort the results by a characteristic. Valid values are [id,creation,edit]")
160 lsCmd.Flags().StringVarP(&lsSortDirection, "direction", "d", "asc",
161 "Select the sorting direction. Valid values are [asc,desc]")
162}