func connectRequires()

in cmd/hub/compose/elaborate.go [859:935]


func connectRequires(parentStackName string, parentStackProvides []string,
	stackRequires []string, componentsManifests []manifest.Manifest, order []string) []string {

	provides := make(map[string][]string)
	addProv := func(name, prov string) {
		who, exist := provides[prov]
		if !exist {
			provides[prov] = []string{name}
		} else {
			if config.Trace && (!strings.HasPrefix(who[0], "*") || len(who) > 1) {
				log.Printf("`%s` already provides `%s`, but component `%s` also provides `%s`",
					strings.Join(who, ", "), prov, name, prov)
			}
			provides[prov] = append(who, name)
		}
	}

	requires := make(map[string][]string)
	addReq := func(name, req string) {
		by, exist := provides[req]
		if exist {
			if config.Debug {
				log.Printf("Component `%s` requirement `%s` provided by `%s`",
					name, req, strings.Join(by, ", "))
			}
			return
		}
		who, exist := requires[req]
		if !exist {
			requires[req] = []string{name}
		} else {
			requires[req] = append(who, name)
		}
	}

	parentStack := fmt.Sprintf("*%s*", parentStackName)
	for _, parentProvide := range parentStackProvides {
		addProv(parentStack, parentProvide)
		if parentProvide == "kubernetes" {
			addProv(parentStack, "kubectl")
		}
	}

	stack := "*stack*"
	for _, req := range stackRequires {
		addReq(stack, req)
	}

	components := make(map[string]manifest.Manifest)
	for _, component := range componentsManifests {
		name := manifest.ComponentQualifiedNameFromMeta(&component.Meta)
		components[name] = component
	}
	for _, name := range order {
		component := components[name]
		for _, req := range component.Requires {
			addReq(name, req)
		}
		for _, prov := range component.Provides {
			addProv(name, prov)
			if prov == "kubernetes" {
				addProv(name, "kubectl")
			}
		}
	}

	if config.Debug && len(requires) > 0 {
		log.Print("Stack requires:")
		util.PrintDeps(requires)
	}
	keys := make([]string, 0, len(requires))
	for k := range requires {
		keys = append(keys, k)
	}
	sort.Strings(keys)
	return keys
}