diff options
author | vince <vincetiu8@gmail.com> | 2020-06-14 08:41:50 +0800 |
---|---|---|
committer | Michael Muré <batolettre@gmail.com> | 2020-06-16 15:05:48 +0200 |
commit | de5565b5f9830556afa7bb5a95fa4e3f27a755c5 (patch) | |
tree | 3051a8ebe1a874cc36c69eb314eebd46e2c80d70 /commands/ls.go | |
parent | 6352d6aa2338f47cd8b60631dec5f4161d9d92ec (diff) | |
download | git-bug-de5565b5f9830556afa7bb5a95fa4e3f27a755c5.tar.gz |
ls: Add support to ls dump bug information in specific formats
This adds an optional flag to the ls command that allows users to specify the format they wish to dump the output as. Currently, supported parameters are 'default', 'plain' and 'json'.
Diffstat (limited to 'commands/ls.go')
-rw-r--r-- | commands/ls.go | 126 |
1 files changed, 121 insertions, 5 deletions
diff --git a/commands/ls.go b/commands/ls.go index f125d916..fa3271e7 100644 --- a/commands/ls.go +++ b/commands/ls.go @@ -1,8 +1,10 @@ package commands import ( + "encoding/json" "fmt" "strings" + "time" text "github.com/MichaelMure/go-term-text" "github.com/spf13/cobra" @@ -21,9 +23,10 @@ var ( lsNoQuery []string lsSortBy string lsSortDirection string + lsOutputFormat string ) -func runLsBug(cmd *cobra.Command, args []string) error { +func runLsBug(_ *cobra.Command, args []string) error { backend, err := cache.NewRepoCache(repo) if err != nil { return err @@ -48,20 +51,125 @@ func runLsBug(cmd *cobra.Command, args []string) error { allIds := backend.QueryBugs(q) - for _, id := range allIds { + bugExcerpt := make([]*cache.BugExcerpt, len(allIds)) + for i, id := range allIds { b, err := backend.ResolveBugExcerpt(id) if err != nil { return err } + bugExcerpt[i] = b + } + + switch lsOutputFormat { + case "plain": + return lsPlainFormatter(backend, bugExcerpt) + case "json": + return lsJsonFormatter(backend, bugExcerpt) + case "default": + return lsDefaultFormatter(backend, bugExcerpt) + default: + return fmt.Errorf("unknown format %s", lsOutputFormat) + } +} +type JSONBug struct { + Id string `json:"id"` + HumanId string `json:"human_id"` + CreationTime time.Time `json:"creation_time"` + LastEdited time.Time `json:"last_edited"` + + Status string `json:"status"` + Labels []bug.Label `json:"labels"` + Title string `json:"title"` + Actors []JSONIdentity `json:"actors"` + Participants []JSONIdentity `json:"participants"` + Author JSONIdentity `json:"author"` + + Comments int `json:"comments"` + Metadata map[string]string `json:"metadata"` +} + +type JSONIdentity struct { + Id string `json:"id"` + HumanId string `json:"human_id"` + Name string `json:"name"` + Login string `json:"login"` +} + +func lsJsonFormatter(backend *cache.RepoCache, bugExcerpts []*cache.BugExcerpt) error { + for _, b := range bugExcerpts { + jsonBug := JSONBug{ + b.Id.String(), + b.Id.Human(), + time.Unix(b.CreateUnixTime, 0), + time.Unix(b.EditUnixTime, 0), + b.Status.String(), + b.Labels, + b.Title, + []JSONIdentity{}, + []JSONIdentity{}, + JSONIdentity{}, + b.LenComments, + b.CreateMetadata, + } + + if b.AuthorId != "" { + author, err := backend.ResolveIdentityExcerpt(b.AuthorId) + if err != nil { + return err + } + + jsonBug.Author.Name = author.DisplayName() + jsonBug.Author.Login = author.Login + jsonBug.Author.Id = author.Id.String() + jsonBug.Author.HumanId = author.Id.Human() + } else { + jsonBug.Author.Name = b.LegacyAuthor.DisplayName() + jsonBug.Author.Login = b.LegacyAuthor.Login + } + + for _, element := range b.Actors { + actor, err := backend.ResolveIdentityExcerpt(element) + if err != nil { + return err + } + + jsonBug.Actors = append(jsonBug.Actors, JSONIdentity{ + actor.Id.String(), + actor.Id.Human(), + actor.Name, + actor.Login, + }) + } + + for _, element := range b.Participants { + participant, err := backend.ResolveIdentityExcerpt(element) + if err != nil { + return err + } + jsonBug.Participants = append(jsonBug.Participants, JSONIdentity{ + participant.Id.String(), + participant.Id.Human(), + participant.DisplayName(), + participant.Login, + }) + } + + jsonObject, _ := json.MarshalIndent(jsonBug, "", " ") + fmt.Printf("%s\n", jsonObject) + } + return nil +} + +func lsDefaultFormatter(backend *cache.RepoCache, bugExcerpts []*cache.BugExcerpt) error { + for _, b := range bugExcerpts { var name string if b.AuthorId != "" { author, err := backend.ResolveIdentityExcerpt(b.AuthorId) if err != nil { - name = "<missing author data>" - } else { - name = author.DisplayName() + return err } + name = author.DisplayName() } else { name = b.LegacyAuthor.DisplayName() } @@ -92,7 +200,13 @@ func runLsBug(cmd *cobra.Command, args []string) error { comments, ) } + return nil +} +func lsPlainFormatter(backend *cache.RepoCache, bugExcerpts []*cache.BugExcerpt) error { + for _, b := range bugExcerpts { + fmt.Printf("[%s] %s\n", b.Status, b.Title) + } return nil } @@ -177,4 +291,6 @@ func init() { "Sort the results by a characteristic. Valid values are [id,creation,edit]") lsCmd.Flags().StringVarP(&lsSortDirection, "direction", "d", "asc", "Select the sorting direction. Valid values are [asc,desc]") + lsCmd.Flags().StringVarP(&lsOutputFormat, "format", "f", "default", + "Select the output formatting style. Valid values are [default, plain(text), json]") } |