From 03fec4afd91b9beb1f3d5f6f526b351b971c217c Mon Sep 17 00:00:00 2001 From: Zhao Xiaojie Date: Wed, 24 Jul 2019 16:50:47 +0800 Subject: [PATCH] Split config options into sub-cmd --- app/cmd/config.go | 107 +------------------------------------ app/cmd/config_add.go | 35 +++++++++--- app/cmd/config_generate.go | 42 +++++++++++++++ app/cmd/config_list.go | 33 ++++++++++++ app/cmd/config_remove.go | 28 ++++++++++ app/cmd/config_select.go | 36 ++++++++----- 6 files changed, 153 insertions(+), 128 deletions(-) create mode 100644 app/cmd/config_generate.go create mode 100644 app/cmd/config_list.go diff --git a/app/cmd/config.go b/app/cmd/config.go index df3b389..1f5ca23 100644 --- a/app/cmd/config.go +++ b/app/cmd/config.go @@ -1,24 +1,17 @@ package cmd import ( - "errors" "fmt" "io/ioutil" "log" "os" "runtime" - "github.com/linuxsuren/jenkins-cli/util" "github.com/spf13/cobra" "gopkg.in/yaml.v2" ) type ConfigOptions struct { - Current string - Show bool - Generate bool - List bool - ConfigFileLocation string } @@ -26,54 +19,15 @@ var configOptions ConfigOptions func init() { rootCmd.AddCommand(configCmd) - configCmd.Flags().StringVarP(&configOptions.Current, "current", "c", "", "Set the current Jenkins") - configCmd.Flags().BoolVarP(&configOptions.Show, "show", "s", false, "Show the current Jenkins") - configCmd.Flags().BoolVarP(&configOptions.Generate, "generate", "g", false, "Generate a sample config file for you") - configCmd.Flags().BoolVarP(&configOptions.List, "list", "l", false, "Display all your Jenkins configs") } var configCmd = &cobra.Command{ Use: "config", Short: "Manage the config of jcli", Long: `Manage the config of jcli`, - Args: func(cmd *cobra.Command, args []string) (err error) { - if !configOptions.Show && !configOptions.Generate && - !configOptions.List && configOptions.Current == "" { - err = errors.New("need arguments") - } - return - }, Run: func(cmd *cobra.Command, args []string) { current := getCurrentJenkins() - if configOptions.Show { - fmt.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL) - } - - if configOptions.List { - table := util.CreateTable(os.Stdout) - table.AddRow("number", "name", "url") - for i, jenkins := range getConfig().JenkinsServers { - name := jenkins.Name - if name == current.Name { - name = fmt.Sprintf("*%s", name) - } - table.AddRow(fmt.Sprintf("%d", i), name, jenkins.URL) - } - table.Render() - } - - if configOptions.Generate { - if data, err := generateSampleConfig(); err == nil { - fmt.Print(string(data)) - fmt.Println("# Goto 'http://localhost:8080/jenkins/me/configure', then you can generate your token.") - } else { - log.Fatal(err) - } - } - - if configOptions.Current != "" { - setCurrentJenkins(configOptions.Current) - } + fmt.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL) }, Example: "jcli config -l", } @@ -112,21 +66,6 @@ func setCurrentJenkins(name string) { } } -func generateSampleConfig() ([]byte, error) { - sampleConfig := Config{ - Current: "yourServer", - JenkinsServers: []JenkinsServer{ - { - Name: "yourServer", - URL: "http://localhost:8080/jenkins", - UserName: "admin", - Token: "111e3a2f0231198855dceaff96f20540a9", - }, - }, - } - return yaml.Marshal(&sampleConfig) -} - var config Config func getConfig() Config { @@ -160,50 +99,6 @@ func findJenkinsByName(name string) (jenkinsServer *JenkinsServer) { return } -func addJenkins(jenkinsServer JenkinsServer) (err error) { - jenkinsName := jenkinsServer.Name - if jenkinsName == "" { - err = fmt.Errorf("Name cannot be empty") - return - } - - if findJenkinsByName(jenkinsName) != nil { - err = fmt.Errorf("Jenkins %s is existed", jenkinsName) - return - } - - config.JenkinsServers = append(config.JenkinsServers, jenkinsServer) - err = saveConfig() - return -} - -func removeJenkins(name string) (err error) { - current := getCurrentJenkins() - if name == current.Name { - err = fmt.Errorf("You cannot remove current Jenkins") - } - - index := -1 - config := getConfig() - for i, jenkins := range config.JenkinsServers { - if name == jenkins.Name { - index = i - break - } - } - - if index == -1 { - err = fmt.Errorf("Cannot found by name %s", name) - } else { - config.JenkinsServers[index] = config.JenkinsServers[len(config.JenkinsServers)-1] - config.JenkinsServers[len(config.JenkinsServers)-1] = JenkinsServer{} - config.JenkinsServers = config.JenkinsServers[:len(config.JenkinsServers)-1] - - err = saveConfig() - } - return -} - func loadDefaultConfig() (err error) { userHome := userHomeDir() configPath := fmt.Sprintf("%s/.jenkins-cli.yaml", userHome) diff --git a/app/cmd/config_add.go b/app/cmd/config_add.go index 9c43be1..1e6e6fa 100644 --- a/app/cmd/config_add.go +++ b/app/cmd/config_add.go @@ -1,6 +1,7 @@ package cmd import ( + "fmt" "log" "github.com/spf13/cobra" @@ -14,21 +15,39 @@ var configAddOptions ConfigAddOptions func init() { configCmd.AddCommand(configAddCmd) - configAddCmd.PersistentFlags().StringVarP(&configAddOptions.Name, "name", "n", "", "Name of the Jenkins") - configAddCmd.PersistentFlags().StringVarP(&configAddOptions.URL, "url", "", "", "URL of the Jenkins") - configAddCmd.PersistentFlags().StringVarP(&configAddOptions.UserName, "username", "u", "", "UserName of the Jenkins") - configAddCmd.PersistentFlags().StringVarP(&configAddOptions.Token, "token", "t", "", "Token of the Jenkins") - configAddCmd.PersistentFlags().StringVarP(&configAddOptions.Proxy, "proxy", "p", "", "Proxy of the Jenkins") - configAddCmd.PersistentFlags().StringVarP(&configAddOptions.ProxyAuth, "proxyAuth", "a", "", "ProxyAuth of the Jenkins") + configAddCmd.Flags().StringVarP(&configAddOptions.Name, "name", "n", "", "Name of the Jenkins") + configAddCmd.Flags().StringVarP(&configAddOptions.URL, "url", "", "", "URL of the Jenkins") + configAddCmd.Flags().StringVarP(&configAddOptions.UserName, "username", "u", "", "UserName of the Jenkins") + configAddCmd.Flags().StringVarP(&configAddOptions.Token, "token", "t", "", "Token of the Jenkins") + configAddCmd.Flags().StringVarP(&configAddOptions.Proxy, "proxy", "p", "", "Proxy of the Jenkins") + configAddCmd.Flags().StringVarP(&configAddOptions.ProxyAuth, "proxyAuth", "a", "", "ProxyAuth of the Jenkins") } var configAddCmd = &cobra.Command{ Use: "add", - Short: "Add a Jenkins config", - Long: `Add a Jenkins config`, + Short: "Add a Jenkins config item", + Long: `Add a Jenkins config item`, Run: func(cmd *cobra.Command, args []string) { if err := addJenkins(configAddOptions.JenkinsServer); err != nil { log.Fatal(err) } }, + Example: "jcli config add -n demo", +} + +func addJenkins(jenkinsServer JenkinsServer) (err error) { + jenkinsName := jenkinsServer.Name + if jenkinsName == "" { + err = fmt.Errorf("Name cannot be empty") + return + } + + if findJenkinsByName(jenkinsName) != nil { + err = fmt.Errorf("Jenkins %s is existed", jenkinsName) + return + } + + config.JenkinsServers = append(config.JenkinsServers, jenkinsServer) + err = saveConfig() + return } diff --git a/app/cmd/config_generate.go b/app/cmd/config_generate.go new file mode 100644 index 0000000..db6d3b4 --- /dev/null +++ b/app/cmd/config_generate.go @@ -0,0 +1,42 @@ +package cmd + +import ( + "fmt" + "log" + + "github.com/spf13/cobra" + "gopkg.in/yaml.v2" +) + +func init() { + configCmd.AddCommand(configGenerateCmd) +} + +var configGenerateCmd = &cobra.Command{ + Use: "generate", + Short: "Generate a sample config file for you", + Long: `Generate a sample config file for you`, + Run: func(cmd *cobra.Command, args []string) { + if data, err := generateSampleConfig(); err == nil { + fmt.Print(string(data)) + fmt.Println("# Goto 'http://localhost:8080/jenkins/me/configure', then you can generate your token.") + } else { + log.Fatal(err) + } + }, +} + +func generateSampleConfig() ([]byte, error) { + sampleConfig := Config{ + Current: "yourServer", + JenkinsServers: []JenkinsServer{ + { + Name: "yourServer", + URL: "http://localhost:8080/jenkins", + UserName: "admin", + Token: "111e3a2f0231198855dceaff96f20540a9", + }, + }, + } + return yaml.Marshal(&sampleConfig) +} diff --git a/app/cmd/config_list.go b/app/cmd/config_list.go new file mode 100644 index 0000000..fbb1527 --- /dev/null +++ b/app/cmd/config_list.go @@ -0,0 +1,33 @@ +package cmd + +import ( + "fmt" + "os" + + "github.com/linuxsuren/jenkins-cli/util" + "github.com/spf13/cobra" +) + +func init() { + configCmd.AddCommand(configListCmd) +} + +var configListCmd = &cobra.Command{ + Use: "list", + Short: "List all Jenkins config items", + Long: `List all Jenkins config items`, + Run: func(cmd *cobra.Command, args []string) { + current := getCurrentJenkins() + + table := util.CreateTable(os.Stdout) + table.AddRow("number", "name", "url") + for i, jenkins := range getConfig().JenkinsServers { + name := jenkins.Name + if name == current.Name { + name = fmt.Sprintf("*%s", name) + } + table.AddRow(fmt.Sprintf("%d", i), name, jenkins.URL) + } + table.Render() + }, +} diff --git a/app/cmd/config_remove.go b/app/cmd/config_remove.go index 07bbfba..e3f5056 100644 --- a/app/cmd/config_remove.go +++ b/app/cmd/config_remove.go @@ -1,6 +1,7 @@ package cmd import ( + "fmt" "log" "github.com/spf13/cobra" @@ -25,3 +26,30 @@ var configRemoveCmd = &cobra.Command{ } }, } + +func removeJenkins(name string) (err error) { + current := getCurrentJenkins() + if name == current.Name { + err = fmt.Errorf("You cannot remove current Jenkins") + } + + index := -1 + config := getConfig() + for i, jenkins := range config.JenkinsServers { + if name == jenkins.Name { + index = i + break + } + } + + if index == -1 { + err = fmt.Errorf("Cannot found by name %s", name) + } else { + config.JenkinsServers[index] = config.JenkinsServers[len(config.JenkinsServers)-1] + config.JenkinsServers[len(config.JenkinsServers)-1] = JenkinsServer{} + config.JenkinsServers = config.JenkinsServers[:len(config.JenkinsServers)-1] + + err = saveConfig() + } + return +} diff --git a/app/cmd/config_select.go b/app/cmd/config_select.go index 3d59c1a..ee63e3c 100644 --- a/app/cmd/config_select.go +++ b/app/cmd/config_select.go @@ -10,24 +10,32 @@ func init() { } var configSelectCmd = &cobra.Command{ - Use: "select", + Use: "select []", Short: "Select one config as current Jenkins", Long: `Select one config as current Jenkins`, Run: func(cmd *cobra.Command, args []string) { - target := "" - if currentJenkins := getCurrentJenkins(); currentJenkins != nil { - target = currentJenkins.Name - } - - prompt := &survey.Select{ - Message: "Choose a Jenkins as the current one:", - Options: getJenkinsNames(), - Default: target, - } - survey.AskOne(prompt, &target) + if len(args) > 0 { + jenkinsName := args[0] - if target != "" { - setCurrentJenkins(target) + setCurrentJenkins(jenkinsName) + } else { + selectByManual() } }, } + +func selectByManual() { + target := "" + if currentJenkins := getCurrentJenkins(); currentJenkins != nil { + target = currentJenkins.Name + } + + prompt := &survey.Select{ + Message: "Choose a Jenkins as the current one:", + Options: getJenkinsNames(), + Default: target, + } + if err := survey.AskOne(prompt, &target); err == nil && target != "" { + setCurrentJenkins(target) + } +} -- GitLab