func()

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
}