in newt/syscfg/syscfg.go [590:671]
func (cfg *Cfg) readDefsOnce(lpkg *pkg.LocalPackage,
settings *cfgv.Settings) error {
yc := lpkg.SyscfgY
lsettings := cfg.settingsForLpkg(lpkg, settings)
defs, err := yc.GetValStringMap("syscfg.defs", lsettings)
util.OneTimeWarningError(err)
if defs != nil {
for k, v := range defs {
var entry CfgEntry
var err error
switch v.(type) {
case map[interface{}]interface{}:
vals := v.(map[interface{}]interface{})
entry, err = readSetting(k, lpkg, vals)
if err != nil {
return util.FmtNewtError("Config for package %s: %s",
lpkg.FullName(), err.Error())
}
case int:
val := v.(int)
entry = CfgEntry{
Name: k,
PackageDef: lpkg,
State: CFG_SETTING_STATE_CONST,
Value: stringValue(val),
History: []CfgPoint{{
Value: stringValue(val),
Source: lpkg,
}},
}
case string:
val := v.(string)
entry = CfgEntry{
Name: k,
PackageDef: lpkg,
State: CFG_SETTING_STATE_CONST,
Value: val,
History: []CfgPoint{{
Value: val,
Source: lpkg,
}},
}
default:
return util.FmtNewtError("Package \"%s\" contains invalid "+
"\"syscfg.defs\" for \"%s\". It should be either full definition "+
"(configurable setting) or single value (const setting)",
lpkg.FullName(), k)
}
replace := true
if oldEntry, exists := cfg.Settings[k]; exists {
// Setting already defined. This is allowed for injected
// settings (settings automatically populated by newt). For
// all other settings, record a redefinition error.
point := mostRecentPoint(oldEntry)
if point.IsInjected() {
// Indicate that the setting came from this package, not
// from newt.
entry.replaceSource(lpkg)
// Keep the injected value (override the default).
entry.Value = oldEntry.Value
} else {
replace = false
cfg.addRedefine(k, oldEntry.PackageDef, lpkg)
}
}
if replace {
// Not an illegal redefine; populate the master settings list
// with the new entry.
cfg.Settings[k] = entry
}
}
}
return nil
}