This adds the following commands: - faas-cli - faas-cli help - faas-cli build - faas-cli deploy - faas-cli remove (alias: rm) - faas-cli version - faas-cli push Note that the following is also added but hidden from help pending a more robust bash completion solution, initially using the Cobra generated bash completion but needs spf13/cobra#520 to merge before it'll work on the OSX default Bash 3.x. - faas-cli bashcompletion This commit intercepts the command line args passed to `faas-cli` and attempts to translate them from the deprecated go flag based syntax (`faas-cli -action xxx`) to the new Cobra verb/noun based syntax (`faas-cli xxx`), it also translates a frozen set of legacy flags (with the go-style single-dash) into a GNU style double-dash. Note that some special cases are included: - changing the delete action to remove - passing the function name as a noun to remove rather than as an arg to `-name` - it also handles the legacy format where args are passed after = (`-name=fnname`). If the translation results in a new set of args then a message is displayed to the user (stderr) telling warning that they are using the deprecated cli syntax and also prints the new syntax command that is being executed and which they should use going forward. Any errors thrown during translation result in the command failing with it printing the error cause to stderr. This renames the `fetchTemplates.go` file to use snake case. The convention appears to be for snakecase - as observed in both the Go and Kubernetes source. For example heres a random selection of source files. - https://github.com/kubernetes/kubernetes/blob/master/pkg/kubeapiserver/default_storage_factory_builder.go - https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/bash_comp_utils.go - https://github.com/golang/go/blob/master/src/compress/bzip2/move_to_front.go Note that the language spec does not set a hard rule for source file names, only for package names, but making this change for consistency. Note that this file was initially generated by Cobra, but has been tweaked to include some fixes. It it an experimental initial version. This commit adds some instructions on enabling the `faas-cli` bash auto-completion support. Instructions for Linux users are very light as it differs per-distro and the assumption is that Linux users should be capable of following their Distros instructions on enabling bash completion support. Signed-off-by: John McCabe <john@johnmccabe.net>
148 lines
4.5 KiB
Go
148 lines
4.5 KiB
Go
package pflag
|
|
|
|
import (
|
|
"io"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// -- boolSlice Value
|
|
type boolSliceValue struct {
|
|
value *[]bool
|
|
changed bool
|
|
}
|
|
|
|
func newBoolSliceValue(val []bool, p *[]bool) *boolSliceValue {
|
|
bsv := new(boolSliceValue)
|
|
bsv.value = p
|
|
*bsv.value = val
|
|
return bsv
|
|
}
|
|
|
|
// Set converts, and assigns, the comma-separated boolean argument string representation as the []bool value of this flag.
|
|
// If Set is called on a flag that already has a []bool assigned, the newly converted values will be appended.
|
|
func (s *boolSliceValue) Set(val string) error {
|
|
|
|
// remove all quote characters
|
|
rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "")
|
|
|
|
// read flag arguments with CSV parser
|
|
boolStrSlice, err := readAsCSV(rmQuote.Replace(val))
|
|
if err != nil && err != io.EOF {
|
|
return err
|
|
}
|
|
|
|
// parse boolean values into slice
|
|
out := make([]bool, 0, len(boolStrSlice))
|
|
for _, boolStr := range boolStrSlice {
|
|
b, err := strconv.ParseBool(strings.TrimSpace(boolStr))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
out = append(out, b)
|
|
}
|
|
|
|
if !s.changed {
|
|
*s.value = out
|
|
} else {
|
|
*s.value = append(*s.value, out...)
|
|
}
|
|
|
|
s.changed = true
|
|
|
|
return nil
|
|
}
|
|
|
|
// Type returns a string that uniquely represents this flag's type.
|
|
func (s *boolSliceValue) Type() string {
|
|
return "boolSlice"
|
|
}
|
|
|
|
// String defines a "native" format for this boolean slice flag value.
|
|
func (s *boolSliceValue) String() string {
|
|
|
|
boolStrSlice := make([]string, len(*s.value))
|
|
for i, b := range *s.value {
|
|
boolStrSlice[i] = strconv.FormatBool(b)
|
|
}
|
|
|
|
out, _ := writeAsCSV(boolStrSlice)
|
|
|
|
return "[" + out + "]"
|
|
}
|
|
|
|
func boolSliceConv(val string) (interface{}, error) {
|
|
val = strings.Trim(val, "[]")
|
|
// Empty string would cause a slice with one (empty) entry
|
|
if len(val) == 0 {
|
|
return []bool{}, nil
|
|
}
|
|
ss := strings.Split(val, ",")
|
|
out := make([]bool, len(ss))
|
|
for i, t := range ss {
|
|
var err error
|
|
out[i], err = strconv.ParseBool(t)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
// GetBoolSlice returns the []bool value of a flag with the given name.
|
|
func (f *FlagSet) GetBoolSlice(name string) ([]bool, error) {
|
|
val, err := f.getFlagType(name, "boolSlice", boolSliceConv)
|
|
if err != nil {
|
|
return []bool{}, err
|
|
}
|
|
return val.([]bool), nil
|
|
}
|
|
|
|
// BoolSliceVar defines a boolSlice flag with specified name, default value, and usage string.
|
|
// The argument p points to a []bool variable in which to store the value of the flag.
|
|
func (f *FlagSet) BoolSliceVar(p *[]bool, name string, value []bool, usage string) {
|
|
f.VarP(newBoolSliceValue(value, p), name, "", usage)
|
|
}
|
|
|
|
// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
func (f *FlagSet) BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) {
|
|
f.VarP(newBoolSliceValue(value, p), name, shorthand, usage)
|
|
}
|
|
|
|
// BoolSliceVar defines a []bool flag with specified name, default value, and usage string.
|
|
// The argument p points to a []bool variable in which to store the value of the flag.
|
|
func BoolSliceVar(p *[]bool, name string, value []bool, usage string) {
|
|
CommandLine.VarP(newBoolSliceValue(value, p), name, "", usage)
|
|
}
|
|
|
|
// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
func BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) {
|
|
CommandLine.VarP(newBoolSliceValue(value, p), name, shorthand, usage)
|
|
}
|
|
|
|
// BoolSlice defines a []bool flag with specified name, default value, and usage string.
|
|
// The return value is the address of a []bool variable that stores the value of the flag.
|
|
func (f *FlagSet) BoolSlice(name string, value []bool, usage string) *[]bool {
|
|
p := []bool{}
|
|
f.BoolSliceVarP(&p, name, "", value, usage)
|
|
return &p
|
|
}
|
|
|
|
// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
func (f *FlagSet) BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool {
|
|
p := []bool{}
|
|
f.BoolSliceVarP(&p, name, shorthand, value, usage)
|
|
return &p
|
|
}
|
|
|
|
// BoolSlice defines a []bool flag with specified name, default value, and usage string.
|
|
// The return value is the address of a []bool variable that stores the value of the flag.
|
|
func BoolSlice(name string, value []bool, usage string) *[]bool {
|
|
return CommandLine.BoolSliceP(name, "", value, usage)
|
|
}
|
|
|
|
// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
func BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool {
|
|
return CommandLine.BoolSliceP(name, shorthand, value, usage)
|
|
}
|