package internal import ( "bytes" "fmt" "go/format" "os" "path/filepath" "text/template" ) const importsTemplate = ` package main import ( {{range .Imports -}} _ "{{.}}" {{end -}} ) ` func (b Builder) updatePluginsFile() error { importsDest := filepath.Join(b.repo, "cmd", "golangci-lint", "plugins.go") info, err := os.Stat(importsDest) if err != nil { return fmt.Errorf("file %s not found: %w", importsDest, err) } source, err := generateImports(b.cfg) if err != nil { return fmt.Errorf("generate imports: %w", err) } b.log.Infof("generated imports info %s:\n%s\n", importsDest, source) err = os.WriteFile(filepath.Clean(importsDest), source, info.Mode()) if err != nil { return fmt.Errorf("write file %s: %w", importsDest, err) } return nil } func generateImports(cfg *Configuration) ([]byte, error) { impTmpl, err := template.New("plugins.go").Parse(importsTemplate) if err != nil { return nil, fmt.Errorf("parse template: %w", err) } var imps []string for _, plugin := range cfg.Plugins { imps = append(imps, plugin.Import) } buf := &bytes.Buffer{} err = impTmpl.Execute(buf, map[string]any{"Imports": imps}) if err != nil { return nil, fmt.Errorf("execute template: %w", err) } source, err := format.Source(buf.Bytes()) if err != nil { return nil, fmt.Errorf("format source: %w", err) } return source, nil }