This commit is contained in:
wxio 2018-01-16 06:03:39 +00:00 committed by GitHub
commit e3696aed41

View file

@ -436,24 +436,34 @@ func (c *Command) VersionTemplate() string {
`
}
func hasNoOptDefVal(name string, fs *flag.FlagSet) bool {
flag := fs.Lookup(name)
func hasDefault(name string, c *Command) bool {
flag := c.Flags().Lookup(name)
if flag == nil {
return false
return true
}
if flag.Value.Type() == "bool" {
return true
}
return flag.NoOptDefVal != ""
}
func shortHasNoOptDefVal(name string, fs *flag.FlagSet) bool {
if len(name) == 0 {
return false
}
flag := fs.ShorthandLookup(name[:1])
func shortWithSpace(arg string, c *Command) bool {
if strings.HasPrefix(arg, "-") {
if !strings.Contains(arg, "=") {
if len(arg) == 2 {
flag := c.Flags().ShorthandLookup(arg[1:])
if flag == nil {
return false
}
if flag.Value.Type() == "bool" {
return false
}
//shortHasNoOptDefVal
return flag.NoOptDefVal != ""
}
}
}
return false
}
func stripFlags(args []string, c *Command) []string {
@ -461,20 +471,17 @@ func stripFlags(args []string, c *Command) []string {
return args
}
c.mergePersistentFlags()
commands := []string{}
flags := c.Flags()
Loop:
for len(args) > 0 {
s := args[0]
args = args[1:]
switch {
case strings.HasPrefix(s, "--") && !strings.Contains(s, "=") && !hasNoOptDefVal(s[2:], flags):
case strings.HasPrefix(s, "--") && !strings.Contains(s, "=") && !hasDefault(s[2:], c):
// If '--flag arg' then
// delete arg from args.
fallthrough // (do the same as below)
case strings.HasPrefix(s, "-") && !strings.Contains(s, "=") && len(s) == 2 && !shortHasNoOptDefVal(s[1:], flags):
case shortWithSpace(s, c):
// If '-f arg' then
// delete 'arg' from args or break the loop if len(args) <= 1.
if len(args) <= 1 {
@ -573,6 +580,7 @@ func (c *Command) findNext(next string) *Command {
// Traverse the command tree to find the command, and parse args for
// each parent.
func (c *Command) Traverse(args []string) (*Command, []string, error) {
c.mergePersistentFlags()
flags := []string{}
inFlag := false
@ -581,11 +589,11 @@ func (c *Command) Traverse(args []string) (*Command, []string, error) {
// A long flag with a space separated value
case strings.HasPrefix(arg, "--") && !strings.Contains(arg, "="):
// TODO: this isn't quite right, we should really check ahead for 'true' or 'false'
inFlag = !hasNoOptDefVal(arg[2:], c.Flags())
inFlag = !hasDefault(arg[2:], c)
flags = append(flags, arg)
continue
// A short flag with a space separated value
case strings.HasPrefix(arg, "-") && !strings.Contains(arg, "=") && len(arg) == 2 && !shortHasNoOptDefVal(arg[1:], c.Flags()):
case shortWithSpace(arg, c):
inFlag = true
flags = append(flags, arg)
continue