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 dc4becd976

- 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 <filbranden@google.com>
pull/6/head
Filipe Brandenburger 2014-08-29 23:07:18 -07:00
parent dc4becd976
commit 2421c738a6
1 changed files with 56 additions and 2 deletions

View File

@ -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)
}