diff --git a/command.go b/command.go index 88e6ed77..5b81f61d 100644 --- a/command.go +++ b/command.go @@ -979,6 +979,10 @@ func (c *Command) ValidateArgs(args []string) error { } func (c *Command) validateRequiredFlags() error { + if c.DisableFlagParsing { + return nil + } + flags := c.Flags() missingFlagNames := []string{} flags.VisitAll(func(pflag *flag.Flag) { diff --git a/command_test.go b/command_test.go index ec8e2aef..16cc41b4 100644 --- a/command_test.go +++ b/command_test.go @@ -785,6 +785,37 @@ func TestPersistentRequiredFlags(t *testing.T) { } } +func TestPersistentRequiredFlagsWithDisableFlagParsing(t *testing.T) { + // Make sure a required persistent flag does not break + // commands that disable flag parsing + + parent := &Command{Use: "parent", Run: emptyRun} + parent.PersistentFlags().Bool("foo", false, "") + flag := parent.PersistentFlags().Lookup("foo") + parent.MarkPersistentFlagRequired("foo") + + child := &Command{Use: "child", Run: emptyRun} + child.DisableFlagParsing = true + + parent.AddCommand(child) + + if _, err := executeCommand(parent, "--foo", "child"); err != nil { + t.Errorf("Unexpected error: %v", err) + } + + // Reset the flag or else it will remember the state from the previous command + flag.Changed = false + if _, err := executeCommand(parent, "child", "--foo"); err != nil { + t.Errorf("Unexpected error: %v", err) + } + + // Reset the flag or else it will remember the state from the previous command + flag.Changed = false + if _, err := executeCommand(parent, "child"); err != nil { + t.Errorf("Unexpected error: %v", err) + } +} + func TestInitHelpFlagMergesFlags(t *testing.T) { usage := "custom flag" rootCmd := &Command{Use: "root"}