2024-02-27 00:03:48 +01:00

99 lines
2.0 KiB
Go

package commands
import (
"encoding/json"
"fmt"
"io"
"os"
"runtime/debug"
"strings"
"github.com/fatih/color"
"github.com/spf13/cobra"
)
type BuildInfo struct {
GoVersion string `json:"goVersion"`
Version string `json:"version"`
Commit string `json:"commit"`
Date string `json:"date"`
}
type versionInfo struct {
Info BuildInfo
BuildInfo *debug.BuildInfo
}
type versionOptions struct {
Format string `mapstructure:"format"`
Debug bool `mapstructure:"debug"`
}
type versionCommand struct {
cmd *cobra.Command
opts versionOptions
info BuildInfo
}
func newVersionCommand(info BuildInfo) *versionCommand {
c := &versionCommand{info: info}
versionCmd := &cobra.Command{
Use: "version",
Short: "Version",
Args: cobra.NoArgs,
ValidArgsFunction: cobra.NoFileCompletions,
RunE: c.execute,
}
fs := versionCmd.Flags()
fs.SortFlags = false // sort them as they are defined here
fs.StringVar(&c.opts.Format, "format", "", color.GreenString("The version's format can be: 'short', 'json'"))
fs.BoolVar(&c.opts.Debug, "debug", false, color.GreenString("Add build information"))
c.cmd = versionCmd
return c
}
func (c *versionCommand) execute(_ *cobra.Command, _ []string) error {
if c.opts.Debug {
info, ok := debug.ReadBuildInfo()
if !ok {
return nil
}
switch strings.ToLower(c.opts.Format) {
case "json":
return json.NewEncoder(os.Stdout).Encode(versionInfo{
Info: c.info,
BuildInfo: info,
})
default:
fmt.Println(info.String())
return printVersion(os.Stdout, c.info)
}
}
switch strings.ToLower(c.opts.Format) {
case "short":
fmt.Println(c.info.Version)
return nil
case "json":
return json.NewEncoder(os.Stdout).Encode(c.info)
default:
return printVersion(os.Stdout, c.info)
}
}
func printVersion(w io.Writer, info BuildInfo) error {
_, err := fmt.Fprintf(w, "golangci-lint has version %s built with %s from %s on %s\n",
info.Version, info.GoVersion, info.Commit, info.Date)
return err
}