func()

in internal/meta/config_info.go [33:111]


func (cfgs ConfigInfos) AddDependency() error {
	cfgs.addParentChildDependency()
	if err := cfgs.addReferenceDependency(); err != nil {
		return err
	}

	// Disduplicate then sort the dependencies
	for i, cfg := range cfgs {
		if len(cfg.DependsOn) == 0 {
			continue
		}

		// Disduplicate same resource ids that has exact one candidate
		set := map[string]bool{}
		duplicates := []Dependency{}
		for _, dep := range cfg.DependsOn {
			if len(dep.Candidates) == 1 {
				set[dep.Candidates[0]] = true
			} else {
				duplicates = append(duplicates, dep)
			}
		}

		// Disduplicate dependency that is parent of another dependency
		var covlist []string
		for dep := range set {
			for odep := range set {
				if dep == odep {
					continue
				}
				if strings.HasPrefix(strings.ToUpper(odep), strings.ToUpper(dep)) {
					covlist = append(covlist, dep)
					break
				}
			}
		}
		for _, dep := range covlist {
			delete(set, dep)
		}

		// If all duplicate candidates are child of this dependency, then also remove it.
		covlist = []string{}
		for dep := range set {
			for _, odep := range duplicates {
				allIsChild := true
				for _, candidate := range odep.Candidates {
					if !strings.HasPrefix(strings.ToUpper(candidate), strings.ToUpper(dep)) {
						allIsChild = false
						break
					}
				}
				if allIsChild {
					covlist = append(covlist, dep)
					break
				}
			}
		}
		for _, dep := range covlist {
			delete(set, dep)
		}

		// Sort the dependencies
		cfg.DependsOn = duplicates
		for id := range set {
			id := id
			cfg.DependsOn = append(cfg.DependsOn, Dependency{Candidates: []string{id}})
		}
		sort.Slice(cfg.DependsOn, func(i, j int) bool {
			d1, d2 := cfg.DependsOn[i], cfg.DependsOn[j]
			if len(d1.Candidates) != len(d2.Candidates) {
				return len(d1.Candidates) < len(d2.Candidates)
			}
			return strings.Join(d1.Candidates, "") < strings.Join(d2.Candidates, "")
		})
		cfgs[i] = cfg
	}

	return nil
}