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  }