diff --git a/cmd/helm/completion.go b/cmd/helm/completion.go index 24fd0684b..29919ab1e 100644 --- a/cmd/helm/completion.go +++ b/cmd/helm/completion.go @@ -126,13 +126,6 @@ __helm_compgen() { __helm_compopt() { true # don't do anything. Not supported by bashcompinit in zsh } -__helm_declare() { - if [ "$1" == "-F" ]; then - whence -w "$@" - else - builtin declare "$@" - fi -} __helm_ltrim_colon_completions() { if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then @@ -210,7 +203,7 @@ __helm_convert_bash_to_zsh() { -e "s/${LWORD}__ltrim_colon_completions${RWORD}/__helm_ltrim_colon_completions/g" \ -e "s/${LWORD}compgen${RWORD}/__helm_compgen/g" \ -e "s/${LWORD}compopt${RWORD}/__helm_compopt/g" \ - -e "s/${LWORD}declare${RWORD}/__helm_declare/g" \ + -e "s/${LWORD}declare${RWORD}/builtin declare/g" \ -e "s/\\\$(type${RWORD}/\$(__helm_type/g" \ -e 's/aliashash\["\(.\{1,\}\)"\]/aliashash[\1]/g' \ -e 's/FUNCNAME/funcstack/g' \ diff --git a/cmd/helm/root.go b/cmd/helm/root.go index cbda8273f..30b452fcb 100644 --- a/cmd/helm/root.go +++ b/cmd/helm/root.go @@ -55,6 +55,40 @@ __helm_override_flags() fi done } + +__helm_override_flags_to_kubectl_flags() +{ + # --kubeconfig, -n, --namespace stay the same for kubectl + # --kube-context becomes --context for kubectl + __helm_debug "${FUNCNAME[0]}: flags to convert: $1" + echo "$1" | sed s/kube-context/context/ +} + +__helm_get_contexts() +{ + __helm_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" + local template out + template="{{ range .contexts }}{{ .name }} {{ end }}" + if out=$(kubectl config -o template --template="${template}" view 2>/dev/null); then + COMPREPLY=( $( compgen -W "${out[*]}" -- "$cur" ) ) + fi +} + +__helm_get_namespaces() +{ + __helm_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" + local template out + template="{{ range .items }}{{ .metadata.name }} {{ end }}" + + flags=$(__helm_override_flags_to_kubectl_flags "$(__helm_override_flags)") + __helm_debug "${FUNCNAME[0]}: override flags for kubectl are: $flags" + + # Must use eval in case the flags contain a variable such as $HOME + if out=$(eval kubectl get ${flags} -o template --template=\"${template}\" namespace 2>/dev/null); then + COMPREPLY+=( $( compgen -W "${out[*]}" -- "$cur" ) ) + fi +} + __helm_list_releases() { __helm_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" @@ -105,6 +139,15 @@ __helm_custom_func() ` ) +var ( + // Mapping of global flags that can have dynamic completion and the + // completion function to be used. + bashCompletionFlags = map[string]string{ + "namespace": "__helm_get_namespaces", + "kube-context": "__helm_get_contexts", + } +) + var globalUsage = `The Kubernetes package manager Common actions for Helm: @@ -196,6 +239,19 @@ func newRootCmd(actionConfig *action.Configuration, out io.Writer, args []string newDocsCmd(out), ) + // Add annotation to flags for which we can generate completion choices + for name, completion := range bashCompletionFlags { + if cmd.Flag(name) != nil { + if cmd.Flag(name).Annotations == nil { + cmd.Flag(name).Annotations = map[string][]string{} + } + cmd.Flag(name).Annotations[cobra.BashCompCustom] = append( + cmd.Flag(name).Annotations[cobra.BashCompCustom], + completion, + ) + } + } + // Add *experimental* subcommands registryClient, err := registry.NewClient( registry.ClientOptDebug(settings.Debug),