diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 6099df9..86eec33 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -34,7 +34,7 @@ jobs: out="dist/netssh_${GOOS}_${GOARCH}" echo "→ $out" CGO_ENABLED=0 GOOS=$GOOS GOARCH=$GOARCH \ - go build -trimpath -ldflags="-s -w" \ + go build -trimpath -ldflags="-s -w -X main.version=${GITHUB_REF_NAME}" \ -o "$out" ./cmd/netssh done diff --git a/cmd/netssh/main.go b/cmd/netssh/main.go index c8157ea..0f8743f 100644 --- a/cmd/netssh/main.go +++ b/cmd/netssh/main.go @@ -40,6 +40,7 @@ var managedSubcommands = map[string]bool{ "completion": true, "__complete": true, "help": true, + "version": true, } func main() { @@ -49,6 +50,10 @@ func main() { runTUI() return } + if args[0] == "--version" { + fmt.Printf("netssh %s\n", buildVersion()) + return + } if managedSubcommands[args[0]] { if err := rootCmd().Execute(); err != nil { @@ -352,7 +357,7 @@ func rootCmd() *cobra.Command { }, } - root.AddCommand(notesCmd(), configureCmd(), searchCmd(), cacheCmd(), aliasCmd(), hookCmd(), shellInitCmd()) + root.AddCommand(notesCmd(), configureCmd(), searchCmd(), cacheCmd(), aliasCmd(), hookCmd(), shellInitCmd(), versionCmd()) // cobra builds the "completion" command lazily; force init so we can extend it. root.InitDefaultCompletionCmd() diff --git a/cmd/netssh/version.go b/cmd/netssh/version.go new file mode 100644 index 0000000..80e2357 --- /dev/null +++ b/cmd/netssh/version.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "runtime/debug" + + "github.com/spf13/cobra" +) + +// version is set at build time: -ldflags "-X main.version=v1.2.3". +var version = "" + +// buildVersion falls back to the module version for `go install` builds. +func buildVersion() string { + if version != "" { + return version + } + if info, ok := debug.ReadBuildInfo(); ok && info.Main.Version != "" && info.Main.Version != "(devel)" { + return info.Main.Version + } + return "dev" +} + +func versionCmd() *cobra.Command { + return &cobra.Command{ + Use: "version", + Short: "Print the netssh version", + Args: cobra.NoArgs, + Run: func(cmd *cobra.Command, args []string) { + fmt.Fprintf(cmd.OutOrStdout(), "netssh %s\n", buildVersion()) + }, + } +}