config.go 6.2 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1
package configUtils
2 3

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"fmt"
5
	"github.com/easysoft/zentaoatf/src/model"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
6
	commonUtils "github.com/easysoft/zentaoatf/src/utils/common"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
7
	"github.com/easysoft/zentaoatf/src/utils/const"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	"github.com/easysoft/zentaoatf/src/utils/display"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9 10
	fileUtils "github.com/easysoft/zentaoatf/src/utils/file"
	"github.com/easysoft/zentaoatf/src/utils/i118"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
11
	"github.com/easysoft/zentaoatf/src/utils/langUtils"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
12
	"github.com/easysoft/zentaoatf/src/utils/log"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
13
	"github.com/easysoft/zentaoatf/src/utils/vari"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
14
	"github.com/fatih/color"
15 16
	"gopkg.in/yaml.v2"
	"io/ioutil"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
17 18 19 20 21
	"os"
	"reflect"
	"regexp"
	"strings"
	"sync"
22 23
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
24 25 26
func InitConfig() {
	// preference from yaml
	vari.Config = getInst()
27

aaronchen2k2k's avatar
aaronchen2k2k 已提交
28 29
	// screen size
	InitScreenSize()
30

aaronchen2k2k's avatar
aaronchen2k2k 已提交
31 32 33 34 35
	// internationalization
	i118Utils.InitI118(vari.Config.Language)

	if strings.Index(os.Args[0], "atf") > -1 && (len(os.Args) > 1 && os.Args[1] != "set") {
		PrintCurrConfig()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
36
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
37
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38

aaronchen2k2k's avatar
aaronchen2k2k 已提交
39
func ConfigForSet() {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
40
	configSite := ""
41

aaronchen2k2k's avatar
aaronchen2k2k 已提交
42 43 44 45 46
	language := ""
	url := ""
	account := ""
	password := ""

aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
	fmt.Println(i118Utils.I118Prt.Sprintf("begin_config"))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48

49 50 51
	language = getInput("(english|chinese|e|c|)", "enter_language")
	languageDefault := "en"
	if language == "chinese" || language == "c" { // default en
aaronchen2k2k's avatar
aaronchen2k2k 已提交
52
		language = "zh"
53 54 55 56 57
	} else {
		if language == "" {
			fmt.Print(languageDefault)
		}
		language = languageDefault
aaronchen2k2k's avatar
aaronchen2k2k 已提交
58 59
	}

60 61 62 63 64 65 66
	configSite = getInput("(yes|no|y|n|)", "config_zentao_site")
	configSiteDefault := "yes"
	if configSite != "no" && configSite != "n" { // default yes
		if configSite == "" {
			fmt.Print(configSiteDefault)
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
67 68 69
		url = getInput("http://.*", "enter_url")
		account = getInput(".{3,}", "enter_account")
		password = getInput(".{4,}", "enter_password")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
70 71
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
72
	SaveConfig(language, url, account, password)
73

aaronchen2k2k's avatar
aaronchen2k2k 已提交
74
	PrintCurrConfig()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
75 76
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
77 78
func ConfigForCheckout(productId *string, moduleId *string, suiteId *string, taskId *string,
	independentFile *bool, scriptLang *string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79

aaronchen2k2k's avatar
aaronchen2k2k 已提交
80
	color.Cyan("\n" + i118Utils.I118Prt.Sprintf("need_config"))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
81

aaronchen2k2k's avatar
aaronchen2k2k 已提交
82 83 84
	url := getInput("http://.*", "enter_url")
	account := getInput(".{3,}", "enter_account")
	password := getInput(".{4,}", "enter_password")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
85

aaronchen2k2k's avatar
aaronchen2k2k 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99
	coType := getInput("(product|module|suite|task|p|m|s|t)", "enter_co_type")

	coType = strings.ToLower(coType)
	if coType == "product" || coType == "p" {
		*productId = getInput("\\d+", "productId")
	} else if coType == "module" || coType == "m" {
		*productId = getInput("\\d+", "productId")
		*moduleId = getInput("\\d+", "moduleId")
	} else if coType == "suite" || coType == "s" {
		*suiteId = getInput("\\d+", "suiteId")
	} else if coType == "task" || coType == "t" {
		*taskId = getInput("\\d+", "taskId")
	}

100
	indep := getInput("(yes|no|y|n|)", "enter_co_independent")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
101
	indep = strings.ToLower(indep)
102
	if indep != "yes" && indep != "y" { // default no
aaronchen2k2k's avatar
aaronchen2k2k 已提交
103 104
		*independentFile = true
	} else {
105 106 107
		if indep == "" {
			fmt.Print("no")
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
108 109 110
		*independentFile = false
	}

111 112 113 114
	regx := "(" + strings.Join(langUtils.GetSupportLangageArr(), "|") + ")"
	fmtParam := strings.Join(langUtils.GetSupportLangageArr(), " / ")
	*scriptLang = getInput(regx, "enter_co_language", fmtParam)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
115
	SaveConfig("en", url, account, password)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
116 117 118 119

	PrintCurrConfig()
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
120
func getInput(regx string, fmtStr string, params ...interface{}) string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
121 122
	var ret string

aaronchen2k2k's avatar
aaronchen2k2k 已提交
123 124
	msg := i118Utils.I118Prt.Sprintf(fmtStr, params...)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
125
	for {
126
		color.Cyan("\n" + msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
127
		fmt.Scanln(&ret)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
128

aaronchen2k2k's avatar
aaronchen2k2k 已提交
129 130
		temp := strings.ToLower(ret)
		if temp == "exit" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131
			os.Exit(1)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
132 133 134 135 136 137
		}

		if regx == "" {
			return ret
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
138
		pass, _ := regexp.MatchString("^"+regx+"$", temp)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
139 140
		if pass {
			return ret
aaronchen2k2k's avatar
aaronchen2k2k 已提交
141
		} else {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
142
			color.Red(i118Utils.I118Prt.Sprintf("invalid_input") + "\n")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
143 144
		}
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
145 146
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
147 148 149 150 151 152 153 154
func SetLanguage(lang string, dumb bool) {
	buf, _ := ioutil.ReadFile(constant.ConfigFile)
	yaml.Unmarshal(buf, &vari.Config)

	vari.Config.Language = lang

	data, _ := yaml.Marshal(&vari.Config)
	ioutil.WriteFile(constant.ConfigFile, data, 0666)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
155

aaronchen2k2k's avatar
aaronchen2k2k 已提交
156 157 158 159 160 161
	// re-init language resource
	i118Utils.InitI118(vari.Config.Language)

	if !dumb {
		logUtils.PrintToCmd(color.CyanString(i118Utils.I118Prt.Sprintf("set_config", i118Utils.I118Prt.Sprintf("language"),
			i118Utils.I118Prt.Sprintf(vari.Config.Language))))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
162
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
163 164 165 166
}

func PrintCurrConfig() {
	color.Cyan(i118Utils.I118Prt.Sprintf("current_config", ""))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
167

aaronchen2k2k's avatar
aaronchen2k2k 已提交
168 169 170 171 172 173 174 175 176 177 178
	val := reflect.ValueOf(vari.Config)
	typeOfS := val.Type()
	for i := 0; i < reflect.ValueOf(vari.Config).NumField(); i++ {
		val := val.Field(i)
		name := typeOfS.Field(i).Name

		if !vari.RunFromCui && (name == "Width" || name == "Height" || name == "WorkHistories") {
			continue
		}
		fmt.Printf("  %s: %v \n", typeOfS.Field(i).Name, val.Interface())
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
179
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
180

aaronchen2k2k's avatar
aaronchen2k2k 已提交
181 182 183
func PrintConfigToView() {
	cmdView, _ := vari.Cui.View("cmd")
	fmt.Fprintln(cmdView, color.CyanString(i118Utils.I118Prt.Sprintf("current_config", "")))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
184

aaronchen2k2k's avatar
aaronchen2k2k 已提交
185 186 187 188 189 190
	val := reflect.ValueOf(vari.Config)
	typeOfS := val.Type()
	for i := 0; i < reflect.ValueOf(vari.Config).NumField(); i++ {
		val := val.Field(i)
		fmt.Fprintln(cmdView, fmt.Sprintf("  %s: %v", typeOfS.Field(i).Name, val.Interface()))
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
191
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
192 193

func InitScreenSize() {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
194 195 196 197 198 199 200 201 202 203 204 205 206
	w, _ := display.GetScreenSize()
	vari.ScreenWidth = w
}

func getInst() model.Config {
	var once sync.Once
	once.Do(func() {
		vari.Config = model.Config{}
		if fileUtils.FileExist(constant.ConfigFile) {
			buf, _ := ioutil.ReadFile(constant.ConfigFile)
			yaml.Unmarshal(buf, &vari.Config)
		} else { // init
			vari.Config.Language = "en"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
207
			saveEmptyConfig()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
208 209 210
		}
	})
	return vari.Config
aaronchen2k2k's avatar
aaronchen2k2k 已提交
211
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

func SaveConfig(language string, url string, account string, password string) error {
	config := ReadCurrConfig()

	if language != "" {
		config.Language = language
	}
	if url != "" {
		config.Url = url
	}
	if account != "" {
		config.Account = account
	}
	if password != "" {
		config.Password = password
	}

	data, _ := yaml.Marshal(&config)
	ioutil.WriteFile(constant.ConfigFile, data, 0666)

	vari.Config = ReadCurrConfig()
	return nil
}

func ReadCurrConfig() model.Config {
	configPath := constant.ConfigFile
	var config model.Config

	if !fileUtils.FileExist(configPath) {
		saveEmptyConfig()
	}
	buf, _ := ioutil.ReadFile(configPath)
	yaml.Unmarshal(buf, &config)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
246 247
	config.Url = commonUtils.UpdateUrl(config.Url)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
248 249 250 251
	return config
}

func saveEmptyConfig() error {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
252 253 254 255
	config := model.Config{Language: "en", Url: "", Account: "", Password: ""}

	data, _ := yaml.Marshal(&config)
	ioutil.WriteFile(constant.ConfigFile, data, 0666)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
256 257 258

	return nil
}