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
}