mirror of
https://github.com/spf13/cobra
synced 2025-05-06 05:17:21 +00:00
Merge 1972d4ec3b
into 0c34d16c31
This commit is contained in:
commit
e3696aed41
1 changed files with 27 additions and 19 deletions
40
command.go
40
command.go
|
@ -436,24 +436,34 @@ func (c *Command) VersionTemplate() string {
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasNoOptDefVal(name string, fs *flag.FlagSet) bool {
|
func hasDefault(name string, c *Command) bool {
|
||||||
flag := fs.Lookup(name)
|
flag := c.Flags().Lookup(name)
|
||||||
if flag == nil {
|
if flag == nil {
|
||||||
return false
|
return true
|
||||||
|
}
|
||||||
|
if flag.Value.Type() == "bool" {
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
return flag.NoOptDefVal != ""
|
return flag.NoOptDefVal != ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func shortHasNoOptDefVal(name string, fs *flag.FlagSet) bool {
|
func shortWithSpace(arg string, c *Command) bool {
|
||||||
if len(name) == 0 {
|
if strings.HasPrefix(arg, "-") {
|
||||||
return false
|
if !strings.Contains(arg, "=") {
|
||||||
}
|
if len(arg) == 2 {
|
||||||
|
flag := c.Flags().ShorthandLookup(arg[1:])
|
||||||
flag := fs.ShorthandLookup(name[:1])
|
|
||||||
if flag == nil {
|
if flag == nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if flag.Value.Type() == "bool" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
//shortHasNoOptDefVal
|
||||||
return flag.NoOptDefVal != ""
|
return flag.NoOptDefVal != ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func stripFlags(args []string, c *Command) []string {
|
func stripFlags(args []string, c *Command) []string {
|
||||||
|
@ -461,20 +471,17 @@ func stripFlags(args []string, c *Command) []string {
|
||||||
return args
|
return args
|
||||||
}
|
}
|
||||||
c.mergePersistentFlags()
|
c.mergePersistentFlags()
|
||||||
|
|
||||||
commands := []string{}
|
commands := []string{}
|
||||||
flags := c.Flags()
|
|
||||||
|
|
||||||
Loop:
|
Loop:
|
||||||
for len(args) > 0 {
|
for len(args) > 0 {
|
||||||
s := args[0]
|
s := args[0]
|
||||||
args = args[1:]
|
args = args[1:]
|
||||||
switch {
|
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
|
// If '--flag arg' then
|
||||||
// delete arg from args.
|
// delete arg from args.
|
||||||
fallthrough // (do the same as below)
|
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
|
// If '-f arg' then
|
||||||
// delete 'arg' from args or break the loop if len(args) <= 1.
|
// delete 'arg' from args or break the loop if len(args) <= 1.
|
||||||
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
|
// Traverse the command tree to find the command, and parse args for
|
||||||
// each parent.
|
// each parent.
|
||||||
func (c *Command) Traverse(args []string) (*Command, []string, error) {
|
func (c *Command) Traverse(args []string) (*Command, []string, error) {
|
||||||
|
c.mergePersistentFlags()
|
||||||
flags := []string{}
|
flags := []string{}
|
||||||
inFlag := false
|
inFlag := false
|
||||||
|
|
||||||
|
@ -581,11 +589,11 @@ func (c *Command) Traverse(args []string) (*Command, []string, error) {
|
||||||
// A long flag with a space separated value
|
// A long flag with a space separated value
|
||||||
case strings.HasPrefix(arg, "--") && !strings.Contains(arg, "="):
|
case strings.HasPrefix(arg, "--") && !strings.Contains(arg, "="):
|
||||||
// TODO: this isn't quite right, we should really check ahead for 'true' or 'false'
|
// 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)
|
flags = append(flags, arg)
|
||||||
continue
|
continue
|
||||||
// A short flag with a space separated value
|
// 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
|
inFlag = true
|
||||||
flags = append(flags, arg)
|
flags = append(flags, arg)
|
||||||
continue
|
continue
|
||||||
|
|
Loading…
Add table
Reference in a new issue