Skip to content

Commit 08b187a

Browse files
authored
Merge pull request #2211 from dearchap/issue_2208
Fix:(issue_2208) Fix local flag
2 parents 9dad0d4 + 52cad40 commit 08b187a

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

command.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,21 @@ func (cmd *Command) lookupFlag(name string) Flag {
384384
return nil
385385
}
386386

387+
// this looks up only allowed flags, i.e. local flags for current command
388+
// or persistent flags from ancestors
389+
func (cmd *Command) lookupAppliedFlag(name string) Flag {
390+
for _, f := range cmd.appliedFlags {
391+
if slices.Contains(f.Names(), name) {
392+
tracef("appliedFlag found for name %[1]q (cmd=%[2]q)", name, cmd.Name)
393+
return f
394+
}
395+
}
396+
397+
tracef("lookupAppliedflag NOT found for name %[1]q (cmd=%[2]q)", name, cmd.Name)
398+
cmd.onInvalidFlag(context.TODO(), name)
399+
return nil
400+
}
401+
387402
func (cmd *Command) checkRequiredFlag(f Flag) (bool, string) {
388403
if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() {
389404
flagName := f.Names()[0]

command_parse.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func (cmd *Command) parseFlags(args Args) (Args, error) {
144144

145145
tracef("flagName:2 (fName=%[1]q) (fVal=%[2]q)", flagName, flagVal)
146146

147-
f := cmd.lookupFlag(flagName)
147+
f := cmd.lookupAppliedFlag(flagName)
148148
// found a flag matching given flagName
149149
if f != nil {
150150
tracef("Trying flag type (fName=%[1]q) (type=%[2]T)", flagName, f)

command_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3024,6 +3024,34 @@ func TestFlagAction(t *testing.T) {
30243024
}
30253025
}
30263026

3027+
func TestLocalFlagError(t *testing.T) {
3028+
var topInt int64
3029+
3030+
cmd := &Command{
3031+
Flags: []Flag{
3032+
&Int64Flag{
3033+
Name: "cmdFlag",
3034+
Destination: &topInt,
3035+
Local: true,
3036+
},
3037+
},
3038+
Commands: []*Command{
3039+
{
3040+
Name: "subcmd",
3041+
},
3042+
},
3043+
}
3044+
3045+
err := cmd.Run(buildTestContext(t), []string{
3046+
"app",
3047+
"subcmd",
3048+
"--cmdFlag", "11",
3049+
})
3050+
3051+
assert.Error(t, err)
3052+
assert.Contains(t, err.Error(), "flag provided but not defined: -cmdFlag")
3053+
}
3054+
30273055
func TestPersistentFlag(t *testing.T) {
30283056
var topInt, topPersistentInt, subCommandInt, appOverrideInt int64
30293057
var appFlag string

0 commit comments

Comments
 (0)