X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/25a80e9318880fbff91289ac8f70e1cae4c132a2..84c753c29346450bae7efd8f8bcd11aa7ea71109:/lib/cmd/cmd.go diff --git a/lib/cmd/cmd.go b/lib/cmd/cmd.go index 8b8427a700..24b69f0cc5 100644 --- a/lib/cmd/cmd.go +++ b/lib/cmd/cmd.go @@ -12,6 +12,8 @@ import ( "io" "io/ioutil" "path/filepath" + "regexp" + "runtime" "sort" "strings" ) @@ -26,8 +28,24 @@ func (f HandlerFunc) RunCommand(prog string, args []string, stdin io.Reader, std return f(prog, args, stdin, stdout, stderr) } -// Multi is a Handler that looks up its first argument in a map, and -// invokes the resulting Handler with the remaining args. +// Version is a Handler that prints the package version (set at build +// time using -ldflags) and Go runtime version to stdout, and returns +// 0. +var Version versionCommand + +var version = "dev" + +type versionCommand struct{} + +func (versionCommand) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int { + prog = regexp.MustCompile(` -*version$`).ReplaceAllLiteralString(prog, "") + fmt.Fprintf(stdout, "%s %s (%s)\n", prog, version, runtime.Version()) + return 0 +} + +// Multi is a Handler that looks up its first argument in a map (after +// stripping any "arvados-" or "crunch-" prefix), and invokes the +// resulting Handler with the remaining args. // // Example: // @@ -42,14 +60,15 @@ func (f HandlerFunc) RunCommand(prog string, args []string, stdin io.Reader, std type Multi map[string]Handler func (m Multi) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int { - if len(args) < 1 { - fmt.Fprintf(stderr, "usage: %s command [args]\n", prog) - m.Usage(stderr) - return 2 - } _, basename := filepath.Split(prog) + basename = strings.TrimPrefix(basename, "arvados-") + basename = strings.TrimPrefix(basename, "crunch-") if cmd, ok := m[basename]; ok { return cmd.RunCommand(prog, args, stdin, stdout, stderr) + } else if len(args) < 1 { + fmt.Fprintf(stderr, "usage: %s command [args]\n", prog) + m.Usage(stderr) + return 2 } else if cmd, ok = m[args[0]]; ok { return cmd.RunCommand(prog+" "+args[0], args[1:], stdin, stdout, stderr) } else {