func()

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
}