aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--commands/ls.go128
-rw-r--r--doc/man/git-bug-ls.14
-rw-r--r--doc/md/git-bug_ls.md1
-rw-r--r--misc/bash_completion/git-bug4
-rw-r--r--misc/powershell_completion/git-bug2
-rw-r--r--misc/zsh_completion/git-bug3
6 files changed, 136 insertions, 6 deletions
diff --git a/commands/ls.go b/commands/ls.go
index f125d916..68cb0cfc 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,127 @@ 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 {
+ jsonBugs := make([]JSONBug, len(bugExcerpts))
+ for i, 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,
+ })
+ }
+
+ jsonBugs[i] = jsonBug
+ }
+ jsonObject, _ := json.MarshalIndent(jsonBugs, "", " ")
+ 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 +202,13 @@ func runLsBug(cmd *cobra.Command, args []string) error {
comments,
)
}
+ return nil
+}
+func lsPlainFormatter(_ *cache.RepoCache, bugExcerpts []*cache.BugExcerpt) error {
+ for _, b := range bugExcerpts {
+ fmt.Printf("[%s] %s\n", b.Status, b.Title)
+ }
return nil
}
@@ -177,4 +293,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]")
}
diff --git a/doc/man/git-bug-ls.1 b/doc/man/git-bug-ls.1
index 2fc1d337..5d05cfcd 100644
--- a/doc/man/git-bug-ls.1
+++ b/doc/man/git-bug-ls.1
@@ -58,6 +58,10 @@ You can pass an additional query to filter and order the list. This query can be
Select the sorting direction. Valid values are [asc,desc]
.PP
+\fB\-f\fP, \fB\-\-format\fP="default"
+ Select the output formatting style. Valid values are [default, plain(text), json]
+
+.PP
\fB\-h\fP, \fB\-\-help\fP[=false]
help for ls
diff --git a/doc/md/git-bug_ls.md b/doc/md/git-bug_ls.md
index 085a70c9..32941e4f 100644
--- a/doc/md/git-bug_ls.md
+++ b/doc/md/git-bug_ls.md
@@ -35,6 +35,7 @@ git bug ls --status closed --by creation
-n, --no strings Filter by absence of something. Valid values are [label]
-b, --by string Sort the results by a characteristic. Valid values are [id,creation,edit] (default "creation")
-d, --direction string Select the sorting direction. Valid values are [asc,desc] (default "asc")
+ -f, --format string Select the output formatting style. Valid values are [default, plain(text), json] (default "default")
-h, --help help for ls
```
diff --git a/misc/bash_completion/git-bug b/misc/bash_completion/git-bug
index b86edb9f..93c75b8e 100644
--- a/misc/bash_completion/git-bug
+++ b/misc/bash_completion/git-bug
@@ -807,6 +807,10 @@ _git-bug_ls()
two_word_flags+=("--direction")
two_word_flags+=("-d")
local_nonpersistent_flags+=("--direction=")
+ flags+=("--format=")
+ two_word_flags+=("--format")
+ two_word_flags+=("-f")
+ local_nonpersistent_flags+=("--format=")
must_have_one_flag=()
must_have_one_noun=()
diff --git a/misc/powershell_completion/git-bug b/misc/powershell_completion/git-bug
index d674ad9b..9f51c785 100644
--- a/misc/powershell_completion/git-bug
+++ b/misc/powershell_completion/git-bug
@@ -159,6 +159,8 @@ Register-ArgumentCompleter -Native -CommandName 'git-bug' -ScriptBlock {
[CompletionResult]::new('--by', 'by', [CompletionResultType]::ParameterName, 'Sort the results by a characteristic. Valid values are [id,creation,edit]')
[CompletionResult]::new('-d', 'd', [CompletionResultType]::ParameterName, 'Select the sorting direction. Valid values are [asc,desc]')
[CompletionResult]::new('--direction', 'direction', [CompletionResultType]::ParameterName, 'Select the sorting direction. Valid values are [asc,desc]')
+ [CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'Select the output formatting style. Valid values are [default, plain(text), json]')
+ [CompletionResult]::new('--format', 'format', [CompletionResultType]::ParameterName, 'Select the output formatting style. Valid values are [default, plain(text), json]')
break
}
'git-bug;ls-id' {
diff --git a/misc/zsh_completion/git-bug b/misc/zsh_completion/git-bug
index 6ec6d0d0..18a49668 100644
--- a/misc/zsh_completion/git-bug
+++ b/misc/zsh_completion/git-bug
@@ -303,7 +303,8 @@ function _git-bug_ls {
'(*-t *--title)'{\*-t,\*--title}'[Filter by title]:' \
'(*-n *--no)'{\*-n,\*--no}'[Filter by absence of something. Valid values are [label]]:' \
'(-b --by)'{-b,--by}'[Sort the results by a characteristic. Valid values are [id,creation,edit]]:' \
- '(-d --direction)'{-d,--direction}'[Select the sorting direction. Valid values are [asc,desc]]:'
+ '(-d --direction)'{-d,--direction}'[Select the sorting direction. Valid values are [asc,desc]]:' \
+ '(-f --format)'{-f,--format}'[Select the output formatting style. Valid values are [default, plain(text), json]]:'
}
function _git-bug_ls-id {