mirror of
https://github.com/clearlinux/mixer-tools.git
synced 2026-09-05 13:11:31 +00:00
config: Let config handle filename
Instead of relying on external sources to keep track of the active config file, store it as a private variable inside MixConfig. This change prevents inconsistencies regarding filename and also simplifies the code since the caller doesn't need to initialize the path or know the filename if it was not the one that initialized that config object. Signed-off-by: Rodrigo Chiossi <rodrigo.chiossi@intel.com>
This commit is contained in:
+1
-15
@@ -55,7 +55,6 @@ type Builder struct {
|
||||
Config config.MixConfig
|
||||
|
||||
BuildScript string
|
||||
BuildConf string
|
||||
|
||||
MixVer string
|
||||
MixVerFile string
|
||||
@@ -103,7 +102,7 @@ func NewFromConfig(conf string) (*Builder, error) {
|
||||
if err := b.Config.LoadDefaults(false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := b.LoadBuilderConf(conf); err != nil {
|
||||
if err := b.Config.LoadConfig(conf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := b.ReadVersions(); err != nil {
|
||||
@@ -274,19 +273,6 @@ func (b *Builder) InitMix(upstreamVer string, mixVer string, allLocal bool, allU
|
||||
return nil
|
||||
}
|
||||
|
||||
// LoadBuilderConf will read the builder configuration from the command line if
|
||||
// it was provided, otherwise it will fall back to reading the configuration from
|
||||
// the local builder.conf file.
|
||||
func (b *Builder) LoadBuilderConf(builderconf string) error {
|
||||
var err error
|
||||
b.BuildConf, err = config.GetConfigPath(builderconf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return b.Config.LoadConfig(b.BuildConf)
|
||||
}
|
||||
|
||||
// ReadVersions will initialise the mix versions (mix and clearlinux) from
|
||||
// the configuration files in the version directory.
|
||||
func (b *Builder) ReadVersions() error {
|
||||
|
||||
+1
-1
@@ -625,7 +625,7 @@ func (b *Builder) buildBundles(set bundleSet) error {
|
||||
// TODO: Do not touch config code that is in flux at the moment, reparsing it here to grab
|
||||
// information that previously Mixer didn't care about. Move that to the configuration part
|
||||
// of Mixer.
|
||||
cfg, err := readBuildBundlesConfig(b.BuildConf)
|
||||
cfg, err := readBuildBundlesConfig(b.Config.GetConfigFileName())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
+53
-23
@@ -39,6 +39,9 @@ type MixConfig struct {
|
||||
Swupd swupdConf
|
||||
Server serverConf
|
||||
Mixer mixerConf
|
||||
|
||||
/* hidden properties */
|
||||
filename string
|
||||
}
|
||||
|
||||
type builderConf struct {
|
||||
@@ -108,6 +111,8 @@ func (config *MixConfig) LoadDefaultsForPath(localrpms bool, path string) {
|
||||
config.Mixer.LocalRPMDir = ""
|
||||
config.Mixer.LocalRepoDir = ""
|
||||
}
|
||||
|
||||
config.filename = filepath.Join(path, "builder.conf")
|
||||
}
|
||||
|
||||
// CreateDefaultConfig creates a default builder.conf using the active
|
||||
@@ -121,21 +126,21 @@ func (config *MixConfig) CreateDefaultConfig(localrpms bool) error {
|
||||
return err
|
||||
}
|
||||
|
||||
filename, err := GetConfigPath("")
|
||||
err := config.initConfigPath("")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return config.SaveConfig(filename)
|
||||
return config.SaveConfig()
|
||||
}
|
||||
|
||||
// SaveConfig saves the properties in MixConfig to a TOML config file
|
||||
func (config *MixConfig) SaveConfig(filename string) error {
|
||||
func (config *MixConfig) SaveConfig() error {
|
||||
if !UseNewConfig {
|
||||
return errors.Errorf("SaveConfig can only be used with --new-config flag")
|
||||
}
|
||||
|
||||
w, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
|
||||
w, err := os.OpenFile(config.filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -191,7 +196,7 @@ func (config *MixConfig) createLegacyConfig(localrpms bool) error {
|
||||
|
||||
// SetProperty parse a property in the format "Section.Property", finds and sets it within the
|
||||
// config structure and saves the config file.
|
||||
func (config *MixConfig) SetProperty(filename string, propertyStr string, value string) error {
|
||||
func (config *MixConfig) SetProperty(propertyStr string, value string) error {
|
||||
if !UseNewConfig {
|
||||
return errors.Errorf("SetProperty requires --new-config flag")
|
||||
}
|
||||
@@ -214,7 +219,7 @@ func (config *MixConfig) SetProperty(filename string, propertyStr string, value
|
||||
|
||||
if ok && tag == property {
|
||||
sectionV.Field(i).SetString(value)
|
||||
return config.SaveConfig(filename)
|
||||
return config.SaveConfig()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,7 +229,10 @@ func (config *MixConfig) SetProperty(filename string, propertyStr string, value
|
||||
// LoadConfig loads a configuration file from a provided path or from local directory
|
||||
// is none is provided
|
||||
func (config *MixConfig) LoadConfig(filename string) error {
|
||||
if err := config.Parse(filename); err != nil {
|
||||
if err := config.initConfigPath(filename); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := config.Parse(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := config.expandEnv(); err != nil {
|
||||
@@ -235,13 +243,13 @@ func (config *MixConfig) LoadConfig(filename string) error {
|
||||
}
|
||||
|
||||
// Parse reads the values from a config file without performing validation or env expansion
|
||||
func (config *MixConfig) Parse(filename string) error {
|
||||
func (config *MixConfig) Parse() error {
|
||||
if !UseNewConfig {
|
||||
if err := config.legacyParse(filename); err != nil {
|
||||
if err := config.legacyParse(); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if _, err := toml.DecodeFile(filename, &config); err != nil {
|
||||
if _, err := toml.DecodeFile(config.filename, &config); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -249,12 +257,12 @@ func (config *MixConfig) Parse(filename string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (config *MixConfig) legacyParse(filename string) error {
|
||||
func (config *MixConfig) legacyParse() error {
|
||||
if UseNewConfig {
|
||||
return errors.Errorf("legacyParse is not compatible with --new-config flag")
|
||||
}
|
||||
|
||||
lines, err := helpers.ReadFileAndSplit(filename)
|
||||
lines, err := helpers.ReadFileAndSplit(config.filename)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Failed to read buildconf")
|
||||
}
|
||||
@@ -314,6 +322,11 @@ func (config *MixConfig) expandEnv() error {
|
||||
for i := 0; i < rv.NumField(); i++ {
|
||||
sectionV := rv.Field(i)
|
||||
|
||||
/* ignore unexported fields */
|
||||
if !sectionV.CanSet() {
|
||||
continue
|
||||
}
|
||||
|
||||
for j := 0; j < sectionV.NumField(); j++ {
|
||||
val := sectionV.Field(j).String()
|
||||
matches := re.FindAllStringSubmatch(val, -1)
|
||||
@@ -336,8 +349,13 @@ func (config *MixConfig) validate() error {
|
||||
rv := reflect.ValueOf(config).Elem()
|
||||
|
||||
for i := 0; i < rv.NumField(); i++ {
|
||||
sectionT := reflect.TypeOf(rv.Field(i).Interface())
|
||||
sectionV := rv.Field(i)
|
||||
/* ignore unexported fields */
|
||||
if !sectionV.CanSet() {
|
||||
continue
|
||||
}
|
||||
|
||||
sectionT := reflect.TypeOf(rv.Field(i).Interface())
|
||||
|
||||
for j := 0; j < sectionT.NumField(); j++ {
|
||||
tag, ok := sectionT.Field(j).Tag.Lookup("required")
|
||||
@@ -359,20 +377,24 @@ func (config *MixConfig) validate() error {
|
||||
|
||||
// Convert parses an old config file and converts it to TOML format
|
||||
func (config *MixConfig) Convert(filename string) error {
|
||||
// Force UseNewConfig to false
|
||||
UseNewConfig = false
|
||||
if err := config.Parse(filename); err != nil {
|
||||
if err := config.initConfigPath(filename); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := helpers.CopyFile(filename+".bkp", filename); err != nil {
|
||||
// Force UseNewConfig to false
|
||||
UseNewConfig = false
|
||||
if err := config.Parse(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := helpers.CopyFile(config.filename+".bkp", config.filename); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Force UseNewConfig to true
|
||||
UseNewConfig = true
|
||||
|
||||
return config.SaveConfig(filename)
|
||||
return config.SaveConfig()
|
||||
}
|
||||
|
||||
// Print print variables and values of a MixConfig struct
|
||||
@@ -389,16 +411,24 @@ func (config *MixConfig) Print() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetConfigPath returns the default config path if the provided path is empty
|
||||
func GetConfigPath(path string) (string, error) {
|
||||
func (config *MixConfig) initConfigPath(path string) error {
|
||||
if path != "" {
|
||||
return path, nil
|
||||
config.filename = path
|
||||
return nil
|
||||
}
|
||||
|
||||
pwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return "", err
|
||||
return err
|
||||
}
|
||||
|
||||
return filepath.Join(pwd, "builder.conf"), nil
|
||||
config.filename = filepath.Join(pwd, "builder.conf")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetConfigFileName returns the file name of current config
|
||||
func (config *MixConfig) GetConfigFileName() string {
|
||||
/* This variable cannot be public or else it will be added to the config file */
|
||||
return config.filename
|
||||
}
|
||||
|
||||
+1
-18
@@ -32,12 +32,6 @@ var configValidateCmd = &cobra.Command{
|
||||
Long: `Parse a builder config file and display its properties. Properties containing
|
||||
environment variables will be expanded`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
var err error
|
||||
if configFile, err = config.GetConfigPath(configFile); err != nil {
|
||||
// Print error, but don't print command usage
|
||||
fail(err)
|
||||
}
|
||||
|
||||
var mc config.MixConfig
|
||||
if err := mc.LoadConfig(configFile); err != nil {
|
||||
fail(err)
|
||||
@@ -57,11 +51,6 @@ var configConvertCmd = &cobra.Command{
|
||||
a backup file of the old config and will replace it with the converted one. Environment
|
||||
variables will not be expanded and the values will not be validated`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
var err error
|
||||
if configFile, err = config.GetConfigPath(configFile); err != nil {
|
||||
fail(err)
|
||||
}
|
||||
|
||||
var mc config.MixConfig
|
||||
if err := mc.Convert(configFile); err != nil {
|
||||
fail(err)
|
||||
@@ -81,18 +70,12 @@ var configSetCmd = &cobra.Command{
|
||||
if !config.UseNewConfig {
|
||||
fail(errors.New("config set requires `--new-config` flag`"))
|
||||
}
|
||||
|
||||
var err error
|
||||
if configFile, err = config.GetConfigPath(configFile); err != nil {
|
||||
fail(err)
|
||||
}
|
||||
|
||||
var mc config.MixConfig
|
||||
if err := mc.LoadConfig(configFile); err != nil {
|
||||
fail(err)
|
||||
}
|
||||
|
||||
if err := mc.SetProperty(configFile, args[0], args[1]); err != nil {
|
||||
if err := mc.SetProperty(args[0], args[1]); err != nil {
|
||||
fail(err)
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -118,7 +118,8 @@ var initCmd = &cobra.Command{
|
||||
fail(err)
|
||||
}
|
||||
}
|
||||
if err := b.LoadBuilderConf(configFile); err != nil {
|
||||
|
||||
if err := b.Config.LoadConfig(configFile); err != nil {
|
||||
fail(err)
|
||||
}
|
||||
err := b.InitMix(initFlags.clearVer, strconv.Itoa(initFlags.mixver), initFlags.allLocal, initFlags.allUpstream, initFlags.noDefaults, initFlags.upstreamURL, initFlags.git)
|
||||
|
||||
+1
-1
@@ -110,7 +110,7 @@ func setUpMixDir(upstreamVer, mixVer int) error {
|
||||
c.Swupd.Bundle = "os-core"
|
||||
c.Swupd.ContentURL = "file:///usr/share/mix/update/www"
|
||||
c.Swupd.VersionURL = "file:///usr/share/mix/update/www"
|
||||
if err = c.SaveConfig(filepath.Join(mixWS, "builder.conf")); err != nil {
|
||||
if err = c.SaveConfig(); err != nil {
|
||||
return err
|
||||
}
|
||||
err = ioutil.WriteFile(filepath.Join(mixWS, "mixversion"),
|
||||
|
||||
Reference in New Issue
Block a user