From 1439e8b30b48d1dc52cf6ab192d3227ea04ef833 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 21 Dec 2020 01:36:59 -0500 Subject: [PATCH] hack: parse out the info flags for report subcommands separately pflag doesn't ignore unspecified arguments, so they must be parsed out separately first. --- plugins/apps/src/subcommands/subcommands.go | 10 ++++++---- plugins/apps/subcommands.go | 6 ------ .../buildpacks/src/subcommands/subcommands.go | 10 ++++++---- plugins/buildpacks/subcommands.go | 6 ------ plugins/common/common.go | 20 +++++++++++++++++++ .../network/src/subcommands/subcommands.go | 10 ++++++---- plugins/network/subcommands.go | 5 ----- plugins/proxy/src/subcommands/subcommands.go | 10 ++++++---- plugins/proxy/subcommands.go | 5 ----- plugins/ps/src/subcommands/subcommands.go | 10 ++++++---- plugins/ps/subcommands.go | 6 ------ .../resource/src/subcommands/subcommands.go | 10 ++++++---- plugins/resource/subcommands.go | 6 ------ 13 files changed, 56 insertions(+), 58 deletions(-) diff --git a/plugins/apps/src/subcommands/subcommands.go b/plugins/apps/src/subcommands/subcommands.go index 208d9eed2..0f146428e 100644 --- a/plugins/apps/src/subcommands/subcommands.go +++ b/plugins/apps/src/subcommands/subcommands.go @@ -65,10 +65,12 @@ func main() { err = apps.CommandRename(oldAppName, newAppName, *skipDeploy) case "report": args := flag.NewFlagSet("apps:report", flag.ExitOnError) - args.Parse(os.Args[2:]) - appName := args.Arg(0) - infoFlag := args.Arg(1) - err = apps.CommandReport(appName, infoFlag) + osArgs, infoFlag, err := common.ParseReportArgs("apps", os.Args[2:]) + if err == nil { + args.Parse(osArgs) + appName := args.Arg(0) + err = apps.CommandReport(appName, infoFlag) + } case "unlock": args := flag.NewFlagSet("apps:unlock", flag.ExitOnError) args.Parse(os.Args[2:]) diff --git a/plugins/apps/subcommands.go b/plugins/apps/subcommands.go index 3cf15f173..2c73a234b 100644 --- a/plugins/apps/subcommands.go +++ b/plugins/apps/subcommands.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "os" - "strings" "github.com/dokku/dokku/plugins/common" ) @@ -197,11 +196,6 @@ func CommandRename(oldAppName string, newAppName string, skipDeploy bool) error // CommandReport displays an app report for one or more apps func CommandReport(appName string, infoFlag string) error { - if strings.HasPrefix(appName, "--") { - infoFlag = appName - appName = "" - } - if len(appName) == 0 { apps, err := common.DokkuApps() if err != nil { diff --git a/plugins/buildpacks/src/subcommands/subcommands.go b/plugins/buildpacks/src/subcommands/subcommands.go index dc9743d0c..375b8794e 100644 --- a/plugins/buildpacks/src/subcommands/subcommands.go +++ b/plugins/buildpacks/src/subcommands/subcommands.go @@ -44,10 +44,12 @@ func main() { err = buildpacks.CommandRemove(appName, buildpack, *index) case "report": args := flag.NewFlagSet("buildpacks:report", flag.ExitOnError) - args.Parse(os.Args[2:]) - appName := args.Arg(0) - infoFlag := args.Arg(1) - err = buildpacks.CommandReport(appName, infoFlag) + osArgs, infoFlag, err := common.ParseReportArgs("buildpacks", os.Args[2:]) + if err == nil { + args.Parse(osArgs) + appName := args.Arg(0) + err = buildpacks.CommandReport(appName, infoFlag) + } case "set": args := flag.NewFlagSet("buildpacks:set", flag.ExitOnError) index := args.Int("index", 0, "--index: the 1-based index of the URL in the list of URLs") diff --git a/plugins/buildpacks/subcommands.go b/plugins/buildpacks/subcommands.go index 53a97c963..539f01a62 100644 --- a/plugins/buildpacks/subcommands.go +++ b/plugins/buildpacks/subcommands.go @@ -3,7 +3,6 @@ package buildpacks import ( "errors" "fmt" - "strings" "github.com/dokku/dokku/plugins/common" ) @@ -106,11 +105,6 @@ func CommandRemove(appName string, buildpack string, index int) (err error) { // CommandReport displays a buildpacks report for one or more apps func CommandReport(appName string, infoFlag string) error { - if strings.HasPrefix(appName, "--") { - infoFlag = appName - appName = "" - } - if len(appName) == 0 { apps, err := common.DokkuApps() if err != nil { diff --git a/plugins/common/common.go b/plugins/common/common.go index a4636e950..5ed135f23 100644 --- a/plugins/common/common.go +++ b/plugins/common/common.go @@ -286,6 +286,26 @@ func GetenvWithDefault(key string, defaultValue string) (val string) { return } +func ParseReportArgs(pluginName string, arguments []string) ([]string, string, error) { + osArgs := []string{} + infoFlags := []string{} + for _, argument := range arguments { + if strings.HasPrefix(argument, "--") { + infoFlags = append(infoFlags, argument) + } else { + osArgs = append(osArgs, argument) + } + } + + if len(infoFlags) == 0 { + return osArgs, "", nil + } + if len(infoFlags) == 1 { + return osArgs, infoFlags[0], nil + } + return osArgs, "", fmt.Errorf("%s:report command allows only a single flag", pluginName) +} + // ReportSingleApp is an internal function that displays a report for an app func ReportSingleApp(reportType string, appName string, infoFlag string, infoFlags map[string]string, trimPrefix bool, uppercaseFirstCharacter bool) error { flags := []string{} diff --git a/plugins/network/src/subcommands/subcommands.go b/plugins/network/src/subcommands/subcommands.go index 88f3040ab..b5f1a5cc7 100644 --- a/plugins/network/src/subcommands/subcommands.go +++ b/plugins/network/src/subcommands/subcommands.go @@ -53,10 +53,12 @@ func main() { err = network.CommandRebuildall() case "report": args := flag.NewFlagSet("network:report", flag.ExitOnError) - args.Parse(os.Args[2:]) - appName := args.Arg(0) - infoFlag := args.Arg(1) - err = network.CommandReport(appName, infoFlag) + osArgs, infoFlag, err := common.ParseReportArgs("network", os.Args[2:]) + if err == nil { + args.Parse(osArgs) + appName := args.Arg(0) + err = network.CommandReport(appName, infoFlag) + } case "set": args := flag.NewFlagSet("network:set", flag.ExitOnError) args.Parse(os.Args[2:]) diff --git a/plugins/network/subcommands.go b/plugins/network/subcommands.go index 7253d7f7b..a4db4cc93 100644 --- a/plugins/network/subcommands.go +++ b/plugins/network/subcommands.go @@ -124,11 +124,6 @@ func CommandRebuildall() error { // CommandReport displays a network report for one or more apps func CommandReport(appName string, infoFlag string) error { - if strings.HasPrefix(appName, "--") { - infoFlag = appName - appName = "" - } - if len(appName) == 0 { apps, err := common.DokkuApps() if err != nil { diff --git a/plugins/proxy/src/subcommands/subcommands.go b/plugins/proxy/src/subcommands/subcommands.go index 77a0dfb70..7765b0375 100644 --- a/plugins/proxy/src/subcommands/subcommands.go +++ b/plugins/proxy/src/subcommands/subcommands.go @@ -64,10 +64,12 @@ func main() { err = proxy.CommandPortsSet(appName, portMaps) case "report": args := flag.NewFlagSet("proxy:report", flag.ExitOnError) - args.Parse(os.Args[2:]) - appName := args.Arg(0) - infoFlag := args.Arg(1) - err = proxy.CommandReport(appName, infoFlag) + osArgs, infoFlag, err := common.ParseReportArgs("proxy", os.Args[2:]) + if err == nil { + args.Parse(osArgs) + appName := args.Arg(0) + err = proxy.CommandReport(appName, infoFlag) + } case "set": args := flag.NewFlagSet("proxy:set", flag.ExitOnError) args.Parse(os.Args[2:]) diff --git a/plugins/proxy/subcommands.go b/plugins/proxy/subcommands.go index 9db5cfd24..dcb37425c 100644 --- a/plugins/proxy/subcommands.go +++ b/plugins/proxy/subcommands.go @@ -155,11 +155,6 @@ func CommandPortsSet(appName string, portMaps []string) error { // CommandReport displays a proxy report for one or more apps func CommandReport(appName string, infoFlag string) error { - if strings.HasPrefix(appName, "--") { - infoFlag = appName - appName = "" - } - if len(appName) == 0 { apps, err := common.DokkuApps() if err != nil { diff --git a/plugins/ps/src/subcommands/subcommands.go b/plugins/ps/src/subcommands/subcommands.go index 887843d8d..d19c51173 100644 --- a/plugins/ps/src/subcommands/subcommands.go +++ b/plugins/ps/src/subcommands/subcommands.go @@ -32,10 +32,12 @@ func main() { err = ps.CommandRebuild(appName, *allApps, *parallelCount) case "report": args := flag.NewFlagSet("ps:report", flag.ExitOnError) - args.Parse(os.Args[2:]) - appName := args.Arg(0) - infoFlag := args.Arg(1) - err = ps.CommandReport(appName, infoFlag) + osArgs, infoFlag, err := common.ParseReportArgs("ps", os.Args[2:]) + if err == nil { + args.Parse(osArgs) + appName := args.Arg(0) + err = ps.CommandReport(appName, infoFlag) + } case "restart": args := flag.NewFlagSet("ps:restart", flag.ExitOnError) allApps := args.Bool("all", false, "--all: restart all apps") diff --git a/plugins/ps/subcommands.go b/plugins/ps/subcommands.go index 49a61b616..2cc6bd131 100644 --- a/plugins/ps/subcommands.go +++ b/plugins/ps/subcommands.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "path/filepath" - "strings" dockeroptions "github.com/dokku/dokku/plugins/docker-options" @@ -45,11 +44,6 @@ func CommandRebuild(appName string, allApps bool, parallelCount int) error { // CommandReport displays a ps report for one or more apps func CommandReport(appName string, infoFlag string) error { - if strings.HasPrefix(appName, "--") { - infoFlag = appName - appName = "" - } - if len(appName) == 0 { apps, err := common.DokkuApps() if err != nil { diff --git a/plugins/resource/src/subcommands/subcommands.go b/plugins/resource/src/subcommands/subcommands.go index 7a060cc23..c0808d06b 100644 --- a/plugins/resource/src/subcommands/subcommands.go +++ b/plugins/resource/src/subcommands/subcommands.go @@ -50,10 +50,12 @@ func main() { err = resource.CommandLimitClear(appName, *processType) case "report": args := flag.NewFlagSet("resource:report", flag.ExitOnError) - args.Parse(os.Args[2:]) - appName := args.Arg(0) - infoFlag := args.Arg(1) - err = resource.CommandReport(appName, infoFlag) + osArgs, infoFlag, err := common.ParseReportArgs("resource", os.Args[2:]) + if err == nil { + args.Parse(osArgs) + appName := args.Arg(0) + err = resource.CommandReport(appName, infoFlag) + } case "reserve": args := flag.NewFlagSet("resource:reserve", flag.ExitOnError) processType := args.String("process-type", "", "process-type: A process type to manage") diff --git a/plugins/resource/subcommands.go b/plugins/resource/subcommands.go index 32cc9e055..8dc67fc5c 100644 --- a/plugins/resource/subcommands.go +++ b/plugins/resource/subcommands.go @@ -2,7 +2,6 @@ package resource import ( "errors" - "strings" "github.com/dokku/dokku/plugins/common" ) @@ -28,11 +27,6 @@ func CommandLimitClear(appName string, processType string) error { // CommandReport displays a resource report for one or more apps func CommandReport(appName string, infoFlag string) error { - if strings.HasPrefix(appName, "--") { - infoFlag = appName - appName = "" - } - if len(appName) == 0 { apps, err := common.DokkuApps() if err != nil {