Skip to content

Commit 2ef3fb3

Browse files
author
Martin Simango
committed
Descrease completion script generation time
1 parent 18c7a3f commit 2ef3fb3

5 files changed

Lines changed: 63 additions & 72 deletions

File tree

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ endif
55
install:
66
go build && go install
77

8+
uninstall:
9+
-rm ${GOBIN}/kubectl-plugin_completion
10+
11+
reinstall: uninstall install
12+
813
release:
914
goreleaser release --rm-dist
1015

cmd/configGenerate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ var configGenerateCmd = &cobra.Command{
1616
Short: "Generate plugin files for shell scripts",
1717
Long: `Generate plugin files for shell scripts`,
1818
Run: func(cmd *cobra.Command, args []string) {
19-
2019
NewBashPluginConfigImpl().GeneratePluginConfig()
2120
NewZshPluginConfigImpl().GeneratePluginConfig()
2221

23-
fmt.Println("Run source <(kubectl plugin_completion generate $SHELL) to update completion")
22+
fmt.Println("Run source <(kubectl plugin_completion plugin_completion $SHELL_NAME) to update kubectl plugin completion")
23+
2424
},
2525
}
2626

cmd/plugin-config.go

Lines changed: 52 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@ type Shells struct {
2222

2323
var shells = map[string]string{"zsh": "zsh.yaml", "bash": "bash.yaml"}
2424

25+
var cobraBlackList = []string{"cert_manager", "stern"}
26+
2527
type 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

3134
type 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

288292
func (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

303306
func (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("\tsource <(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("\tpluginCompletionFunction[%s]=\"%s\"\n", plugin.Name, plugin.CompletionFunctionName)
351+
case "zsh":
352+
initPluginCode += fmt.Sprintf("\tcompdef %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("\tpluginDescription[%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("\tcobraSupported[%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("\tsource <(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("\tpluginCompletionFunction[%s]=\"%s\"\n", plugin.Name, plugin.CompletionFunctionName)
381-
case "zsh":
382-
section += fmt.Sprintf("\tcompdef %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("\tcobraSupported[%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("\tpluginDescription[%s]=\"%s\"\n", plugin.Name, plugin.Description)
406-
}
407-
return section
408391
}

scripts/bash-script.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ var BashCompletionScript = `
44
declare -A pluginCompletionFunction
55
66
init_plugins(){
7+
78
source <(kubectl completion bash)
9+
810
%s
911
}
1012

scripts/zsh-script.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ declare -A cobraSupported
88
99
init_plugins(){
1010
11-
source <(kubectl completion zsh)
11+
source <(kubectl completion zsh)
12+
1213
%s
1314
}
1415

0 commit comments

Comments
 (0)