diff --git a/app.go b/app.go index 3fb5c169ad..e7f79c5130 100644 --- a/app.go +++ b/app.go @@ -113,6 +113,11 @@ type App struct { UseShortOptionHandling bool // Enable suggestions for commands and flags Suggest bool + // Allows global flags set by libraries which use flag.XXXVar(...) directly + // to be parsed through this library + AllowExtFlags bool + // Treat all flags as normal arguments if true + SkipFlagParsing bool didSetup bool @@ -199,13 +204,15 @@ func (a *App) Setup() { a.ErrWriter = os.Stderr } - // add global flags added by other packages - flag.VisitAll(func(f *flag.Flag) { - // skip test flags - if !strings.HasPrefix(f.Name, ignoreFlagPrefix) { - a.Flags = append(a.Flags, &extFlag{f}) - } - }) + if a.AllowExtFlags { + // add global flags added by other packages + flag.VisitAll(func(f *flag.Flag) { + // skip test flags + if !strings.HasPrefix(f.Name, ignoreFlagPrefix) { + a.Flags = append(a.Flags, &extFlag{f}) + } + }) + } var newCommands []*Command @@ -280,6 +287,7 @@ func (a *App) newRootCommand() *Command { HelpName: a.HelpName, CustomHelpTemplate: a.CustomAppHelpTemplate, categories: a.categories, + SkipFlagParsing: a.SkipFlagParsing, isRoot: true, } } diff --git a/app_test.go b/app_test.go index d24fb63503..7091c40ef9 100644 --- a/app_test.go +++ b/app_test.go @@ -654,6 +654,7 @@ func TestApp_FlagsFromExtPackage(t *testing.T) { }() a := &App{ + AllowExtFlags: true, Flags: []Flag{ &StringFlag{ Name: "carly", @@ -677,6 +678,28 @@ func TestApp_FlagsFromExtPackage(t *testing.T) { if someint != 10 { t.Errorf("Expected 10 got %d for someint", someint) } + + a = &App{ + Flags: []Flag{ + &StringFlag{ + Name: "carly", + Aliases: []string{"c"}, + Required: false, + }, + &BoolFlag{ + Name: "jimbob", + Aliases: []string{"j"}, + Required: false, + Value: true, + }, + }, + } + + // this should return an error since epflag shouldnt be registered + err = a.Run([]string{"foo", "-c", "cly", "--epflag", "10"}) + if err == nil { + t.Error("Expected error") + } } func TestApp_Setup_defaultsReader(t *testing.T) { @@ -790,6 +813,24 @@ func TestApp_CommandWithNoFlagBeforeTerminator(t *testing.T) { expect(t, args.Get(2), "notAFlagAtAll") } +func TestApp_SkipFlagParsing(t *testing.T) { + var args Args + + app := &App{ + SkipFlagParsing: true, + Action: func(c *Context) error { + args = c.Args() + return nil + }, + } + + _ = app.Run([]string{"", "--", "my-arg", "notAFlagAtAll"}) + + expect(t, args.Get(0), "--") + expect(t, args.Get(1), "my-arg") + expect(t, args.Get(2), "notAFlagAtAll") +} + func TestApp_VisibleCommands(t *testing.T) { app := &App{ Commands: []*Command{ diff --git a/godoc-current.txt b/godoc-current.txt index a0def3587a..b8dbf6ad0a 100644 --- a/godoc-current.txt +++ b/godoc-current.txt @@ -324,6 +324,11 @@ type App struct { UseShortOptionHandling bool // Enable suggestions for commands and flags Suggest bool + // Allows global flags set by libraries which use flag.XXXVar(...) directly + // to be parsed through this library + AllowExtFlags bool + // Treat all flags as normal arguments if true + SkipFlagParsing bool // Has unexported fields. } diff --git a/testdata/godoc-v2.x.txt b/testdata/godoc-v2.x.txt index a0def3587a..b8dbf6ad0a 100644 --- a/testdata/godoc-v2.x.txt +++ b/testdata/godoc-v2.x.txt @@ -324,6 +324,11 @@ type App struct { UseShortOptionHandling bool // Enable suggestions for commands and flags Suggest bool + // Allows global flags set by libraries which use flag.XXXVar(...) directly + // to be parsed through this library + AllowExtFlags bool + // Treat all flags as normal arguments if true + SkipFlagParsing bool // Has unexported fields. }