@@ -22,10 +22,13 @@ type Shells struct {
2222
2323var shells = map [string ]string {"zsh" : "zsh.yaml" , "bash" : "bash.yaml" }
2424
25+ var cobraBlackList = []string {"cert_manager" , "stern" }
26+
2527type Plugin struct {
26- Name string `yaml:"name"`
27- CompletionFunctionName string `yaml:"completionFunctionName"`
28- Description string `yaml:"description"`
28+ Name string `yaml:"name"`
29+ CompletionFunctionName string `yaml:"completionFunctionName"`
30+ Description string `yaml:"description"`
31+ PluginSupportsCobraCompletion bool `yaml:"supportsCobraCompletion"`
2932}
3033
3134type PluginConfigImpl struct {
@@ -51,13 +54,10 @@ type PluginConfig interface {
5154 GenerateCompletionScript () (string , error )
5255
5356 checkConfigFile () error
54- completionScriptCompletionFunctionSection () string
55- completionScriptDoesUseCobraSection () string
56- completionScriptPluginDescriptionSection () string
57- completionScriptSourceSection () string
5857
5958 createConfigFolder () error
6059 getAllKubectlPlugins () ([]string , error )
60+
6161 populatePlugins ([]string ) error
6262 removeOldPlugins (plugins []string )
6363
@@ -170,10 +170,14 @@ func (pc *PluginConfigImpl) populatePlugins(plugins []string) error {
170170 //check for completion and check for cobra and print
171171 continue
172172 }
173+
174+ completionFunctionName := pc .GetCompletionFunctionName (plugin )
175+
173176 err := pc .AddPlugin (Plugin {
174- Name : plugin ,
175- CompletionFunctionName : pc .GetCompletionFunctionName (plugin ),
176- Description : fmt .Sprintf ("A kubectl plugin called %s" , plugin ),
177+ Name : plugin ,
178+ CompletionFunctionName : completionFunctionName ,
179+ Description : fmt .Sprintf ("A kubectl plugin called %s" , plugin ),
180+ PluginSupportsCobraCompletion : completionFunctionName != "" ,
177181 })
178182
179183 if err != nil {
@@ -286,7 +290,6 @@ func (pc *PluginConfigImpl) DoesPluginExist(plugin string) bool {
286290}
287291
288292func (pc * PluginConfigImpl ) GetCompletionFunctionName (plugin string ) string {
289-
290293 if ! pc .DoesPluginUseCobra (plugin ) {
291294 return ""
292295 }
@@ -301,6 +304,9 @@ func (pc *PluginConfigImpl) GetCompletionFunctionName(plugin string) string {
301304}
302305
303306func (pc * PluginConfigImpl ) DoesPluginUseCobra (plugin string ) bool {
307+ if inCobraBlackList (plugin ) {
308+ return false
309+ }
304310 command := "grep ValidArgsFunction $(which kubectl-" + plugin + ") || true"
305311 output , err := exec .Command (pc .ShellLocation , "-c" , command ).Output ()
306312
@@ -322,33 +328,47 @@ func (pc *PluginConfigImpl) GenerateCompletionScript() (string, error) {
322328 pluginList , err := pc .getAllKubectlPlugins ()
323329
324330 if err != nil {
325- return "" , nil
331+ return "" , err
326332 }
327333
328334 plugins := strings .Join (pluginList , " " )
329335
330- initPluginCode := pc .completionScriptSourceSection ()
336+ initPluginCode := ""
337+ for _ , plugin := range pc .Plugins {
338+ pluginUsesCobra := plugin .PluginSupportsCobraCompletion
331339
332- var section string
340+ // source section
341+ if pluginUsesCobra {
342+ initPluginCode += fmt .Sprintf ("\t source <(kubectl-%s completion %s)\n " , plugin .Name , pc .Shell )
333343
334- if section = pc .completionScriptCompletionFunctionSection (); section != "" {
335- initPluginCode += "\n "
336- }
337- initPluginCode += section
344+ }
338345
339- if pc .Shell == "zsh" {
340- if section = pc .completionScriptPluginDescriptionSection (); section != "" {
341- initPluginCode += "\n "
346+ //completion function section
347+ if plugin .CompletionFunctionName != "" {
348+ switch pc .Shell {
349+ case "bash" :
350+ initPluginCode += fmt .Sprintf ("\t pluginCompletionFunction[%s]=\" %s\" \n " , plugin .Name , plugin .CompletionFunctionName )
351+ case "zsh" :
352+ initPluginCode += fmt .Sprintf ("\t compdef %s kubectl-%s\n " , plugin .CompletionFunctionName , plugin .Name )
353+ }
342354 }
343355
344- initPluginCode += section
345- }
356+ // Plugin Description
357+ if pc .Shell == "zsh" {
358+ initPluginCode += fmt .Sprintf ("\t pluginDescription[%s]=\" %s\" \n " , plugin .Name , plugin .Description )
359+ }
346360
347- if pc .Shell == "zsh" {
348- if section = pc .completionScriptDoesUseCobraSection (); section != "" {
349- initPluginCode += "\n "
361+ // Does use cobra section
362+ if pc .Shell == "zsh" {
363+ if strings .TrimSpace (plugin .Description ) != "" {
364+ if pluginUsesCobra {
365+ initPluginCode += fmt .Sprintf ("\t cobraSupported[%s]=true\n " , plugin .Name )
366+ }
367+ }
350368 }
351- initPluginCode += section
369+
370+ initPluginCode += "\n "
371+
352372 }
353373
354374 switch pc .Shell {
@@ -360,49 +380,12 @@ func (pc *PluginConfigImpl) GenerateCompletionScript() (string, error) {
360380 return "" , nil
361381}
362382
363- func (pc * PluginConfigImpl ) completionScriptSourceSection () string {
364- section := ""
365- for _ , plugin := range pc .Plugins {
366-
367- if pc .DoesPluginUseCobra (plugin .Name ) {
368- section += fmt .Sprintf ("\t source <(kubectl-%s completion %s)\n " , plugin .Name , pc .Shell )
369- }
370-
371- }
372- return section
373- }
374-
375- func (pc * PluginConfigImpl ) completionScriptCompletionFunctionSection () string {
376- section := ""
377- for _ , plugin := range pc .Plugins {
378- switch pc .Shell {
379- case "bash" :
380- section += fmt .Sprintf ("\t pluginCompletionFunction[%s]=\" %s\" \n " , plugin .Name , plugin .CompletionFunctionName )
381- case "zsh" :
382- section += fmt .Sprintf ("\t compdef %s kubectl-%s\n " , plugin .CompletionFunctionName , plugin .Name )
383- }
384- }
385- return section
386-
387- }
388-
389- func (pc * PluginConfigImpl ) completionScriptDoesUseCobraSection () string {
390- section := ""
391- for _ , plugin := range pc .Plugins {
392- if strings .TrimSpace (plugin .Description ) != "" {
393- if pc .DoesPluginUseCobra (plugin .Name ) {
394- section += fmt .Sprintf ("\t cobraSupported[%s]=true\n " , plugin .Name )
395- }
383+ func inCobraBlackList (plugin string ) bool {
384+ for _ , pluginName := range cobraBlackList {
385+ if plugin == pluginName {
386+ return true
396387 }
397388 }
398- return section
399-
400- }
389+ return false
401390
402- func (pc * PluginConfigImpl ) completionScriptPluginDescriptionSection () string {
403- section := ""
404- for _ , plugin := range pc .Plugins {
405- section += fmt .Sprintf ("\t pluginDescription[%s]=\" %s\" \n " , plugin .Name , plugin .Description )
406- }
407- return section
408391}
0 commit comments