in plugin/setup.go [84:104]
func (c Config) setupPlugins(plugins chan pluginInfo, status map[string]bool) ([]pluginInfo, error) {
var (
result []pluginInfo
num = len(plugins)
)
for num > 0 {
for i := 0; i < num; i++ {
p := <-plugins
if err := p.setup(); err != nil {
return nil, err
}
status[p.key()] = true
result = append(result, p)
}
if len(plugins) == num { // none plugin is setup, circular dependency exists.
return nil, fmt.Errorf("cycle depends, not plugin is setup")
}
num = len(plugins) // continue to process plugins that were moved to tail of the channel.
}
return result, nil
}