70 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
}
 |