From 6afcbfc99e1422502af3904ae1c6dfd6d7b16d67 Mon Sep 17 00:00:00 2001 From: Zhao Xiaojie Date: Mon, 20 Apr 2020 09:32:18 +0800 Subject: [PATCH] Add support to open external link (#384) * Add support to open external link * Enable to print all details of a config item * Fix the config generate tests --- app/cmd/config.go | 38 ++++++++++------ app/cmd/config_generate_test.go | 7 --- app/cmd/open.go | 80 +++++++++++++++++++++------------ 3 files changed, 77 insertions(+), 48 deletions(-) diff --git a/app/cmd/config.go b/app/cmd/config.go index 7690f0d..a824fd5 100644 --- a/app/cmd/config.go +++ b/app/cmd/config.go @@ -18,12 +18,18 @@ import ( // ConfigOptions is the config cmd option type ConfigOptions struct { ConfigFileLocation string + Detail bool } var configOptions ConfigOptions func init() { rootCmd.AddCommand(configCmd) + + // add flags + flags := configCmd.Flags() + flags.BoolVarP(&configOptions.Detail, "detail", "", false, + `Show the all detail of current configuration`) } var configCmd = &cobra.Command{ @@ -36,7 +42,12 @@ var configCmd = &cobra.Command{ if current == nil { err = fmt.Errorf("no config file found or no current setting") } else { - if current.Description != "" { + if configOptions.Detail { + var data []byte + if data, err = yaml.Marshal(current); err == nil { + cmd.Println(string(data)) + } + } else if current.Description != "" { cmd.Printf("Current Jenkins's name is %s, url is %s, description is %s\n", current.Name, current.URL, current.Description) } else { cmd.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL) @@ -51,14 +62,15 @@ var configCmd = &cobra.Command{ // JenkinsServer holds the configuration of your Jenkins type JenkinsServer struct { - Name string `yaml:"name"` - URL string `yaml:"url"` - UserName string `yaml:"username"` - Token string `yaml:"token"` - Proxy string `yaml:"proxy"` - ProxyAuth string `yaml:"proxyAuth"` - InsecureSkipVerify bool `yaml:"insecureSkipVerify"` - Description string `yaml:"description"` + Name string `yaml:"name"` + URL string `yaml:"url"` + UserName string `yaml:"username"` + Token string `yaml:"token"` + Proxy string `yaml:"proxy,omitempty"` + ProxyAuth string `yaml:"proxyAuth,omitempty"` + InsecureSkipVerify bool `yaml:"insecureSkipVerify"` + Description string `yaml:"description,omitempty"` + Data map[string]string `yaml:"data,omitempty"` } // CommandHook is a hook @@ -83,11 +95,11 @@ type JenkinsMirror struct { // Config is a global config struct type Config struct { Current string `yaml:"current"` - Language string `yaml:"language"` + Language string `yaml:"language,omitempty"` JenkinsServers []JenkinsServer `yaml:"jenkins_servers"` - PreHooks []CommandHook `yaml:"preHooks"` - PostHooks []CommandHook `yaml:"postHooks"` - PluginSuites []PluginSuite `yaml:"pluginSuites"` + PreHooks []CommandHook `yaml:"preHooks,omitempty"` + PostHooks []CommandHook `yaml:"postHooks,omitempty"` + PluginSuites []PluginSuite `yaml:"pluginSuites,omitempty"` Mirrors []JenkinsMirror `yaml:"mirrors"` } diff --git a/app/cmd/config_generate_test.go b/app/cmd/config_generate_test.go index 35f2991..b82a485 100644 --- a/app/cmd/config_generate_test.go +++ b/app/cmd/config_generate_test.go @@ -37,19 +37,12 @@ var _ = Describe("config generate command", func() { It("should success", func() { Expect(cmdErr).To(BeNil()) Expect(buf.String()).To(Equal(`current: yourServer -language: "" jenkins_servers: - name: yourServer url: http://localhost:8080/jenkins username: admin token: 111e3a2f0231198855dceaff96f20540a9 - proxy: "" - proxyAuth: "" insecureSkipVerify: true - description: "" -preHooks: [] -postHooks: [] -pluginSuites: [] mirrors: - name: default url: http://mirrors.jenkins.io/ diff --git a/app/cmd/open.go b/app/cmd/open.go index 5b6b306..5a7e11e 100644 --- a/app/cmd/open.go +++ b/app/cmd/open.go @@ -5,7 +5,9 @@ import ( "github.com/jenkins-zh/jenkins-cli/app/i18n" "github.com/jenkins-zh/jenkins-cli/util" "github.com/spf13/cobra" + "go.uber.org/zap" "os" + "strings" ) // OpenOption is the open cmd option @@ -47,38 +49,60 @@ var openCmd = &cobra.Command{ openOption.Browser = os.Getenv("BROWSER") } }, - RunE: func(_ *cobra.Command, args []string) (err error) { - var jenkins *JenkinsServer + RunE: openOption.run, +} - var configName string - if len(args) > 0 { - configName = args[0] - } +func (o *OpenOption) run(_ *cobra.Command, args []string) (err error) { + var jenkins *JenkinsServer - if configName == "" && openOption.Interactive { - jenkinsNames := getJenkinsNames() - configName, err = openOption.Select(jenkinsNames, - i18n.T("Choose a Jenkins which you want to open:"), "") - } + var configName string + if len(args) > 0 { + configName = args[0] + } - if err == nil { - if configName != "" { - jenkins = findJenkinsByName(configName) - } else { - jenkins = getCurrentJenkins() - } + if configName == "" && openOption.Interactive { + jenkinsNames := getJenkinsNames() + configName, err = openOption.Select(jenkinsNames, + i18n.T("Choose a Jenkins which you want to open:"), "") + } - if jenkins != nil && jenkins.URL != "" { - url := jenkins.URL - if openOption.Config { - url = fmt.Sprintf("%s/configure", url) - } - browser := openOption.Browser - err = util.Open(url, browser, openOption.ExecContext) - } else { - err = fmt.Errorf("no URL found with Jenkins %s", configName) + jenkinsName, external := o.parseName(configName) + logger.Info("open jenkins", + zap.String("jenkins name", jenkinsName), + zap.String("external", external)) + + if err == nil { + if jenkinsName != "" { + jenkins = findJenkinsByName(jenkinsName) + } else { + jenkins = getCurrentJenkins() + } + + if jenkins != nil && jenkins.URL != "" { + url := jenkins.URL + if openOption.Config { + url = fmt.Sprintf("%s/configure", url) + } else if external != "" { + url = jenkins.Data[external] } + browser := openOption.Browser + err = util.Open(url, browser, openOption.ExecContext) + } else { + err = fmt.Errorf("no URL found with Jenkins %s", jenkinsName) } - return - }, + } + return +} + +// parseName the string expect likes name or name.external +func (o *OpenOption) parseName(configName string) (jenkins, external string) { + array := strings.SplitN(configName, ".", 2) + fmt.Println(array) + if len(array) > 0 { + jenkins = array[0] + } + if len(array) > 1 { + external = array[1] + } + return } -- GitLab