Env Flag Filtering (#16683)

* added filtering for global flags

Co-authored-by: Tom Proctor <tomhjp@users.noreply.github.com>
This commit is contained in:
Max Coulombe
2022-08-17 21:29:16 -04:00
committed by GitHub
parent 195e025cb2
commit 064854cb05
4 changed files with 70 additions and 22 deletions

View File

@@ -589,7 +589,7 @@ func (f *FlagSets) Parse(args []string) error {
err := f.mainSet.Parse(args)
warnings := generateFlagWarnings(f.Args())
if warnings != "" {
if warnings != "" && Format(f.ui) == "table" {
f.ui.Warn(warnings)
}

View File

@@ -296,13 +296,26 @@ func parseFlagFile(raw string) (string, error) {
func generateFlagWarnings(args []string) string {
var trailingFlags []string
for _, arg := range args {
if strings.HasPrefix(arg, "-") {
trailingFlags = append(trailingFlags, arg)
if !strings.HasPrefix(arg, "-") {
continue
}
isGlobalFlag := false
trimmedArg, _, _ := strings.Cut(strings.TrimLeft(arg, "-"), "=")
for _, flag := range globalFlags {
if trimmedArg == flag {
isGlobalFlag = true
}
}
if isGlobalFlag {
continue
}
trailingFlags = append(trailingFlags, arg)
}
if len(trailingFlags) > 0 {
return fmt.Sprintf("Flags must be provided before positional arguments. "+
return fmt.Sprintf("Command flags must be provided before positional arguments. "+
"The following arguments will not be parsed as flags: [%s]", strings.Join(trailingFlags, ","))
} else {
return ""

View File

@@ -242,6 +242,26 @@ func TestArgWarnings(t *testing.T) {
[]string{"-a", "b"},
"-a",
},
{
[]string{globalFlagDetailed},
"",
},
{
[]string{"-" + globalFlagOutputCurlString + "=true"},
"",
},
{
[]string{"--" + globalFlagFormat + "=false"},
"",
},
{
[]string{"-x" + globalFlagDetailed},
"-x" + globalFlagDetailed,
},
{
[]string{"--x=" + globalFlagDetailed},
"--x=" + globalFlagDetailed,
},
}
for _, tc := range cases {

View File

@@ -24,6 +24,17 @@ type VaultUI struct {
detailed bool
}
const (
globalFlagOutputCurlString = "output-curl-string"
globalFlagOutputPolicy = "output-policy"
globalFlagFormat = "format"
globalFlagDetailed = "detailed"
)
var globalFlags = []string{
globalFlagOutputCurlString, globalFlagOutputPolicy, globalFlagFormat, globalFlagDetailed,
}
// setupEnv parses args and may replace them and sets some env vars to known
// values based on format options
func setupEnv(args []string) (retArgs []string, format string, detailed bool, outputCurlString bool, outputPolicy bool) {
@@ -47,38 +58,28 @@ func setupEnv(args []string) (retArgs []string, format string, detailed bool, ou
break
}
if arg == "-output-curl-string" || arg == "--output-curl-string" {
if isGlobalFlag(arg, globalFlagOutputCurlString) {
outputCurlString = true
continue
}
if arg == "-output-policy" || arg == "--output-policy" {
if isGlobalFlag(arg, globalFlagOutputPolicy) {
outputPolicy = true
continue
}
// Parse a given flag here, which overrides the env var
if strings.HasPrefix(arg, "--format=") {
format = strings.TrimPrefix(arg, "--format=")
}
if strings.HasPrefix(arg, "-format=") {
format = strings.TrimPrefix(arg, "-format=")
if isGlobalFlagWithValue(arg, globalFlagFormat) {
format = getGlobalFlagValue(arg)
}
// For backwards compat, it could be specified without an equal sign
if arg == "-format" || arg == "--format" {
if isGlobalFlag(arg, globalFlagFormat) {
nextArgFormat = true
}
// Parse a given flag here, which overrides the env var
if strings.HasPrefix(arg, "--detailed=") {
detailed, err = strconv.ParseBool(strings.TrimPrefix(arg, "--detailed="))
if err != nil {
detailed = false
}
haveDetailed = true
}
if strings.HasPrefix(arg, "-detailed=") {
detailed, err = strconv.ParseBool(strings.TrimPrefix(arg, "-detailed="))
if isGlobalFlagWithValue(arg, globalFlagDetailed) {
detailed, err = strconv.ParseBool(getGlobalFlagValue(globalFlagDetailed))
if err != nil {
detailed = false
}
@@ -86,7 +87,7 @@ func setupEnv(args []string) (retArgs []string, format string, detailed bool, ou
}
// For backwards compat, it could be specified without an equal sign to enable
// detailed output.
if arg == "-detailed" || arg == "--detailed" {
if isGlobalFlag(arg, globalFlagDetailed) {
detailed = true
haveDetailed = true
}
@@ -115,6 +116,20 @@ func setupEnv(args []string) (retArgs []string, format string, detailed bool, ou
return args, format, detailed, outputCurlString, outputPolicy
}
func isGlobalFlag(arg string, flag string) bool {
return arg == "-"+flag || arg == "--"+flag
}
func isGlobalFlagWithValue(arg string, flag string) bool {
return strings.HasPrefix(arg, "--"+flag+"=") || strings.HasPrefix(arg, "-"+flag+"=")
}
func getGlobalFlagValue(arg string) string {
_, value, _ := strings.Cut(arg, "=")
return value
}
type RunOptions struct {
TokenHelper token.TokenHelper
Stdout io.Writer