mirror of
https://github.com/spf13/cobra
synced 2024-11-24 22:57:12 +00:00
perform Parse on lnpflags
This commit is contained in:
parent
b51dcf624c
commit
6f7d88c48c
1 changed files with 25 additions and 13 deletions
38
command.go
38
command.go
|
@ -1770,7 +1770,7 @@ func (c *Command) persistentFlag(name string) (flag *flag.Flag) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Command) parseLongArgs(s string, args []string) (passedArgs, restArgs []string) {
|
func (c *Command) parseLongArgs(s string, args []string, flags *flag.FlagSet) (passedArgs, restArgs []string) {
|
||||||
restArgs = args
|
restArgs = args
|
||||||
name := s[2:]
|
name := s[2:]
|
||||||
if len(name) == 0 {
|
if len(name) == 0 {
|
||||||
|
@ -1780,11 +1780,10 @@ func (c *Command) parseLongArgs(s string, args []string) (passedArgs, restArgs [
|
||||||
|
|
||||||
split := strings.SplitN(s[2:], "=", 2)
|
split := strings.SplitN(s[2:], "=", 2)
|
||||||
name = split[0]
|
name = split[0]
|
||||||
searchedFlag := c.lflags.Lookup(name)
|
searchedFlag := flags.Lookup(name)
|
||||||
|
|
||||||
if searchedFlag == nil {
|
if searchedFlag == nil {
|
||||||
// ignore the flag that is not registered in c.lflags but is registered in c.flags
|
// ignore the flag that is not registered in passed flags but is registered in c.parentsPflags
|
||||||
c.flags.VisitAll(func(f *flag.Flag) {
|
c.parentsPflags.VisitAll(func(f *flag.Flag) {
|
||||||
if name == f.Name {
|
if name == f.Name {
|
||||||
if len(split) == 1 && f.NoOptDefVal == "" && len(args) > 0 {
|
if len(split) == 1 && f.NoOptDefVal == "" && len(args) > 0 {
|
||||||
// '--flag arg'
|
// '--flag arg'
|
||||||
|
@ -1804,16 +1803,16 @@ func (c *Command) parseLongArgs(s string, args []string) (passedArgs, restArgs [
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Command) parseShortArgs(s string, args []string) (passedArgs []string, restArgs []string) {
|
func (c *Command) parseShortArgs(s string, args []string, flags *flag.FlagSet) (passedArgs []string, restArgs []string) {
|
||||||
restArgs = args
|
restArgs = args
|
||||||
|
|
||||||
shorthands := s[1:]
|
shorthands := s[1:]
|
||||||
shorthand := string(s[1])
|
shorthand := string(s[1])
|
||||||
|
|
||||||
searchedFlag := c.lflags.ShorthandLookup(shorthand)
|
searchedFlag := flags.ShorthandLookup(shorthand)
|
||||||
if searchedFlag == nil {
|
if searchedFlag == nil {
|
||||||
// ignore the flag that is not registered in c.lflags but is registered in c.flags
|
// ignore the flag that is not registered in passed flags but is registered in c.parentsPflags
|
||||||
c.flags.VisitAll(func(f *flag.Flag) {
|
c.parentsPflags.VisitAll(func(f *flag.Flag) {
|
||||||
if shorthand == f.Shorthand {
|
if shorthand == f.Shorthand {
|
||||||
if len(shorthands) == 1 && f.NoOptDefVal == "" && len(args) > 0 {
|
if len(shorthands) == 1 && f.NoOptDefVal == "" && len(args) > 0 {
|
||||||
// '-f arg'
|
// '-f arg'
|
||||||
|
@ -1834,7 +1833,7 @@ func (c *Command) parseShortArgs(s string, args []string) (passedArgs []string,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Command) removeParentPersistentArgs(args []string) (newArgs []string) {
|
func (c *Command) removeParentPersistentArgs(args []string, flags *flag.FlagSet) (newArgs []string) {
|
||||||
for len(args) > 0 {
|
for len(args) > 0 {
|
||||||
s := args[0]
|
s := args[0]
|
||||||
args = args[1:]
|
args = args[1:]
|
||||||
|
@ -1845,9 +1844,9 @@ func (c *Command) removeParentPersistentArgs(args []string) (newArgs []string) {
|
||||||
|
|
||||||
var passedArgs, restArgs []string
|
var passedArgs, restArgs []string
|
||||||
if s[1] == '-' {
|
if s[1] == '-' {
|
||||||
passedArgs, restArgs = c.parseLongArgs(s, args)
|
passedArgs, restArgs = c.parseLongArgs(s, args, flags)
|
||||||
} else {
|
} else {
|
||||||
passedArgs, restArgs = c.parseShortArgs(s, args)
|
passedArgs, restArgs = c.parseShortArgs(s, args, flags)
|
||||||
}
|
}
|
||||||
if len(passedArgs) > 0 {
|
if len(passedArgs) > 0 {
|
||||||
newArgs = append(newArgs, passedArgs...)
|
newArgs = append(newArgs, passedArgs...)
|
||||||
|
@ -1884,12 +1883,25 @@ func (c *Command) ParseFlags(args []string) error {
|
||||||
// parse Local Flags
|
// parse Local Flags
|
||||||
c.LocalFlags() // need to execute LocalFlags() to set the value in c.lflags before executing removeParentPersistentArgs
|
c.LocalFlags() // need to execute LocalFlags() to set the value in c.lflags before executing removeParentPersistentArgs
|
||||||
c.lflags.ParseErrorsWhitelist = flag.ParseErrorsWhitelist(c.FParseErrWhitelist)
|
c.lflags.ParseErrorsWhitelist = flag.ParseErrorsWhitelist(c.FParseErrWhitelist)
|
||||||
localArgs := c.removeParentPersistentArgs(args) // get only arguments related to c.lflags
|
localArgs := c.removeParentPersistentArgs(args, c.lflags) // get only arguments related to c.lflags
|
||||||
err = c.lflags.Parse(localArgs)
|
err = c.lflags.Parse(localArgs)
|
||||||
// Print warnings if they occurred (e.g. deprecated flag messages).
|
// Print warnings if they occurred (e.g. deprecated flag messages).
|
||||||
if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil {
|
if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil {
|
||||||
c.Print(c.flagErrorBuf.String())
|
c.Print(c.flagErrorBuf.String())
|
||||||
}
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse local non persistent flags
|
||||||
|
c.LocalNonPersistentFlags() // need to execute LocalNonPersistentFlags() to set the value in c.lnpflags before executing removeParentPersistentArgs
|
||||||
|
c.lnpflags.ParseErrorsWhitelist = flag.ParseErrorsWhitelist(c.FParseErrWhitelist)
|
||||||
|
localNonPersistentArgs := c.removeParentPersistentArgs(args, c.lnpflags)
|
||||||
|
err = c.lnpflags.Parse(localNonPersistentArgs)
|
||||||
|
// Print warnings if they occurred (e.g. deprecated flag messages).
|
||||||
|
if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil {
|
||||||
|
c.Print(c.flagErrorBuf.String())
|
||||||
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue