github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/release/list/list.go (about) 1 package list 2 3 import ( 4 "fmt" 5 "net/http" 6 7 "github.com/ungtb10d/cli/v2/internal/ghrepo" 8 "github.com/ungtb10d/cli/v2/internal/tableprinter" 9 "github.com/ungtb10d/cli/v2/internal/text" 10 "github.com/ungtb10d/cli/v2/pkg/cmdutil" 11 "github.com/ungtb10d/cli/v2/pkg/iostreams" 12 "github.com/spf13/cobra" 13 ) 14 15 type ListOptions struct { 16 HttpClient func() (*http.Client, error) 17 IO *iostreams.IOStreams 18 BaseRepo func() (ghrepo.Interface, error) 19 20 LimitResults int 21 ExcludeDrafts bool 22 } 23 24 func NewCmdList(f *cmdutil.Factory, runF func(*ListOptions) error) *cobra.Command { 25 opts := &ListOptions{ 26 IO: f.IOStreams, 27 HttpClient: f.HttpClient, 28 } 29 30 cmd := &cobra.Command{ 31 Use: "list", 32 Short: "List releases in a repository", 33 Aliases: []string{"ls"}, 34 Args: cobra.NoArgs, 35 RunE: func(cmd *cobra.Command, args []string) error { 36 // support `-R, --repo` override 37 opts.BaseRepo = f.BaseRepo 38 39 if runF != nil { 40 return runF(opts) 41 } 42 return listRun(opts) 43 }, 44 } 45 46 cmd.Flags().IntVarP(&opts.LimitResults, "limit", "L", 30, "Maximum number of items to fetch") 47 cmd.Flags().BoolVar(&opts.ExcludeDrafts, "exclude-drafts", false, "Exclude draft releases") 48 49 return cmd 50 } 51 52 func listRun(opts *ListOptions) error { 53 httpClient, err := opts.HttpClient() 54 if err != nil { 55 return err 56 } 57 58 baseRepo, err := opts.BaseRepo() 59 if err != nil { 60 return err 61 } 62 63 releases, err := fetchReleases(httpClient, baseRepo, opts.LimitResults, opts.ExcludeDrafts) 64 if err != nil { 65 return err 66 } 67 68 if len(releases) == 0 { 69 return cmdutil.NewNoResultsError("no releases found") 70 } 71 72 if err := opts.IO.StartPager(); err == nil { 73 defer opts.IO.StopPager() 74 } else { 75 fmt.Fprintf(opts.IO.ErrOut, "failed to start pager: %v\n", err) 76 } 77 78 table := tableprinter.New(opts.IO) 79 iofmt := opts.IO.ColorScheme() 80 table.HeaderRow("Title", "Type", "Tag name", "Published") 81 for _, rel := range releases { 82 title := text.RemoveExcessiveWhitespace(rel.Name) 83 if title == "" { 84 title = rel.TagName 85 } 86 table.AddField(title) 87 88 badge := "" 89 var badgeColor func(string) string 90 if rel.IsLatest { 91 badge = "Latest" 92 badgeColor = iofmt.Green 93 } else if rel.IsDraft { 94 badge = "Draft" 95 badgeColor = iofmt.Red 96 } else if rel.IsPrerelease { 97 badge = "Pre-release" 98 badgeColor = iofmt.Yellow 99 } 100 table.AddField(badge, tableprinter.WithColor(badgeColor)) 101 102 table.AddField(rel.TagName, tableprinter.WithTruncate(nil)) 103 104 pubDate := rel.PublishedAt 105 if rel.PublishedAt.IsZero() { 106 pubDate = rel.CreatedAt 107 } 108 table.AddTimeField(pubDate, iofmt.Gray) 109 table.EndRow() 110 } 111 err = table.Render() 112 if err != nil { 113 return err 114 } 115 116 return nil 117 }