Skip to content

Commit 70bc4c7

Browse files
committed
Fix:(issue_2208) Fix local flag
1 parent f27e66c commit 70bc4c7

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
@@ -377,6 +377,21 @@ func (cmd *Command) lookupFlag(name string) Flag {
377377
return nil
378378
}
379379

380+
// this looks up only allowed flags, i.e. local flags for current command
381+
// or persistent flags from ancestors
382+
func (cmd *Command) lookupAppliedFlag(name string) Flag {
383+
for _, f := range cmd.appliedFlags {
384+
if slices.Contains(f.Names(), name) {
385+
tracef("appliedFlag found for name %[1]q (cmd=%[2]q)", name, cmd.Name)
386+
return f
387+
}
388+
}
389+
390+
tracef("lookupAppliedflag NOT found for name %[1]q (cmd=%[2]q)", name, cmd.Name)
391+
cmd.onInvalidFlag(context.TODO(), name)
392+
return nil
393+
}
394+
380395
func (cmd *Command) checkRequiredFlag(f Flag) (bool, string) {
381396
if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() {
382397
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 TestLocalFlag(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)