From 2421c738a6a4c30a02943a43c8c5da21445fb56e Mon Sep 17 00:00:00 2001 From: Filipe Brandenburger Date: Fri, 29 Aug 2014 23:07:18 -0700 Subject: [PATCH] Add support for -version=raw to print the Go version.Info This can be helpful to print the internal fields of the version information that will contain more details about the git tree than the short -version output will. Tested: - Tested getting the raw version: $ _output/go/bin/kubecfg -version=raw version.Info{Major:"0", Minor:"1+", GitVersion:"v2.2.1-33-gdc4becd9765393", GitCommit:"dc4becd9765393fa05a3eb06f6af9e00068fe0c5", GitTreeState:"dirty"} - Tested getting the simple version: $ _output/go/bin/kubecfg -version Kubernetes version 0.1+, build dc4becd9765393fa05a3eb06f6af9e00068fe0c5 - Tested getting the help output: $ _output/go/bin/kubecfg 2>&1 | grep -- -version -version=false: Print version information and quit - Made sure -version=true and -version=false works, that -version with an invalid argument works as expected (prints usage help) and that -version followed by space will not try to use the next word as its argument (i.e. `-version raw` prints the version but not the raw one.) Signed-off-by: Filipe Brandenburger --- pkg/version/flag/flag.go | 58 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/pkg/version/flag/flag.go b/pkg/version/flag/flag.go index e467a80ca5f..4833f8f0cde 100644 --- a/pkg/version/flag/flag.go +++ b/pkg/version/flag/flag.go @@ -21,18 +21,72 @@ import ( "flag" "fmt" "os" + "strconv" "github.com/GoogleCloudPlatform/kubernetes/pkg/version" ) +type versionValue int + +const ( + VersionFalse versionValue = 0 + VersionTrue versionValue = 1 + VersionRaw versionValue = 2 +) + +const strRawVersion string = "raw" + +func (v *versionValue) IsBoolFlag() bool { + return true +} + +func (v *versionValue) Get() interface{} { + return versionValue(*v) +} + +func (v *versionValue) Set(s string) error { + if s == strRawVersion { + *v = VersionRaw + return nil + } + boolVal, err := strconv.ParseBool(s) + if boolVal { + *v = VersionTrue + } else { + *v = VersionFalse + } + return err +} + +func (v *versionValue) String() string { + if *v == VersionRaw { + return strRawVersion + } + return fmt.Sprintf("%v", bool(*v == VersionTrue)) +} + +func VersionVar(p *versionValue, name string, value versionValue, usage string) { + *p = value + flag.Var(p, name, usage) +} + +func Version(name string, value versionValue, usage string) *versionValue { + p := new(versionValue) + VersionVar(p, name, value, usage) + return p +} + var ( - versionFlag = flag.Bool("version", false, "Print version information and quit") + versionFlag = Version("version", VersionFalse, "Print version information and quit") ) // PrintAndExitIfRequested will check if the -version flag was passed // and, if so, print the version and exit. func PrintAndExitIfRequested() { - if *versionFlag { + if *versionFlag == VersionRaw { + fmt.Printf("%#v\n", version.Get()) + os.Exit(0) + } else if *versionFlag == VersionTrue { fmt.Printf("Kubernetes %s\n", version.Get()) os.Exit(0) }