in newt/resolve/resolve.go [472:560]
func (r *Resolver) loadDepsForPkg(rpkg *ResolvePackage) (bool, error) {
// Clear warnings from previous run.
if _, ok := r.parseWarnings[rpkg]; ok {
delete(r.parseWarnings, rpkg)
}
settings := r.cfg.AllSettingsForLpkg(rpkg.Lpkg)
changed := false
var depEm map[*parse.Node][]string
var warn string
var err error
if rpkg.Lpkg.Type() == pkg.PACKAGE_TYPE_TRANSIENT {
depEm, warn, err = getExprMapStringSlice(rpkg.Lpkg.PkgY, "pkg.link", nil)
} else {
depEm, warn, err = getExprMapStringSlice(rpkg.Lpkg.PkgY, "pkg.deps",
settings)
}
if err != nil {
return false, err
}
if warn != "" {
r.parseWarnings[rpkg] = append(r.parseWarnings[rpkg], warn)
}
depender := rpkg.Lpkg.Name()
oldDeps := rpkg.Deps
rpkg.Deps = make(map[*ResolvePackage]*ResolveDep, len(oldDeps))
for expr, depNames := range depEm {
for _, depName := range depNames {
newDep, err := pkg.NewDependency(rpkg.Lpkg.Repo(), depName)
if err != nil {
return false, err
}
lpkg, err := r.resolveDep(newDep, depender)
if err != nil {
return false, err
}
if lpkg.Type() == pkg.PACKAGE_TYPE_CONFIG {
if rpkg.Lpkg.Type() != pkg.PACKAGE_TYPE_TARGET &&
rpkg.Lpkg.Type() != pkg.PACKAGE_TYPE_CONFIG {
return false, util.NewNewtError(fmt.Sprintf("Config packages (%s) "+
"can only be included by target or config packages (%s -> %s)",
lpkg.FullName(), rpkg.Lpkg.FullName(),
pkg.PackageTypeNames[rpkg.Lpkg.Type()]))
}
} else if rpkg.Lpkg.Type() == pkg.PACKAGE_TYPE_CONFIG {
return false, util.NewNewtError(fmt.Sprintf("Config packages (%s) "+
"can only include config package (%s -> %s)", rpkg.Lpkg.FullName(),
lpkg.FullName(), pkg.PackageTypeNames[lpkg.Type()]))
}
depRpkg, _ := r.addPkg(lpkg)
rpkg.AddDep(depRpkg, expr)
}
}
// This iteration may have deleted some dependency relationships (e.g., if
// a new syscfg setting was discovered which causes this package's
// dependency list to be overwritten). Detect and delete these
// relationships.
for rdep, _ := range oldDeps {
if _, ok := rpkg.Deps[rdep]; !ok {
delete(rdep.revDeps, rpkg)
changed = true
// If we just deleted the last reference to a package, remove the
// package entirely from the resolver and syscfg.
if len(rdep.revDeps) == 0 {
if err := r.deletePkg(rdep); err != nil {
return true, err
}
}
}
}
for rdep, _ := range rpkg.Deps {
if _, ok := oldDeps[rdep]; !ok {
changed = true
}
}
return changed, nil
}