commands/config/config.go (162 lines of code) (raw):

package config import ( "fmt" "github.com/MakeNowJust/heredoc/v2" "github.com/spf13/cobra" "gitlab.com/gitlab-org/cli/commands/cmdutils" "gitlab.com/gitlab-org/cli/internal/config" "gitlab.com/gitlab-org/cli/pkg/browser" ) func NewCmdConfig(f *cmdutils.Factory) *cobra.Command { var isGlobal bool configCmd := &cobra.Command{ Use: "config [flags]", Short: `Manage glab settings.`, Long: heredoc.Docf(`Manage key/value strings. Current respected settings: - browser: If unset, uses the default browser. Override with environment variable $BROWSER. - check_update: If true, notifies of new versions of glab. Defaults to true. Override with environment variable $GLAB_CHECK_UPDATE. - display_hyperlinks: If true, and using a TTY, outputs hyperlinks for issues and merge request lists. Defaults to false. - editor: If unset, uses the default editor. Override with environment variable $EDITOR. - glab_pager: Your desired pager command to use, such as 'less -R'. - glamour_style: Your desired Markdown renderer style. Options are dark, light, notty. Custom styles are available using [glamour](https://github.com/charmbracelet/glamour#styles). - host: If unset, defaults to %[1]shttps://gitlab.com%[1]s. - token: Your GitLab access token. Defaults to environment variables. - visual: Takes precedence over 'editor'. If unset, uses the default editor. Override with environment variable $VISUAL. `, "`"), Aliases: []string{"conf"}, } configCmd.Flags().BoolVarP(&isGlobal, "global", "g", false, "Use global config file.") configCmd.AddCommand(NewCmdConfigGet(f)) configCmd.AddCommand(NewCmdConfigSet(f)) configCmd.AddCommand(NewCmdConfigEdit(f)) return configCmd } func NewCmdConfigGet(f *cmdutils.Factory) *cobra.Command { var hostname string cmd := &cobra.Command{ Use: "get <key>", Short: "Prints the value of a given configuration key.", Long: ``, Example: heredoc.Doc(` $ glab config get editor > vim $ glab config get glamour_style > notty `), Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { cfg, err := f.Config() if err != nil { return err } val, err := cfg.Get(hostname, args[0]) if err != nil { return err } if val != "" { fmt.Fprintf(f.IO.StdOut, "%s\n", val) } return nil }, } cmd.Flags().StringVarP(&hostname, "host", "h", "", "Get per-host setting.") cmd.Flags().BoolP("global", "g", false, "Read from global config file (~/.config/glab-cli/config.yml). (default checks 'Environment variables → Local → Global')") return cmd } func NewCmdConfigSet(f *cmdutils.Factory) *cobra.Command { var hostname string var isGlobal bool cmd := &cobra.Command{ Use: "set <key> <value>", Short: "Updates configuration with the value of a given key.", Long: `Update the configuration by setting a key to a value. Use 'glab config set --global' to set a global config. Specifying the '--hostname' flag also saves in the global configuration file. `, Example: heredoc.Doc(` - glab config set editor vim - glab config set token xxxxx -h gitlab.com - glab config set check_update false --global`), Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { cfg, err := f.Config() if err != nil { return err } localCfg, _ := cfg.Local() key, value := args[0], args[1] if isGlobal || hostname != "" { err = cfg.Set(hostname, key, value) } else { err = localCfg.Set(key, value) } if err != nil { return fmt.Errorf("failed to set %q to %q: %w", key, value, err) } if isGlobal || hostname != "" { err = cfg.Write() } else { err = localCfg.Write() } if err != nil { return fmt.Errorf("failed to write configuration to disk: %w", err) } return nil }, } cmd.Flags().StringVarP(&hostname, "host", "h", "", "Set per-host setting.") cmd.Flags().BoolVarP(&isGlobal, "global", "g", false, "Write to global '~/.config/glab-cli/config.yml' file rather than the repository's '.git/glab-cli/config.yml' file.") return cmd } func NewCmdConfigEdit(f *cmdutils.Factory) *cobra.Command { var isLocal bool cmd := &cobra.Command{ Use: "edit", Short: "Opens the glab configuration file.", Long: heredoc.Doc(`Opens the glab configuration file. The command uses the following order when choosing the editor to use: 1. 'glab_editor' field in the configuration file 2. 'VISUAL' environment variable 3. 'EDITOR' environment variable `), Example: heredoc.Doc(` Open the configuration file with the default editor - glab config edit Open the configuration file with vim - EDITOR=vim glab config edit Set vim to be used for all future 'glab config edit' invocations - glab config set editor vim - glab config edit Open the local configuration file with the default editor - glab config edit -l `), Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { var configPath string if isLocal { configPath = ".git/glab-cli/config.yml" } else { configPath = fmt.Sprintf("%s/config.yml", config.ConfigDir()) } editor, err := cmdutils.GetEditor(f.Config) if err != nil { return err } editorCommand, err := browser.Command(configPath, editor) if err != nil { return err } editorCommand.Stdin = cmd.InOrStdin() editorCommand.Stdout = cmd.OutOrStdout() editorCommand.Stderr = cmd.ErrOrStderr() err = editorCommand.Run() if err != nil { return err } return nil }, } cmd.Flags().BoolVarP(&isLocal, "local", "l", false, "Open '.git/glab-cli/config.yml' file instead of the global '~/.config/glab-cli/config.yml' file.") return cmd }