github.com/chenfeining/golangci-lint@v1.0.2-0.20230730162517-14c6c67868df/pkg/commands/version.go (about)

     1  package commands
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"runtime/debug"
     9  	"strings"
    10  
    11  	"github.com/spf13/cobra"
    12  	"github.com/spf13/pflag"
    13  
    14  	"github.com/chenfeining/golangci-lint/pkg/config"
    15  )
    16  
    17  type versionInfo struct {
    18  	Info      BuildInfo
    19  	BuildInfo *debug.BuildInfo
    20  }
    21  
    22  func (e *Executor) initVersionConfiguration(cmd *cobra.Command) {
    23  	fs := cmd.Flags()
    24  	fs.SortFlags = false // sort them as they are defined here
    25  	initVersionFlagSet(fs, e.cfg)
    26  }
    27  
    28  func initVersionFlagSet(fs *pflag.FlagSet, cfg *config.Config) {
    29  	// Version config
    30  	vc := &cfg.Version
    31  	fs.StringVar(&vc.Format, "format", "", wh("The version's format can be: 'short', 'json'"))
    32  	fs.BoolVar(&vc.Debug, "debug", false, wh("Add build information"))
    33  }
    34  
    35  func (e *Executor) initVersion() {
    36  	versionCmd := &cobra.Command{
    37  		Use:               "version",
    38  		Short:             "Version",
    39  		Args:              cobra.NoArgs,
    40  		ValidArgsFunction: cobra.NoFileCompletions,
    41  		RunE: func(cmd *cobra.Command, _ []string) error {
    42  			if e.cfg.Version.Debug {
    43  				info, ok := debug.ReadBuildInfo()
    44  				if !ok {
    45  					return nil
    46  				}
    47  
    48  				switch strings.ToLower(e.cfg.Version.Format) {
    49  				case "json":
    50  					return json.NewEncoder(os.Stdout).Encode(versionInfo{
    51  						Info:      e.buildInfo,
    52  						BuildInfo: info,
    53  					})
    54  
    55  				default:
    56  					fmt.Println(info.String())
    57  					return printVersion(os.Stdout, e.buildInfo)
    58  				}
    59  			}
    60  
    61  			switch strings.ToLower(e.cfg.Version.Format) {
    62  			case "short":
    63  				fmt.Println(e.buildInfo.Version)
    64  				return nil
    65  
    66  			case "json":
    67  				return json.NewEncoder(os.Stdout).Encode(e.buildInfo)
    68  
    69  			default:
    70  				return printVersion(os.Stdout, e.buildInfo)
    71  			}
    72  		},
    73  	}
    74  
    75  	e.rootCmd.AddCommand(versionCmd)
    76  	e.initVersionConfiguration(versionCmd)
    77  }
    78  
    79  func printVersion(w io.Writer, buildInfo BuildInfo) error {
    80  	_, err := fmt.Fprintf(w, "golangci-lint has version %s built with %s from %s on %s\n",
    81  		buildInfo.Version, buildInfo.GoVersion, buildInfo.Commit, buildInfo.Date)
    82  	return err
    83  }