cmd: add a 'version' subcommand and flag to show the version
This commit is contained in:
@@ -5,6 +5,8 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"git.offline-twitter.com/offline-labs/gas-stack/pkg/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -16,12 +18,16 @@ const (
|
|||||||
func main() {
|
func main() {
|
||||||
root_cmd := &cobra.Command{
|
root_cmd := &cobra.Command{
|
||||||
Use: "gas",
|
Use: "gas",
|
||||||
|
Version: version.String(),
|
||||||
SilenceErrors: true,
|
SilenceErrors: true,
|
||||||
SilenceUsage: true,
|
SilenceUsage: true,
|
||||||
}
|
}
|
||||||
|
// Print a bare version string ("v0.0.4"), rather than cobra's "gas version v0.0.4".
|
||||||
|
root_cmd.SetVersionTemplate("{{.Version}}\n")
|
||||||
root_cmd.AddCommand(sqlite_lint)
|
root_cmd.AddCommand(sqlite_lint)
|
||||||
root_cmd.AddCommand(cmd_init)
|
root_cmd.AddCommand(cmd_init)
|
||||||
root_cmd.AddCommand(generate_model)
|
root_cmd.AddCommand(generate_model)
|
||||||
|
root_cmd.AddCommand(cmd_version)
|
||||||
if err := root_cmd.Execute(); err != nil {
|
if err := root_cmd.Execute(); err != nil {
|
||||||
fmt.Println(RED + err.Error() + RESET)
|
fmt.Println(RED + err.Error() + RESET)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|||||||
19
cmd/subcmd_version.go
Normal file
19
cmd/subcmd_version.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"git.offline-twitter.com/offline-labs/gas-stack/pkg/version"
|
||||||
|
)
|
||||||
|
|
||||||
|
var cmd_version = &cobra.Command{
|
||||||
|
Use: "version",
|
||||||
|
Short: "Print the version of `gas`",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Println(version.String())
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -1,3 +1,10 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
go build -tags fts5 -o gas ./cmd
|
# Stamp the version into the binary. `git describe` fails when this isn't a git checkout (e.g. a
|
||||||
|
# source export with no .git dir); in that case leave it empty, and pkg/version falls back to the
|
||||||
|
# build info that the Go toolchain embeds.
|
||||||
|
VERSION=$(git describe --tags --always --dirty 2>/dev/null)
|
||||||
|
|
||||||
|
go build -tags fts5 \
|
||||||
|
-ldflags "-X git.offline-twitter.com/offline-labs/gas-stack/pkg/version.Version=$VERSION" \
|
||||||
|
-o gas ./cmd
|
||||||
|
|||||||
55
pkg/version/version.go
Normal file
55
pkg/version/version.go
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
package version
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"runtime/debug"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Version is stamped in at compile time by `ops/compile.sh`, via:
|
||||||
|
//
|
||||||
|
// -ldflags "-X git.offline-twitter.com/offline-labs/gas-stack/pkg/version.Version=v0.0.4"
|
||||||
|
//
|
||||||
|
// It's empty for builds that don't go through that script-- most importantly
|
||||||
|
// `go install git.offline-twitter.com/offline-labs/gas-stack/cmd@v0.0.4`, which is the normal way
|
||||||
|
// to install `gas`. In that case, String() recovers the version from the build info that the Go
|
||||||
|
// toolchain embeds in every binary.
|
||||||
|
var Version = ""
|
||||||
|
|
||||||
|
// String returns the version of this binary, e.g. "v0.0.4".
|
||||||
|
func String() string {
|
||||||
|
if Version != "" {
|
||||||
|
return Version
|
||||||
|
}
|
||||||
|
|
||||||
|
info, ok := debug.ReadBuildInfo()
|
||||||
|
if !ok {
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set by `go install module@version`, and (as of Go 1.24) by `go build` in a git checkout
|
||||||
|
// that has the tags available. It's "(devel)" if the toolchain couldn't work out a version.
|
||||||
|
if info.Main.Version != "" && info.Main.Version != "(devel)" {
|
||||||
|
return info.Main.Version
|
||||||
|
}
|
||||||
|
|
||||||
|
// No module version, so fall back to the commit. This happens when building from a source
|
||||||
|
// tree with no usable VCS metadata: a git worktree, a `.git`-less export, or `-buildvcs=false`.
|
||||||
|
var revision, dirty string
|
||||||
|
for _, setting := range info.Settings {
|
||||||
|
switch setting.Key {
|
||||||
|
case "vcs.revision":
|
||||||
|
revision = setting.Value
|
||||||
|
case "vcs.modified":
|
||||||
|
if setting.Value == "true" {
|
||||||
|
dirty = "-dirty"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if revision == "" {
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
if len(revision) > 12 {
|
||||||
|
revision = revision[:12]
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("devel-%s%s", revision, dirty)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user