commands/variable/list/list.go (111 lines of code) (raw):
package list
import (
"encoding/json"
"fmt"
"github.com/MakeNowJust/heredoc/v2"
"github.com/spf13/cobra"
gitlab "gitlab.com/gitlab-org/api/client-go"
"gitlab.com/gitlab-org/cli/api"
"gitlab.com/gitlab-org/cli/commands/cmdutils"
"gitlab.com/gitlab-org/cli/commands/flag"
"gitlab.com/gitlab-org/cli/internal/glrepo"
"gitlab.com/gitlab-org/cli/pkg/iostreams"
"gitlab.com/gitlab-org/cli/pkg/tableprinter"
)
type ListOpts struct {
HTTPClient func() (*gitlab.Client, error)
IO *iostreams.IOStreams
BaseRepo func() (glrepo.Interface, error)
Page int
PerPage int
ValueSet bool
Group string
OutputFormat string
}
func NewCmdList(f *cmdutils.Factory, runE func(opts *ListOpts) error) *cobra.Command {
opts := &ListOpts{
IO: f.IO,
}
cmd := &cobra.Command{
Use: "list",
Short: "List variables for a project or group.",
Aliases: []string{"ls"},
Args: cobra.ExactArgs(0),
Example: heredoc.Doc(`
$ glab variable list
$ glab variable list --per-page 100 --page 1
$ glab variable list --group gitlab-org
$ glab variable list --group gitlab-org --per-page 100
`,
),
RunE: func(cmd *cobra.Command, args []string) (err error) {
// Supports repo override
opts.HTTPClient = f.HttpClient
opts.BaseRepo = f.BaseRepo
group, err := flag.GroupOverride(cmd)
if err != nil {
return err
}
opts.Group = group
if runE != nil {
err = runE(opts)
return
}
err = listRun(opts)
return
},
}
cmdutils.EnableRepoOverride(cmd, f)
cmd.PersistentFlags().StringP("group", "g", "", "Select a group or subgroup. Ignored if a repository argument is set.")
cmd.Flags().StringVarP(&opts.OutputFormat, "output", "F", "text", "Format output as: text, json.")
cmd.Flags().IntVarP(&opts.PerPage, "per-page", "P", 20, "Number of items to list per page.")
cmd.Flags().IntVarP(&opts.Page, "page", "p", 1, "Page number.")
return cmd
}
func listRun(opts *ListOpts) error {
color := opts.IO.Color()
httpClient, err := opts.HTTPClient()
if err != nil {
return err
}
table := tableprinter.NewTablePrinter()
table.AddRow("KEY", "PROTECTED", "MASKED", "EXPANDED", "SCOPE", "DESCRIPTION")
if opts.Group != "" {
opts.IO.Logf("Listing variables for the %s group:\n\n", color.Bold(opts.Group))
createVarOpts := &gitlab.ListGroupVariablesOptions{Page: opts.Page, PerPage: opts.PerPage}
variables, err := api.ListGroupVariables(httpClient, opts.Group, createVarOpts)
if err != nil {
return err
}
if opts.OutputFormat == "json" {
varListJSON, _ := json.Marshal(variables)
fmt.Fprintln(opts.IO.StdOut, string(varListJSON))
} else {
for _, variable := range variables {
table.AddRow(variable.Key, variable.Protected, variable.Masked, !variable.Raw, variable.EnvironmentScope, variable.Description)
}
}
} else {
repo, err := opts.BaseRepo()
if err != nil {
return err
}
opts.IO.Logf("Listing variables for the %s project:\n\n", color.Bold(repo.FullName()))
createVarOpts := &gitlab.ListProjectVariablesOptions{Page: opts.Page, PerPage: opts.PerPage}
variables, err := api.ListProjectVariables(httpClient, repo.FullName(), createVarOpts)
if err != nil {
return err
}
if opts.OutputFormat == "json" {
varListJSON, _ := json.Marshal(variables)
fmt.Fprintln(opts.IO.StdOut, string(varListJSON))
} else {
for _, variable := range variables {
table.AddRow(variable.Key, variable.Protected, variable.Masked, !variable.Raw, variable.EnvironmentScope, variable.Description)
}
}
}
if opts.OutputFormat != "json" {
fmt.Fprint(opts.IO.StdOut, table.String())
}
return nil
}