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 }