From aae1944a07a787b48d54e3ee7b88a83eb2f31a01 Mon Sep 17 00:00:00 2001 From: Danny Shemesh Date: Tue, 29 Jan 2019 15:09:40 +0200 Subject: [PATCH] Added windows executable extensions to Kubectl plugins Currently, the kubectl plugins system - when running under Windows - will determine that a plugin is executable by looking at its extension, comparing it to '.exe'. I think we should allow plugins w/ a few more known extensions (.bat, .com, .cmd; for example) - This would give more of a similar experience to plugins under *nix, where shell scripts are often used. Moreover, there were two windows-specific behaviors that were redundant, which I've removed: 1. In plugin.go - There's no need to differentiate between windows and under OS-es when looking at the PATH variable; It can be refered as 'PATH' in Windows as well 2. In cmd.go - There's no need to append a suffix when looking up plugins on windows; One can safely use 'exec.LookPath' without a suffix on Windows - and get automatic resolving for known executable types --- pkg/kubectl/cmd/cmd.go | 7 ------- pkg/kubectl/cmd/plugin/plugin.go | 11 +++++------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/pkg/kubectl/cmd/cmd.go b/pkg/kubectl/cmd/cmd.go index cae1516b80..6440faa646 100644 --- a/pkg/kubectl/cmd/cmd.go +++ b/pkg/kubectl/cmd/cmd.go @@ -22,7 +22,6 @@ import ( "io" "os" "os/exec" - "runtime" "strings" "syscall" @@ -339,12 +338,6 @@ type defaultPluginHandler struct{} // Lookup implements PluginHandler func (h *defaultPluginHandler) Lookup(filename string) (string, error) { - // if on Windows, append the "exe" extension - // to the filename that we are looking up. - if runtime.GOOS == "windows" { - filename = filename + ".exe" - } - return exec.LookPath(filename) } diff --git a/pkg/kubectl/cmd/plugin/plugin.go b/pkg/kubectl/cmd/plugin/plugin.go index d7df928098..e8463f0455 100644 --- a/pkg/kubectl/cmd/plugin/plugin.go +++ b/pkg/kubectl/cmd/plugin/plugin.go @@ -100,11 +100,7 @@ func (o *PluginListOptions) Complete(cmd *cobra.Command) error { seenPlugins: make(map[string]string, 0), } - path := "PATH" - if runtime.GOOS == "windows" { - path = "path" - } - o.PluginPaths = filepath.SplitList(os.Getenv(path)) + o.PluginPaths = filepath.SplitList(os.Getenv("PATH")) return nil } @@ -230,7 +226,10 @@ func isExecutable(fullPath string) (bool, error) { } if runtime.GOOS == "windows" { - if strings.HasSuffix(info.Name(), ".exe") { + fileExt := strings.ToLower(filepath.Ext(fullPath)) + + switch fileExt { + case ".bat", ".cmd", ".com", ".exe": return true, nil } return false, nil