config.go 3.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
package cmd

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"runtime"

	"github.com/spf13/cobra"
	"gopkg.in/yaml.v2"
)

type ConfigOptions struct {
	ConfigFileLocation string
}

var configOptions ConfigOptions

func init() {
	rootCmd.AddCommand(configCmd)
}

var configCmd = &cobra.Command{
25 26 27 28
	Use:     "config",
	Aliases: []string{"cfg"},
	Short:   "Manage the config of jcli",
	Long:    `Manage the config of jcli`,
yJunS's avatar
yJunS 已提交
29
	Run: func(_ *cobra.Command, _ []string) {
LinuxSuRen's avatar
LinuxSuRen 已提交
30
		current := getCurrentJenkins()
31 32 33 34 35
		if current.Description != "" {
			fmt.Printf("Current Jenkins's name is %s, url is %s, description is %s\n", current.Name, current.URL, current.Description)
		} else {
			fmt.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL)
		}
36
	},
37 38 39
	Example: `  jcli config generate
  jcli config list
  jcli config edit`,
40 41 42 43
}

// JenkinsServer holds the configuration of your Jenkins
type JenkinsServer struct {
44 45 46 47 48 49 50
	Name        string `yaml:"name"`
	URL         string `yaml:"url"`
	UserName    string `yaml:"username"`
	Token       string `yaml:"token"`
	Proxy       string `yaml:"proxy"`
	ProxyAuth   string `yaml:"proxyAuth"`
	Description string `yaml:"description"`
51 52 53 54 55 56 57
}

type Config struct {
	Current        string          `yaml:"current"`
	JenkinsServers []JenkinsServer `yaml:"jenkins_servers"`
}

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
func setCurrentJenkins(name string) {
	found := false
	for _, jenkins := range getConfig().JenkinsServers {
		if jenkins.Name == name {
			found = true
			break
		}
	}

	if found {
		config.Current = name
		if err := saveConfig(); err != nil {
			log.Fatal(err)
		}
	} else {
		log.Fatalf("Cannot found Jenkins by name %s", name)
	}
}

Y
Yanjun Shi 已提交
77
var config *Config
78

Y
Yanjun Shi 已提交
79
func getConfig() *Config {
80 81 82
	return config
}

83 84 85 86 87 88 89 90 91
func getJenkinsNames() []string {
	config := getConfig()
	names := make([]string, 0)
	for _, j := range config.JenkinsServers {
		names = append(names, j.Name)
	}
	return names
}

LinuxSuRen's avatar
LinuxSuRen 已提交
92
func getCurrentJenkins() (jenkinsServer *JenkinsServer) {
93 94
	config := getConfig()
	current := config.Current
LinuxSuRen's avatar
LinuxSuRen 已提交
95 96 97 98 99 100
	jenkinsServer = findJenkinsByName(current)

	return
}

func findJenkinsByName(name string) (jenkinsServer *JenkinsServer) {
101
	for _, cfg := range config.JenkinsServers {
LinuxSuRen's avatar
LinuxSuRen 已提交
102 103
		if cfg.Name == name {
			jenkinsServer = &cfg
104 105 106 107 108 109
			break
		}
	}
	return
}

110
func loadDefaultConfig() (err error) {
111
	userHome := userHomeDir()
112 113 114
	configPath := fmt.Sprintf("%s/.jenkins-cli.yaml", userHome)
	if _, err = os.Stat(configPath); err == nil {
		err = loadConfig(configPath)
115
	}
116 117

	return
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
}

func loadConfig(path string) (err error) {
	configOptions.ConfigFileLocation = path

	var content []byte
	if content, err = ioutil.ReadFile(path); err == nil {
		err = yaml.Unmarshal([]byte(content), &config)
	}
	return
}

func saveConfig() (err error) {
	var data []byte
	config := getConfig()

	if data, err = yaml.Marshal(&config); err == nil {
		err = ioutil.WriteFile(configOptions.ConfigFileLocation, data, 0644)
	}
	return
}

func userHomeDir() string {
	if runtime.GOOS == "windows" {
		home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
		if home == "" {
			home = os.Getenv("USERPROFILE")
		}
		return home
	} else if runtime.GOOS == "linux" {
		home := os.Getenv("XDG_CONFIG_HOME")
		if home != "" {
			return home
		}
	}
	return os.Getenv("HOME")
}