Skip to content

Commit dc6c569

Browse files
authored
Shortcircuit commands with version or help flags (#7683)
* Shortcircuit search with help and version flag Signed-off-by: Derek Nola <[email protected]> * Keep functions seperate Signed-off-by: Derek Nola <[email protected]> --------- Signed-off-by: Derek Nola <[email protected]>
1 parent 3a8e98a commit dc6c569

File tree

3 files changed

+29
-9
lines changed

3 files changed

+29
-9
lines changed

Diff for: pkg/configfilearg/defaultparser.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
var DefaultParser = &Parser{
1111
After: []string{"server", "agent", "etcd-snapshot:1"},
12-
FlagNames: []string{"--config", "-c"},
12+
ConfigFlags: []string{"--config", "-c"},
1313
EnvName: version.ProgramUpper + "_CONFIG_FILE",
1414
DefaultConfig: "/etc/rancher/" + version.Program + "/config.yaml",
1515
ValidFlags: map[string][]cli.Flag{"server": cmds.ServerFlags, "etcd-snapshot": cmds.EtcdSnapshotFlags},
@@ -25,8 +25,7 @@ func MustParse(args []string) []string {
2525

2626
func MustFindString(args []string, target string) string {
2727
parser := &Parser{
28-
After: []string{},
29-
FlagNames: []string{},
28+
OverrideFlags: []string{"--help", "-h", "--version", "-v"},
3029
EnvName: version.ProgramUpper + "_CONFIG_FILE",
3130
DefaultConfig: "/etc/rancher/" + version.Program + "/config.yaml",
3231
}

Diff for: pkg/configfilearg/parser.go

+24-3
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ import (
2020

2121
type Parser struct {
2222
After []string
23-
FlagNames []string
23+
ConfigFlags []string
24+
OverrideFlags []string
2425
EnvName string
2526
DefaultConfig string
26-
ValidFlags map[string][]cli.Flag
27+
// ValidFlags are maps of flags that are valid for that particular conmmand. This enables us to ignore flags in
28+
// the config file that do no apply to the current command.
29+
ValidFlags map[string][]cli.Flag
2730
}
2831

2932
// Parse will parse an os.Args style slice looking for Parser.FlagNames after Parse.After.
@@ -97,6 +100,12 @@ func (p *Parser) stripInvalidFlags(command string, args []string) ([]string, err
97100
}
98101

99102
func (p *Parser) FindString(args []string, target string) (string, error) {
103+
104+
// Check for --help or --version flags, which override any other flags
105+
if val, found := p.findOverrideFlag(args); found {
106+
return val, nil
107+
}
108+
100109
configFile, isSet := p.findConfigFileFlag(args)
101110
var lastVal string
102111
if configFile != "" {
@@ -140,13 +149,25 @@ func (p *Parser) FindString(args []string, target string) (string, error) {
140149
return lastVal, nil
141150
}
142151

152+
func (p *Parser) findOverrideFlag(args []string) (string, bool) {
153+
for _, arg := range args {
154+
for _, flagName := range p.OverrideFlags {
155+
if flagName == arg {
156+
return arg, true
157+
}
158+
}
159+
}
160+
161+
return "", false
162+
}
163+
143164
func (p *Parser) findConfigFileFlag(args []string) (string, bool) {
144165
if envVal := os.Getenv(p.EnvName); p.EnvName != "" && envVal != "" {
145166
return envVal, true
146167
}
147168

148169
for i, arg := range args {
149-
for _, flagName := range p.FlagNames {
170+
for _, flagName := range p.ConfigFlags {
150171
if flagName == arg {
151172
if len(args) > i+1 {
152173
return args[i+1], true

Diff for: pkg/configfilearg/parser_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ func Test_UnitParser_findConfigFileFlag(t *testing.T) {
199199
for _, tt := range tests {
200200
t.Run(tt.name, func(t *testing.T) {
201201
p := Parser{
202-
FlagNames: []string{"--config", "-c"},
202+
ConfigFlags: []string{"--config", "-c"},
203203
EnvName: "_TEST_FLAG_ENV",
204204
DefaultConfig: tt.fields.DefaultConfig,
205205
}
@@ -328,7 +328,7 @@ func Test_UnitParser_Parse(t *testing.T) {
328328
t.Run(tt.name, func(t *testing.T) {
329329
p := &Parser{
330330
After: tt.fields.After,
331-
FlagNames: tt.fields.FlagNames,
331+
ConfigFlags: tt.fields.FlagNames,
332332
EnvName: tt.fields.EnvName,
333333
DefaultConfig: tt.fields.DefaultConfig,
334334
}
@@ -447,7 +447,7 @@ func Test_UnitParser_FindString(t *testing.T) {
447447
t.Run(tt.name, func(t *testing.T) {
448448
p := &Parser{
449449
After: tt.fields.After,
450-
FlagNames: tt.fields.FlagNames,
450+
ConfigFlags: tt.fields.FlagNames,
451451
EnvName: tt.fields.EnvName,
452452
DefaultConfig: tt.fields.DefaultConfig,
453453
}

0 commit comments

Comments
 (0)