133 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"encoding/json"
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"path/filepath"
 | |
| 
 | |
| 	"github.com/golangci/golangci-lint/pkg/config"
 | |
| 	"github.com/golangci/golangci-lint/pkg/lint/lintersdb"
 | |
| 	"github.com/golangci/golangci-lint/scripts/website/types"
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	err := saveLinters()
 | |
| 	if err != nil {
 | |
| 		log.Fatalf("Save linters: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	err = saveDefaultExclusions()
 | |
| 	if err != nil {
 | |
| 		log.Fatalf("Save default exclusions: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	err = saveCLIHelp(filepath.Join("assets", "cli-help.json"))
 | |
| 	if err != nil {
 | |
| 		log.Fatalf("Save CLI help: %v", err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func saveLinters() error {
 | |
| 	linters, _ := lintersdb.NewLinterBuilder().Build(config.NewDefault())
 | |
| 
 | |
| 	var wraps []types.LinterWrapper
 | |
| 	for _, l := range linters {
 | |
| 		wrapper := types.LinterWrapper{
 | |
| 			Name:             l.Linter.Name(),
 | |
| 			Desc:             l.Linter.Desc(),
 | |
| 			EnabledByDefault: l.EnabledByDefault,
 | |
| 			LoadMode:         l.LoadMode,
 | |
| 			InPresets:        l.InPresets,
 | |
| 			AlternativeNames: l.AlternativeNames,
 | |
| 			OriginalURL:      l.OriginalURL,
 | |
| 			Internal:         l.Internal,
 | |
| 			CanAutoFix:       l.CanAutoFix,
 | |
| 			IsSlow:           l.IsSlow,
 | |
| 			DoesChangeTypes:  l.DoesChangeTypes,
 | |
| 			Since:            l.Since,
 | |
| 		}
 | |
| 
 | |
| 		if l.Deprecation != nil {
 | |
| 			wrapper.Deprecation = &types.Deprecation{
 | |
| 				Since:       l.Deprecation.Since,
 | |
| 				Message:     l.Deprecation.Message,
 | |
| 				Replacement: l.Deprecation.Replacement,
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		wraps = append(wraps, wrapper)
 | |
| 	}
 | |
| 
 | |
| 	return saveToJSONFile(filepath.Join("assets", "linters-info.json"), wraps)
 | |
| }
 | |
| 
 | |
| func saveDefaultExclusions() error {
 | |
| 	var excludePatterns []types.ExcludePattern
 | |
| 
 | |
| 	for _, pattern := range config.DefaultExcludePatterns {
 | |
| 		excludePatterns = append(excludePatterns, types.ExcludePattern{
 | |
| 			ID:      pattern.ID,
 | |
| 			Pattern: pattern.Pattern,
 | |
| 			Linter:  pattern.Linter,
 | |
| 			Why:     pattern.Why,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	return saveToJSONFile(filepath.Join("assets", "default-exclusions.json"), excludePatterns)
 | |
| }
 | |
| 
 | |
| func saveCLIHelp(dst string) error {
 | |
| 	err := exec.Command("make", "build").Run()
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("can't run make build: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	lintersOut, err := exec.Command("./golangci-lint", "help", "linters").Output()
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("can't run linters cmd: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	lintersOutParts := bytes.Split(lintersOut, []byte("\n\n"))
 | |
| 
 | |
| 	helpCmd := exec.Command("./golangci-lint", "run", "-h")
 | |
| 	helpCmd.Env = append(helpCmd.Env, os.Environ()...)
 | |
| 	helpCmd.Env = append(helpCmd.Env, "HELP_RUN=1") // make default concurrency stable: don't depend on machine CPU number
 | |
| 	help, err := helpCmd.Output()
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("can't run help cmd: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	helpLines := bytes.Split(help, []byte("\n"))
 | |
| 	shortHelp := bytes.Join(helpLines[2:], []byte("\n"))
 | |
| 
 | |
| 	data := types.CLIHelp{
 | |
| 		Enable: string(lintersOutParts[0]),
 | |
| 		Help:   string(shortHelp),
 | |
| 	}
 | |
| 
 | |
| 	return saveToJSONFile(dst, data)
 | |
| }
 | |
| 
 | |
| func saveToJSONFile(dst string, data any) error {
 | |
| 	file, err := os.Create(dst)
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("open file (%s): %w", dst, err)
 | |
| 	}
 | |
| 
 | |
| 	defer func() { _ = file.Close() }()
 | |
| 
 | |
| 	encoder := json.NewEncoder(file)
 | |
| 	encoder.SetIndent("", "  ")
 | |
| 
 | |
| 	err = encoder.Encode(data)
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("encode JSON (%s): %w", dst, err)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | 
