From 7081bc2ca8834a33538a85cc2cc860ad92ea438b Mon Sep 17 00:00:00 2001 From: jo Date: Thu, 5 Mar 2026 15:52:20 +0100 Subject: [PATCH 1/3] feat: add --long flag to version command --- internal/cmd/version/version.go | 44 +++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/internal/cmd/version/version.go b/internal/cmd/version/version.go index 48a1d1f30..fa0623783 100644 --- a/internal/cmd/version/version.go +++ b/internal/cmd/version/version.go @@ -1,6 +1,9 @@ package version import ( + "runtime" + "runtime/debug" + "github.com/spf13/cobra" "github.com/hetznercloud/cli/internal/cmd/util" @@ -16,10 +19,51 @@ func NewCommand(_ state.State) *cobra.Command { DisableFlagsInUseLine: true, RunE: runVersion, } + cmd.Flags().Bool("long", false, "Print more version information (true, false)") return cmd } func runVersion(cmd *cobra.Command, _ []string) error { cmd.Printf("hcloud %s\n", version.Version) + + long, _ := cmd.Flags().GetBool("long") + if long { + m := versionMetadata() + cmd.Printf(`revision: %s +build date: %s +go version: %s +platform: %s +`, + m["revision"], + m["build date"], + m["go version"], + m["platform"], + ) + } return nil } + +func versionMetadata() map[string]string { + m := map[string]string{ + "revision": "unknown", + "build date": "unknown", + "go version": runtime.Version(), + "platform": runtime.GOOS + "/" + runtime.GOARCH, + } + + info, ok := debug.ReadBuildInfo() + if !ok { + return m + } + + for _, setting := range info.Settings { + if setting.Key == "vcs.revision" { + m["revision"] = setting.Value + } + if setting.Key == "vcs.time" { + m["date"] = setting.Value + } + } + + return m +} From d656303f285d359a4f54ea47098061f64f3777a3 Mon Sep 17 00:00:00 2001 From: phm07 <22707808+phm07@users.noreply.github.com> Date: Thu, 5 Mar 2026 16:40:04 +0100 Subject: [PATCH 2/3] wip --- docs/reference/manual/hcloud_version.md | 1 + internal/cmd/version/version.go | 51 +++++++++---------------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/docs/reference/manual/hcloud_version.md b/docs/reference/manual/hcloud_version.md index 94a9f2896..729cec4b5 100644 --- a/docs/reference/manual/hcloud_version.md +++ b/docs/reference/manual/hcloud_version.md @@ -10,6 +10,7 @@ hcloud version ``` -h, --help help for version + --long Print more version information (true, false) ``` ### Options inherited from parent commands diff --git a/internal/cmd/version/version.go b/internal/cmd/version/version.go index fa0623783..149a3f388 100644 --- a/internal/cmd/version/version.go +++ b/internal/cmd/version/version.go @@ -1,8 +1,10 @@ package version import ( + "fmt" "runtime" "runtime/debug" + "text/tabwriter" "github.com/spf13/cobra" @@ -28,42 +30,27 @@ func runVersion(cmd *cobra.Command, _ []string) error { long, _ := cmd.Flags().GetBool("long") if long { - m := versionMetadata() - cmd.Printf(`revision: %s -build date: %s -go version: %s -platform: %s -`, - m["revision"], - m["build date"], - m["go version"], - m["platform"], - ) + tw := tabwriter.NewWriter(cmd.OutOrStdout(), 0, 8, 2, ' ', 0) + fmt.Fprintln(tw) + fmt.Fprintf(tw, "go version:\t%s\n", runtime.Version()) + fmt.Fprintf(tw, "platform:\t%s/%s\n", runtime.GOOS, runtime.GOARCH) + fmt.Fprintf(tw, "compiler:\t%s\n", runtime.Compiler) + + if info, ok := debug.ReadBuildInfo(); ok { + fmt.Fprintf(tw, "revision:\t%s\n", getSettingsValue(info.Settings, "vcs.revision", "unknown")) + fmt.Fprintf(tw, "revision date:\t%s\n", getSettingsValue(info.Settings, "vcs.time", "unknown")) + fmt.Fprintf(tw, "modified:\t%s\n", getSettingsValue(info.Settings, "vcs.modified", "unknown")) + } + return tw.Flush() } return nil } -func versionMetadata() map[string]string { - m := map[string]string{ - "revision": "unknown", - "build date": "unknown", - "go version": runtime.Version(), - "platform": runtime.GOOS + "/" + runtime.GOARCH, - } - - info, ok := debug.ReadBuildInfo() - if !ok { - return m - } - - for _, setting := range info.Settings { - if setting.Key == "vcs.revision" { - m["revision"] = setting.Value - } - if setting.Key == "vcs.time" { - m["date"] = setting.Value +func getSettingsValue(settings []debug.BuildSetting, key, def string) string { + for _, setting := range settings { + if setting.Key == key { + return setting.Value } } - - return m + return def } From b8e7b5c809a9b900209659cdfdc6262c20d999e2 Mon Sep 17 00:00:00 2001 From: phm07 <22707808+phm07@users.noreply.github.com> Date: Thu, 5 Mar 2026 16:55:31 +0100 Subject: [PATCH 3/3] wip --- internal/cmd/version/version.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/internal/cmd/version/version.go b/internal/cmd/version/version.go index 149a3f388..6899565ed 100644 --- a/internal/cmd/version/version.go +++ b/internal/cmd/version/version.go @@ -32,14 +32,17 @@ func runVersion(cmd *cobra.Command, _ []string) error { if long { tw := tabwriter.NewWriter(cmd.OutOrStdout(), 0, 8, 2, ' ', 0) fmt.Fprintln(tw) - fmt.Fprintf(tw, "go version:\t%s\n", runtime.Version()) + fmt.Fprintf(tw, "go version:\t%s (%s)\n", runtime.Version(), runtime.Compiler) fmt.Fprintf(tw, "platform:\t%s/%s\n", runtime.GOOS, runtime.GOARCH) - fmt.Fprintf(tw, "compiler:\t%s\n", runtime.Compiler) if info, ok := debug.ReadBuildInfo(); ok { - fmt.Fprintf(tw, "revision:\t%s\n", getSettingsValue(info.Settings, "vcs.revision", "unknown")) + rev := getSettingsValue(info.Settings, "vcs.revision", "unknown") + if modified := getSettingsValue(info.Settings, "vcs.modified", "false"); modified == "true" { + rev += " (modified)" + } + + fmt.Fprintf(tw, "revision:\t%s\n", rev) fmt.Fprintf(tw, "revision date:\t%s\n", getSettingsValue(info.Settings, "vcs.time", "unknown")) - fmt.Fprintf(tw, "modified:\t%s\n", getSettingsValue(info.Settings, "vcs.modified", "unknown")) } return tw.Flush() }