2023-03-02 00:34:22 +01:00

84 lines
1.9 KiB
Go

package commands
import (
"encoding/json"
"fmt"
"io"
"os"
"runtime/debug"
"strings"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/golangci/golangci-lint/pkg/config"
)
type versionInfo struct {
Info BuildInfo
BuildInfo *debug.BuildInfo
}
func (e *Executor) initVersionConfiguration(cmd *cobra.Command) {
fs := cmd.Flags()
fs.SortFlags = false // sort them as they are defined here
initVersionFlagSet(fs, e.cfg)
}
func initVersionFlagSet(fs *pflag.FlagSet, cfg *config.Config) {
// Version config
vc := &cfg.Version
fs.StringVar(&vc.Format, "format", "", wh("The version's format can be: 'short', 'json'"))
fs.BoolVar(&vc.Debug, "debug", false, wh("Add build information"))
}
func (e *Executor) initVersion() {
versionCmd := &cobra.Command{
Use: "version",
Short: "Version",
Args: cobra.NoArgs,
ValidArgsFunction: cobra.NoFileCompletions,
RunE: func(cmd *cobra.Command, _ []string) error {
if e.cfg.Version.Debug {
info, ok := debug.ReadBuildInfo()
if !ok {
return nil
}
switch strings.ToLower(e.cfg.Version.Format) {
case "json":
return json.NewEncoder(os.Stdout).Encode(versionInfo{
Info: e.buildInfo,
BuildInfo: info,
})
default:
fmt.Println(info.String())
return printVersion(os.Stdout, e.buildInfo)
}
}
switch strings.ToLower(e.cfg.Version.Format) {
case "short":
fmt.Println(e.buildInfo.Version)
return nil
case "json":
return json.NewEncoder(os.Stdout).Encode(e.buildInfo)
default:
return printVersion(os.Stdout, e.buildInfo)
}
},
}
e.rootCmd.AddCommand(versionCmd)
e.initVersionConfiguration(versionCmd)
}
func printVersion(w io.Writer, buildInfo BuildInfo) error {
_, err := fmt.Fprintf(w, "golangci-lint has version %s built with %s from %s on %s\n",
buildInfo.Version, buildInfo.GoVersion, buildInfo.Commit, buildInfo.Date)
return err
}