update shell completion scripts

The new cobra v1.2.0 release brings a number of bug fixes for shell
completion scripts. Regenerate the scripts with `make completions`
to sync them with the upstream version, currently we have some custom
ones to avoid some upstream bugs. Because the new cobra version has
all fixes we should use the upstream scripts.
Add a check to CI to ensure we always use the up to date scripts.

[NO TESTS NEEDED]

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
Paul Holzinger
2021-07-01 20:01:44 +02:00
parent 924cd37a37
commit 84da70a0f3
10 changed files with 339 additions and 341 deletions

View File

@ -65,7 +65,7 @@ func completion(cmd *cobra.Command, args []string) error {
var err error var err error
switch args[0] { switch args[0] {
case "bash": case "bash":
err = cmd.Root().GenBashCompletion(w) err = cmd.Root().GenBashCompletionV2(w, !noDesc)
case "zsh": case "zsh":
if noDesc { if noDesc {
err = cmd.Root().GenZshCompletionNoDesc(w) err = cmd.Root().GenZshCompletionNoDesc(w)

View File

@ -1,38 +1,29 @@
# bash completion for podman -*- shell-script -*- # bash completion V2 for podman -*- shell-script -*-
__podman_debug() __podman_debug()
{ {
if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then
echo "$*" >> "${BASH_COMP_DEBUG_FILE}" echo "$*" >> "${BASH_COMP_DEBUG_FILE}"
fi fi
} }
__podman_perform_completion() # Macs have bash3 for which the bash-completion package doesn't include
# _init_completion. This is a minimal version of that function.
__podman_init_completion()
{ {
__podman_debug COMPREPLY=()
__podman_debug "========= starting completion logic ==========" _get_comp_words_by_ref "$@" cur prev words cword
__podman_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword" }
# The user could have moved the cursor backwards on the command-line. # This function calls the podman program to obtain the completion
# We need to trigger completion from the $cword location, so we need # results and the directive. It fills the 'out' and 'directive' vars.
# to truncate the command-line ($words) up to the $cword location. __podman_get_completion_results() {
words=("${words[@]:0:$cword+1}") local requestComp lastParam lastChar args
__podman_debug "Truncated words[*]: ${words[*]},"
local shellCompDirectiveError=1
local shellCompDirectiveNoSpace=2
local shellCompDirectiveNoFileComp=4
local shellCompDirectiveFilterFileExt=8
local shellCompDirectiveFilterDirs=16
local shellCompDirectiveLegacyCustomComp=32
local shellCompDirectiveLegacyCustomArgsComp=64
local out requestComp lastParam lastChar comp directive args flagPrefix
# Prepare the command to request completions for the program. # Prepare the command to request completions for the program.
# Calling ${words[0]} instead of directly podman allows to handle aliases # Calling ${words[0]} instead of directly podman allows to handle aliases
args=("${words[@]:1}") args=("${words[@]:1}")
requestComp="${words[0]} __completeNoDesc ${args[*]}" requestComp="${words[0]} __complete ${args[*]}"
lastParam=${words[$((${#words[@]}-1))]} lastParam=${words[$((${#words[@]}-1))]}
lastChar=${lastParam:$((${#lastParam}-1)):1} lastChar=${lastParam:$((${#lastParam}-1)):1}
@ -42,14 +33,13 @@ __podman_perform_completion()
# If the last parameter is complete (there is a space following it) # If the last parameter is complete (there is a space following it)
# We add an extra empty parameter so we can indicate this to the go method. # We add an extra empty parameter so we can indicate this to the go method.
__podman_debug "Adding extra empty parameter" __podman_debug "Adding extra empty parameter"
requestComp="${requestComp} \"\"" requestComp="${requestComp} ''"
fi fi
# When completing a flag with an = (e.g., podman -n=<TAB>) # When completing a flag with an = (e.g., podman -n=<TAB>)
# bash focuses on the part after the =, so we need to remove # bash focuses on the part after the =, so we need to remove
# the flag part from $cur # the flag part from $cur
if [[ "${cur}" == -*=* ]]; then if [[ "${cur}" == -*=* ]]; then
flagPrefix="${cur%%=*}="
cur="${cur#*=}" cur="${cur#*=}"
fi fi
@ -67,6 +57,14 @@ __podman_perform_completion()
fi fi
__podman_debug "The completion directive is: ${directive}" __podman_debug "The completion directive is: ${directive}"
__podman_debug "The completions are: ${out[*]}" __podman_debug "The completions are: ${out[*]}"
}
__podman_process_completion_results() {
local shellCompDirectiveError=1
local shellCompDirectiveNoSpace=2
local shellCompDirectiveNoFileComp=4
local shellCompDirectiveFilterFileExt=8
local shellCompDirectiveFilterDirs=16
if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then
# Error code. No completion. # Error code. No completion.
@ -77,12 +75,16 @@ __podman_perform_completion()
if [[ $(type -t compopt) = "builtin" ]]; then if [[ $(type -t compopt) = "builtin" ]]; then
__podman_debug "Activating no space" __podman_debug "Activating no space"
compopt -o nospace compopt -o nospace
else
__podman_debug "No space directive not supported in this version of bash"
fi fi
fi fi
if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then
if [[ $(type -t compopt) = "builtin" ]]; then if [[ $(type -t compopt) = "builtin" ]]; then
__podman_debug "Activating no file completion" __podman_debug "Activating no file completion"
compopt +o default compopt +o default
else
__podman_debug "No file completion directive not supported in this version of bash"
fi fi
fi fi
fi fi
@ -113,87 +115,56 @@ __podman_perform_completion()
__podman_debug "Listing directories in ." __podman_debug "Listing directories in ."
_filedir -d _filedir -d
fi fi
elif [ $((directive & shellCompDirectiveLegacyCustomComp)) -ne 0 ]; then
local cmd
__podman_debug "Legacy custom completion. Directive: $directive, cmds: ${out[*]}"
# The following variables should get their value through the commands
# we have received as completions and are parsing below.
local last_command
local nouns
# Execute every command received
while IFS='' read -r cmd; do
__podman_debug "About to execute: $cmd"
eval "$cmd"
done < <(printf "%s\n" "${out[@]}")
__podman_debug "last_command: $last_command"
__podman_debug "nouns[0]: ${nouns[0]}, nouns[1]: ${nouns[1]}"
if [ $((directive & shellCompDirectiveLegacyCustomArgsComp)) -ne 0 ]; then
# We should call the global legacy custom completion function, if it is defined
if declare -F __podman_custom_func >/dev/null; then
# Use command name qualified legacy custom func
__podman_debug "About to call: __podman_custom_func"
__podman_custom_func
elif declare -F __custom_func >/dev/null; then
# Otherwise fall back to unqualified legacy custom func for compatibility
__podman_debug "About to call: __custom_func"
__custom_func
fi
fi
else else
local tab __podman_handle_standard_completion_case
tab=$(printf '\t')
local longest=0
# Look for the longest completion so that we can format things nicely
while IFS='' read -r comp; do
comp=${comp%%$tab*}
if ((${#comp}>longest)); then
longest=${#comp}
fi
done < <(printf "%s\n" "${out[@]}")
local completions=()
while IFS='' read -r comp; do
if [ -z "$comp" ]; then
continue
fi
__podman_debug "Original comp: $comp"
comp="$(__podman_format_comp_descriptions "$comp" "$longest")"
__podman_debug "Final comp: $comp"
completions+=("$comp")
done < <(printf "%s\n" "${out[@]}")
while IFS='' read -r comp; do
# Although this script should only be used for bash
# there may be programs that still convert the bash
# script into a zsh one. To continue supporting those
# programs, we do this single adaptation for zsh
if [ -n "${ZSH_VERSION}" ]; then
# zsh completion needs --flag= prefix
COMPREPLY+=("$flagPrefix$comp")
else
COMPREPLY+=("$comp")
fi
done < <(compgen -W "${completions[*]}" -- "$cur")
# If there is a single completion left, remove the description text
if [ ${#COMPREPLY[*]} -eq 1 ]; then
__podman_debug "COMPREPLY[0]: ${COMPREPLY[0]}"
comp="${COMPREPLY[0]%% *}"
__podman_debug "Removed description from single completion, which is now: ${comp}"
COMPREPLY=()
COMPREPLY+=("$comp")
fi
fi fi
__podman_handle_special_char "$cur" : __podman_handle_special_char "$cur" :
__podman_handle_special_char "$cur" = __podman_handle_special_char "$cur" =
} }
__podman_handle_standard_completion_case() {
local tab comp
tab=$(printf '\t')
local longest=0
# Look for the longest completion so that we can format things nicely
while IFS='' read -r comp; do
# Strip any description before checking the length
comp=${comp%%$tab*}
# Only consider the completions that match
comp=$(compgen -W "$comp" -- "$cur")
if ((${#comp}>longest)); then
longest=${#comp}
fi
done < <(printf "%s\n" "${out[@]}")
local completions=()
while IFS='' read -r comp; do
if [ -z "$comp" ]; then
continue
fi
__podman_debug "Original comp: $comp"
comp="$(__podman_format_comp_descriptions "$comp" "$longest")"
__podman_debug "Final comp: $comp"
completions+=("$comp")
done < <(printf "%s\n" "${out[@]}")
while IFS='' read -r comp; do
COMPREPLY+=("$comp")
done < <(compgen -W "${completions[*]}" -- "$cur")
# If there is a single completion left, remove the description text
if [ ${#COMPREPLY[*]} -eq 1 ]; then
__podman_debug "COMPREPLY[0]: ${COMPREPLY[0]}"
comp="${COMPREPLY[0]%% *}"
__podman_debug "Removed description from single completion, which is now: ${comp}"
COMPREPLY=()
COMPREPLY+=("$comp")
fi
}
__podman_handle_special_char() __podman_handle_special_char()
{ {
local comp="$1" local comp="$1"
@ -252,12 +223,31 @@ __podman_format_comp_descriptions()
__start_podman() __start_podman()
{ {
local cur prev words cword local cur prev words cword split
COMPREPLY=() COMPREPLY=()
_get_comp_words_by_ref -n "=:" cur prev words cword
__podman_perform_completion # Call _init_completion from the bash-completion package
# to prepare the arguments properly
if declare -F _init_completion >/dev/null 2>&1; then
_init_completion -n "=:" || return
else
__podman_init_completion -n "=:" || return
fi
__podman_debug
__podman_debug "========= starting completion logic =========="
__podman_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword"
# The user could have moved the cursor backwards on the command-line.
# We need to trigger completion from the $cword location, so we need
# to truncate the command-line ($words) up to the $cword location.
words=("${words[@]:0:$cword+1}")
__podman_debug "Truncated words[*]: ${words[*]},"
local out directive
__podman_get_completion_results
__podman_process_completion_results
} }
if [[ $(type -t compopt) = "builtin" ]]; then if [[ $(type -t compopt) = "builtin" ]]; then

View File

@ -1,38 +1,29 @@
# bash completion for podman-remote -*- shell-script -*- # bash completion V2 for podman-remote -*- shell-script -*-
__podman-remote_debug() __podman-remote_debug()
{ {
if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then
echo "$*" >> "${BASH_COMP_DEBUG_FILE}" echo "$*" >> "${BASH_COMP_DEBUG_FILE}"
fi fi
} }
__podman-remote_perform_completion() # Macs have bash3 for which the bash-completion package doesn't include
# _init_completion. This is a minimal version of that function.
__podman-remote_init_completion()
{ {
__podman-remote_debug COMPREPLY=()
__podman-remote_debug "========= starting completion logic ==========" _get_comp_words_by_ref "$@" cur prev words cword
__podman-remote_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword" }
# The user could have moved the cursor backwards on the command-line. # This function calls the podman-remote program to obtain the completion
# We need to trigger completion from the $cword location, so we need # results and the directive. It fills the 'out' and 'directive' vars.
# to truncate the command-line ($words) up to the $cword location. __podman-remote_get_completion_results() {
words=("${words[@]:0:$cword+1}") local requestComp lastParam lastChar args
__podman-remote_debug "Truncated words[*]: ${words[*]},"
local shellCompDirectiveError=1
local shellCompDirectiveNoSpace=2
local shellCompDirectiveNoFileComp=4
local shellCompDirectiveFilterFileExt=8
local shellCompDirectiveFilterDirs=16
local shellCompDirectiveLegacyCustomComp=32
local shellCompDirectiveLegacyCustomArgsComp=64
local out requestComp lastParam lastChar comp directive args flagPrefix
# Prepare the command to request completions for the program. # Prepare the command to request completions for the program.
# Calling ${words[0]} instead of directly podman-remote allows to handle aliases # Calling ${words[0]} instead of directly podman-remote allows to handle aliases
args=("${words[@]:1}") args=("${words[@]:1}")
requestComp="${words[0]} __completeNoDesc ${args[*]}" requestComp="${words[0]} __complete ${args[*]}"
lastParam=${words[$((${#words[@]}-1))]} lastParam=${words[$((${#words[@]}-1))]}
lastChar=${lastParam:$((${#lastParam}-1)):1} lastChar=${lastParam:$((${#lastParam}-1)):1}
@ -42,14 +33,13 @@ __podman-remote_perform_completion()
# If the last parameter is complete (there is a space following it) # If the last parameter is complete (there is a space following it)
# We add an extra empty parameter so we can indicate this to the go method. # We add an extra empty parameter so we can indicate this to the go method.
__podman-remote_debug "Adding extra empty parameter" __podman-remote_debug "Adding extra empty parameter"
requestComp="${requestComp} \"\"" requestComp="${requestComp} ''"
fi fi
# When completing a flag with an = (e.g., podman-remote -n=<TAB>) # When completing a flag with an = (e.g., podman-remote -n=<TAB>)
# bash focuses on the part after the =, so we need to remove # bash focuses on the part after the =, so we need to remove
# the flag part from $cur # the flag part from $cur
if [[ "${cur}" == -*=* ]]; then if [[ "${cur}" == -*=* ]]; then
flagPrefix="${cur%%=*}="
cur="${cur#*=}" cur="${cur#*=}"
fi fi
@ -67,6 +57,14 @@ __podman-remote_perform_completion()
fi fi
__podman-remote_debug "The completion directive is: ${directive}" __podman-remote_debug "The completion directive is: ${directive}"
__podman-remote_debug "The completions are: ${out[*]}" __podman-remote_debug "The completions are: ${out[*]}"
}
__podman-remote_process_completion_results() {
local shellCompDirectiveError=1
local shellCompDirectiveNoSpace=2
local shellCompDirectiveNoFileComp=4
local shellCompDirectiveFilterFileExt=8
local shellCompDirectiveFilterDirs=16
if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then
# Error code. No completion. # Error code. No completion.
@ -77,12 +75,16 @@ __podman-remote_perform_completion()
if [[ $(type -t compopt) = "builtin" ]]; then if [[ $(type -t compopt) = "builtin" ]]; then
__podman-remote_debug "Activating no space" __podman-remote_debug "Activating no space"
compopt -o nospace compopt -o nospace
else
__podman-remote_debug "No space directive not supported in this version of bash"
fi fi
fi fi
if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then
if [[ $(type -t compopt) = "builtin" ]]; then if [[ $(type -t compopt) = "builtin" ]]; then
__podman-remote_debug "Activating no file completion" __podman-remote_debug "Activating no file completion"
compopt +o default compopt +o default
else
__podman-remote_debug "No file completion directive not supported in this version of bash"
fi fi
fi fi
fi fi
@ -113,87 +115,56 @@ __podman-remote_perform_completion()
__podman-remote_debug "Listing directories in ." __podman-remote_debug "Listing directories in ."
_filedir -d _filedir -d
fi fi
elif [ $((directive & shellCompDirectiveLegacyCustomComp)) -ne 0 ]; then
local cmd
__podman-remote_debug "Legacy custom completion. Directive: $directive, cmds: ${out[*]}"
# The following variables should get their value through the commands
# we have received as completions and are parsing below.
local last_command
local nouns
# Execute every command received
while IFS='' read -r cmd; do
__podman-remote_debug "About to execute: $cmd"
eval "$cmd"
done < <(printf "%s\n" "${out[@]}")
__podman-remote_debug "last_command: $last_command"
__podman-remote_debug "nouns[0]: ${nouns[0]}, nouns[1]: ${nouns[1]}"
if [ $((directive & shellCompDirectiveLegacyCustomArgsComp)) -ne 0 ]; then
# We should call the global legacy custom completion function, if it is defined
if declare -F __podman-remote_custom_func >/dev/null; then
# Use command name qualified legacy custom func
__podman-remote_debug "About to call: __podman-remote_custom_func"
__podman-remote_custom_func
elif declare -F __custom_func >/dev/null; then
# Otherwise fall back to unqualified legacy custom func for compatibility
__podman-remote_debug "About to call: __custom_func"
__custom_func
fi
fi
else else
local tab __podman-remote_handle_standard_completion_case
tab=$(printf '\t')
local longest=0
# Look for the longest completion so that we can format things nicely
while IFS='' read -r comp; do
comp=${comp%%$tab*}
if ((${#comp}>longest)); then
longest=${#comp}
fi
done < <(printf "%s\n" "${out[@]}")
local completions=()
while IFS='' read -r comp; do
if [ -z "$comp" ]; then
continue
fi
__podman-remote_debug "Original comp: $comp"
comp="$(__podman-remote_format_comp_descriptions "$comp" "$longest")"
__podman-remote_debug "Final comp: $comp"
completions+=("$comp")
done < <(printf "%s\n" "${out[@]}")
while IFS='' read -r comp; do
# Although this script should only be used for bash
# there may be programs that still convert the bash
# script into a zsh one. To continue supporting those
# programs, we do this single adaptation for zsh
if [ -n "${ZSH_VERSION}" ]; then
# zsh completion needs --flag= prefix
COMPREPLY+=("$flagPrefix$comp")
else
COMPREPLY+=("$comp")
fi
done < <(compgen -W "${completions[*]}" -- "$cur")
# If there is a single completion left, remove the description text
if [ ${#COMPREPLY[*]} -eq 1 ]; then
__podman-remote_debug "COMPREPLY[0]: ${COMPREPLY[0]}"
comp="${COMPREPLY[0]%% *}"
__podman-remote_debug "Removed description from single completion, which is now: ${comp}"
COMPREPLY=()
COMPREPLY+=("$comp")
fi
fi fi
__podman-remote_handle_special_char "$cur" : __podman-remote_handle_special_char "$cur" :
__podman-remote_handle_special_char "$cur" = __podman-remote_handle_special_char "$cur" =
} }
__podman-remote_handle_standard_completion_case() {
local tab comp
tab=$(printf '\t')
local longest=0
# Look for the longest completion so that we can format things nicely
while IFS='' read -r comp; do
# Strip any description before checking the length
comp=${comp%%$tab*}
# Only consider the completions that match
comp=$(compgen -W "$comp" -- "$cur")
if ((${#comp}>longest)); then
longest=${#comp}
fi
done < <(printf "%s\n" "${out[@]}")
local completions=()
while IFS='' read -r comp; do
if [ -z "$comp" ]; then
continue
fi
__podman-remote_debug "Original comp: $comp"
comp="$(__podman-remote_format_comp_descriptions "$comp" "$longest")"
__podman-remote_debug "Final comp: $comp"
completions+=("$comp")
done < <(printf "%s\n" "${out[@]}")
while IFS='' read -r comp; do
COMPREPLY+=("$comp")
done < <(compgen -W "${completions[*]}" -- "$cur")
# If there is a single completion left, remove the description text
if [ ${#COMPREPLY[*]} -eq 1 ]; then
__podman-remote_debug "COMPREPLY[0]: ${COMPREPLY[0]}"
comp="${COMPREPLY[0]%% *}"
__podman-remote_debug "Removed description from single completion, which is now: ${comp}"
COMPREPLY=()
COMPREPLY+=("$comp")
fi
}
__podman-remote_handle_special_char() __podman-remote_handle_special_char()
{ {
local comp="$1" local comp="$1"
@ -252,12 +223,31 @@ __podman-remote_format_comp_descriptions()
__start_podman-remote() __start_podman-remote()
{ {
local cur prev words cword local cur prev words cword split
COMPREPLY=() COMPREPLY=()
_get_comp_words_by_ref -n "=:" cur prev words cword
__podman-remote_perform_completion # Call _init_completion from the bash-completion package
# to prepare the arguments properly
if declare -F _init_completion >/dev/null 2>&1; then
_init_completion -n "=:" || return
else
__podman-remote_init_completion -n "=:" || return
fi
__podman-remote_debug
__podman-remote_debug "========= starting completion logic =========="
__podman-remote_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword"
# The user could have moved the cursor backwards on the command-line.
# We need to trigger completion from the $cword location, so we need
# to truncate the command-line ($words) up to the $cword location.
words=("${words[@]:0:$cword+1}")
__podman-remote_debug "Truncated words[*]: ${words[*]},"
local out directive
__podman-remote_get_completion_results
__podman-remote_process_completion_results
} }
if [[ $(type -t compopt) = "builtin" ]]; then if [[ $(type -t compopt) = "builtin" ]]; then

View File

@ -1,7 +1,7 @@
# fish completion for podman-remote -*- shell-script -*- # fish completion for podman-remote -*- shell-script -*-
function __podman_remote_debug function __podman_remote_debug
set file "$BASH_COMP_DEBUG_FILE" set -l file "$BASH_COMP_DEBUG_FILE"
if test -n "$file" if test -n "$file"
echo "$argv" >> $file echo "$argv" >> $file
end end
@ -10,32 +10,38 @@ end
function __podman_remote_perform_completion function __podman_remote_perform_completion
__podman_remote_debug "Starting __podman_remote_perform_completion" __podman_remote_debug "Starting __podman_remote_perform_completion"
set args (string split -- " " (string trim -l (commandline -c))) # Extract all args except the last one
set lastArg "$args[-1]" set -l args (commandline -opc)
# Extract the last arg and escape it in case it is a space
set -l lastArg (string escape -- (commandline -ct))
__podman_remote_debug "args: $args" __podman_remote_debug "args: $args"
__podman_remote_debug "last arg: $lastArg" __podman_remote_debug "last arg: $lastArg"
set emptyArg "" set -l requestComp "$args[1] __complete $args[2..-1] $lastArg"
if test -z "$lastArg"
__podman_remote_debug "Setting emptyArg"
set emptyArg \"\"
end
__podman_remote_debug "emptyArg: $emptyArg"
set requestComp "$args[1] __complete $args[2..-1] $emptyArg"
__podman_remote_debug "Calling $requestComp" __podman_remote_debug "Calling $requestComp"
set -l results (eval $requestComp 2> /dev/null)
# Call the command as a sub-shell so that we can redirect any errors # Some programs may output extra empty lines after the directive.
# For example, if $requestComp has an unmatched quote # Let's ignore them or else it will break completion.
# https://github.com/spf13/cobra/issues/1214 # Ref: https://github.com/spf13/cobra/issues/1279
set results (fish -c "$requestComp" 2> /dev/null) for line in $results[-1..1]
set comps $results[1..-2] if test (string trim -- $line) = ""
set directiveLine $results[-1] # Found an empty line, remove it
set results $results[1..-2]
else
# Found non-empty line, we have our proper output
break
end
end
set -l comps $results[1..-2]
set -l directiveLine $results[-1]
# For Fish, when completing a flag with an = (e.g., <program> -n=<TAB>) # For Fish, when completing a flag with an = (e.g., <program> -n=<TAB>)
# completions must be prefixed with the flag # completions must be prefixed with the flag
set flagPrefix (string match -r -- '-.*=' "$lastArg") set -l flagPrefix (string match -r -- '-.*=' "$lastArg")
__podman_remote_debug "Comps: $comps" __podman_remote_debug "Comps: $comps"
__podman_remote_debug "DirectiveLine: $directiveLine" __podman_remote_debug "DirectiveLine: $directiveLine"
@ -58,7 +64,7 @@ function __podman_remote_prepare_completions
# Start fresh # Start fresh
set --erase __podman_remote_comp_results set --erase __podman_remote_comp_results
set results (__podman_remote_perform_completion) set -l results (__podman_remote_perform_completion)
__podman_remote_debug "Completion results: $results" __podman_remote_debug "Completion results: $results"
if test -z "$results" if test -z "$results"
@ -67,39 +73,39 @@ function __podman_remote_prepare_completions
return 1 return 1
end end
set directive (string sub --start 2 $results[-1]) set -l directive (string sub --start 2 $results[-1])
set --global __podman_remote_comp_results $results[1..-2] set --global __podman_remote_comp_results $results[1..-2]
__podman_remote_debug "Completions are: $__podman_remote_comp_results" __podman_remote_debug "Completions are: $__podman_remote_comp_results"
__podman_remote_debug "Directive is: $directive" __podman_remote_debug "Directive is: $directive"
set shellCompDirectiveError 1 set -l shellCompDirectiveError 1
set shellCompDirectiveNoSpace 2 set -l shellCompDirectiveNoSpace 2
set shellCompDirectiveNoFileComp 4 set -l shellCompDirectiveNoFileComp 4
set shellCompDirectiveFilterFileExt 8 set -l shellCompDirectiveFilterFileExt 8
set shellCompDirectiveFilterDirs 16 set -l shellCompDirectiveFilterDirs 16
if test -z "$directive" if test -z "$directive"
set directive 0 set directive 0
end end
set compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2) set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2)
if test $compErr -eq 1 if test $compErr -eq 1
__podman_remote_debug "Received error directive: aborting." __podman_remote_debug "Received error directive: aborting."
# Might as well do file completion, in case it helps # Might as well do file completion, in case it helps
return 1 return 1
end end
set filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2)
set dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2)
if test $filefilter -eq 1; or test $dirfilter -eq 1 if test $filefilter -eq 1; or test $dirfilter -eq 1
__podman_remote_debug "File extension filtering or directory filtering not supported" __podman_remote_debug "File extension filtering or directory filtering not supported"
# Do full file completion instead # Do full file completion instead
return 1 return 1
end end
set nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2)
set nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2)
__podman_remote_debug "nospace: $nospace, nofiles: $nofiles" __podman_remote_debug "nospace: $nospace, nofiles: $nofiles"
@ -109,34 +115,34 @@ function __podman_remote_prepare_completions
# may not already be filtered so as to allow fish to match on different # may not already be filtered so as to allow fish to match on different
# criteria than the prefix. # criteria than the prefix.
if test $nospace -ne 0; or test $nofiles -eq 0 if test $nospace -ne 0; or test $nofiles -eq 0
set prefix (commandline -t) set -l prefix (commandline -t | string escape --style=regex)
__podman_remote_debug "prefix: $prefix" __podman_remote_debug "prefix: $prefix"
set completions set -l completions (string match -r -- "^$prefix.*" $__podman_remote_comp_results)
for comp in $__podman_remote_comp_results
if test (string match -e -r -- "^$prefix" "$comp")
set -a completions $comp
end
end
set --global __podman_remote_comp_results $completions set --global __podman_remote_comp_results $completions
__podman_remote_debug "Filtered completions are: $__podman_remote_comp_results" __podman_remote_debug "Filtered completions are: $__podman_remote_comp_results"
# Important not to quote the variable for count to work # Important not to quote the variable for count to work
set numComps (count $__podman_remote_comp_results) set -l numComps (count $__podman_remote_comp_results)
__podman_remote_debug "numComps: $numComps" __podman_remote_debug "numComps: $numComps"
if test $numComps -eq 1; and test $nospace -ne 0 if test $numComps -eq 1; and test $nospace -ne 0
# To support the "nospace" directive we trick the shell # We must first split on \t to get rid of the descriptions to be
# by outputting an extra, longer completion. # able to check what the actual completion will be.
# We must first split on \t to get rid of the descriptions because # We don't need descriptions anyway since there is only a single
# the extra character we add to the fake second completion must be # real completion which the shell will expand immediately.
# before the description. We don't need descriptions anyway since set -l split (string split --max 1 \t $__podman_remote_comp_results[1])
# there is only a single real completion which the shell will expand
# immediately. # Fish won't add a space if the completion ends with any
__podman_remote_debug "Adding second completion to perform nospace directive" # of the following characters: @=/:.,
set split (string split --max 1 \t $__podman_remote_comp_results[1]) set -l lastChar (string sub -s -1 -- $split)
set --global __podman_remote_comp_results $split[1] $split[1]. if not string match -r -q "[@=/:.,]" -- "$lastChar"
__podman_remote_debug "Completions are now: $__podman_remote_comp_results" # In other cases, to support the "nospace" directive we trick the shell
# by outputting an extra, longer completion.
__podman_remote_debug "Adding second completion to perform nospace directive"
set --global __podman_remote_comp_results $split[1] $split[1].
__podman_remote_debug "Completions are now: $__podman_remote_comp_results"
end
end end
if test $numComps -eq 0; and test $nofiles -eq 0 if test $numComps -eq 0; and test $nofiles -eq 0
@ -152,10 +158,14 @@ end
# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves # Since Fish completions are only loaded once the user triggers them, we trigger them ourselves
# so we can properly delete any completions provided by another script. # so we can properly delete any completions provided by another script.
# The space after the program name is essential to trigger completion for the program # Only do this if the program can be found, or else fish may print some errors; besides,
# and not completion of the program name itself. # the existing completions will only be loaded if the program can be found.
complete --do-complete "podman-remote " > /dev/null 2>&1 if type -q "podman-remote"
# Using '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. # The space after the program name is essential to trigger completion for the program
# and not completion of the program name itself.
# Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.
complete --do-complete "podman-remote " > /dev/null 2>&1
end
# Remove any pre-existing completions for the program since we will be handling all of them. # Remove any pre-existing completions for the program since we will be handling all of them.
complete -c podman-remote -e complete -c podman-remote -e

View File

@ -1,7 +1,7 @@
# fish completion for podman -*- shell-script -*- # fish completion for podman -*- shell-script -*-
function __podman_debug function __podman_debug
set file "$BASH_COMP_DEBUG_FILE" set -l file "$BASH_COMP_DEBUG_FILE"
if test -n "$file" if test -n "$file"
echo "$argv" >> $file echo "$argv" >> $file
end end
@ -10,32 +10,38 @@ end
function __podman_perform_completion function __podman_perform_completion
__podman_debug "Starting __podman_perform_completion" __podman_debug "Starting __podman_perform_completion"
set args (string split -- " " (string trim -l (commandline -c))) # Extract all args except the last one
set lastArg "$args[-1]" set -l args (commandline -opc)
# Extract the last arg and escape it in case it is a space
set -l lastArg (string escape -- (commandline -ct))
__podman_debug "args: $args" __podman_debug "args: $args"
__podman_debug "last arg: $lastArg" __podman_debug "last arg: $lastArg"
set emptyArg "" set -l requestComp "$args[1] __complete $args[2..-1] $lastArg"
if test -z "$lastArg"
__podman_debug "Setting emptyArg"
set emptyArg \"\"
end
__podman_debug "emptyArg: $emptyArg"
set requestComp "$args[1] __complete $args[2..-1] $emptyArg"
__podman_debug "Calling $requestComp" __podman_debug "Calling $requestComp"
set -l results (eval $requestComp 2> /dev/null)
# Call the command as a sub-shell so that we can redirect any errors # Some programs may output extra empty lines after the directive.
# For example, if $requestComp has an unmatched quote # Let's ignore them or else it will break completion.
# https://github.com/spf13/cobra/issues/1214 # Ref: https://github.com/spf13/cobra/issues/1279
set results (fish -c "$requestComp" 2> /dev/null) for line in $results[-1..1]
set comps $results[1..-2] if test (string trim -- $line) = ""
set directiveLine $results[-1] # Found an empty line, remove it
set results $results[1..-2]
else
# Found non-empty line, we have our proper output
break
end
end
set -l comps $results[1..-2]
set -l directiveLine $results[-1]
# For Fish, when completing a flag with an = (e.g., <program> -n=<TAB>) # For Fish, when completing a flag with an = (e.g., <program> -n=<TAB>)
# completions must be prefixed with the flag # completions must be prefixed with the flag
set flagPrefix (string match -r -- '-.*=' "$lastArg") set -l flagPrefix (string match -r -- '-.*=' "$lastArg")
__podman_debug "Comps: $comps" __podman_debug "Comps: $comps"
__podman_debug "DirectiveLine: $directiveLine" __podman_debug "DirectiveLine: $directiveLine"
@ -58,7 +64,7 @@ function __podman_prepare_completions
# Start fresh # Start fresh
set --erase __podman_comp_results set --erase __podman_comp_results
set results (__podman_perform_completion) set -l results (__podman_perform_completion)
__podman_debug "Completion results: $results" __podman_debug "Completion results: $results"
if test -z "$results" if test -z "$results"
@ -67,39 +73,39 @@ function __podman_prepare_completions
return 1 return 1
end end
set directive (string sub --start 2 $results[-1]) set -l directive (string sub --start 2 $results[-1])
set --global __podman_comp_results $results[1..-2] set --global __podman_comp_results $results[1..-2]
__podman_debug "Completions are: $__podman_comp_results" __podman_debug "Completions are: $__podman_comp_results"
__podman_debug "Directive is: $directive" __podman_debug "Directive is: $directive"
set shellCompDirectiveError 1 set -l shellCompDirectiveError 1
set shellCompDirectiveNoSpace 2 set -l shellCompDirectiveNoSpace 2
set shellCompDirectiveNoFileComp 4 set -l shellCompDirectiveNoFileComp 4
set shellCompDirectiveFilterFileExt 8 set -l shellCompDirectiveFilterFileExt 8
set shellCompDirectiveFilterDirs 16 set -l shellCompDirectiveFilterDirs 16
if test -z "$directive" if test -z "$directive"
set directive 0 set directive 0
end end
set compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2) set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2)
if test $compErr -eq 1 if test $compErr -eq 1
__podman_debug "Received error directive: aborting." __podman_debug "Received error directive: aborting."
# Might as well do file completion, in case it helps # Might as well do file completion, in case it helps
return 1 return 1
end end
set filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2)
set dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2)
if test $filefilter -eq 1; or test $dirfilter -eq 1 if test $filefilter -eq 1; or test $dirfilter -eq 1
__podman_debug "File extension filtering or directory filtering not supported" __podman_debug "File extension filtering or directory filtering not supported"
# Do full file completion instead # Do full file completion instead
return 1 return 1
end end
set nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2)
set nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2)
__podman_debug "nospace: $nospace, nofiles: $nofiles" __podman_debug "nospace: $nospace, nofiles: $nofiles"
@ -109,34 +115,34 @@ function __podman_prepare_completions
# may not already be filtered so as to allow fish to match on different # may not already be filtered so as to allow fish to match on different
# criteria than the prefix. # criteria than the prefix.
if test $nospace -ne 0; or test $nofiles -eq 0 if test $nospace -ne 0; or test $nofiles -eq 0
set prefix (commandline -t) set -l prefix (commandline -t | string escape --style=regex)
__podman_debug "prefix: $prefix" __podman_debug "prefix: $prefix"
set completions set -l completions (string match -r -- "^$prefix.*" $__podman_comp_results)
for comp in $__podman_comp_results
if test (string match -e -r -- "^$prefix" "$comp")
set -a completions $comp
end
end
set --global __podman_comp_results $completions set --global __podman_comp_results $completions
__podman_debug "Filtered completions are: $__podman_comp_results" __podman_debug "Filtered completions are: $__podman_comp_results"
# Important not to quote the variable for count to work # Important not to quote the variable for count to work
set numComps (count $__podman_comp_results) set -l numComps (count $__podman_comp_results)
__podman_debug "numComps: $numComps" __podman_debug "numComps: $numComps"
if test $numComps -eq 1; and test $nospace -ne 0 if test $numComps -eq 1; and test $nospace -ne 0
# To support the "nospace" directive we trick the shell # We must first split on \t to get rid of the descriptions to be
# by outputting an extra, longer completion. # able to check what the actual completion will be.
# We must first split on \t to get rid of the descriptions because # We don't need descriptions anyway since there is only a single
# the extra character we add to the fake second completion must be # real completion which the shell will expand immediately.
# before the description. We don't need descriptions anyway since set -l split (string split --max 1 \t $__podman_comp_results[1])
# there is only a single real completion which the shell will expand
# immediately. # Fish won't add a space if the completion ends with any
__podman_debug "Adding second completion to perform nospace directive" # of the following characters: @=/:.,
set split (string split --max 1 \t $__podman_comp_results[1]) set -l lastChar (string sub -s -1 -- $split)
set --global __podman_comp_results $split[1] $split[1]. if not string match -r -q "[@=/:.,]" -- "$lastChar"
__podman_debug "Completions are now: $__podman_comp_results" # In other cases, to support the "nospace" directive we trick the shell
# by outputting an extra, longer completion.
__podman_debug "Adding second completion to perform nospace directive"
set --global __podman_comp_results $split[1] $split[1].
__podman_debug "Completions are now: $__podman_comp_results"
end
end end
if test $numComps -eq 0; and test $nofiles -eq 0 if test $numComps -eq 0; and test $nofiles -eq 0
@ -152,10 +158,14 @@ end
# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves # Since Fish completions are only loaded once the user triggers them, we trigger them ourselves
# so we can properly delete any completions provided by another script. # so we can properly delete any completions provided by another script.
# The space after the program name is essential to trigger completion for the program # Only do this if the program can be found, or else fish may print some errors; besides,
# and not completion of the program name itself. # the existing completions will only be loaded if the program can be found.
complete --do-complete "podman " > /dev/null 2>&1 if type -q "podman"
# Using '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. # The space after the program name is essential to trigger completion for the program
# and not completion of the program name itself.
# Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.
complete --do-complete "podman " > /dev/null 2>&1
end
# Remove any pre-existing completions for the program since we will be handling all of them. # Remove any pre-existing completions for the program since we will be handling all of them.
complete -c podman -e complete -c podman -e

View File

@ -123,19 +123,6 @@ Register-ArgumentCompleter -CommandName 'podman-remote' -ScriptBlock {
$Space = "" $Space = ""
} }
if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) {
__podman-remote_debug "ShellCompDirectiveNoFileComp is called"
if ($Values.Length -eq 0) {
# Just print an empty string here so the
# shell does not start to complete paths.
# We cannot use CompletionResult here because
# it does not accept an empty string as argument.
""
return
}
}
if ((($Directive -band $ShellCompDirectiveFilterFileExt) -ne 0 ) -or if ((($Directive -band $ShellCompDirectiveFilterFileExt) -ne 0 ) -or
(($Directive -band $ShellCompDirectiveFilterDirs) -ne 0 )) { (($Directive -band $ShellCompDirectiveFilterDirs) -ne 0 )) {
__podman-remote_debug "ShellCompDirectiveFilterFileExt ShellCompDirectiveFilterDirs are not supported" __podman-remote_debug "ShellCompDirectiveFilterFileExt ShellCompDirectiveFilterDirs are not supported"
@ -148,13 +135,26 @@ Register-ArgumentCompleter -CommandName 'podman-remote' -ScriptBlock {
# filter the result # filter the result
$_.Name -like "$WordToComplete*" $_.Name -like "$WordToComplete*"
# Join the flag back if we have a equal sign flag # Join the flag back if we have an equal sign flag
if ( $IsEqualFlag ) { if ( $IsEqualFlag ) {
__podman-remote_debug "Join the equal sign flag back to the completion value" __podman-remote_debug "Join the equal sign flag back to the completion value"
$_.Name = $Flag + "=" + $_.Name $_.Name = $Flag + "=" + $_.Name
} }
} }
if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) {
__podman-remote_debug "ShellCompDirectiveNoFileComp is called"
if ($Values.Length -eq 0) {
# Just print an empty string here so the
# shell does not start to complete paths.
# We cannot use CompletionResult here because
# it does not accept an empty string as argument.
""
return
}
}
# Get the current mode # Get the current mode
$Mode = (Get-PSReadLineKeyHandler | Where-Object {$_.Key -eq "Tab" }).Function $Mode = (Get-PSReadLineKeyHandler | Where-Object {$_.Key -eq "Tab" }).Function
__podman-remote_debug "Mode: $Mode" __podman-remote_debug "Mode: $Mode"
@ -216,7 +216,7 @@ Register-ArgumentCompleter -CommandName 'podman-remote' -ScriptBlock {
Default { Default {
# Like MenuComplete but we don't want to add a space here because # Like MenuComplete but we don't want to add a space here because
# the user need to press space anyway to get the completion. # the user need to press space anyway to get the completion.
# Description will not be shown because that's not possible with TabCompleteNext # Description will not be shown because thats not possible with TabCompleteNext
[System.Management.Automation.CompletionResult]::new($($comp.Name | __podman-remote_escapeStringWithSpecialChars), "$($comp.Name)", 'ParameterValue', "$($comp.Description)") [System.Management.Automation.CompletionResult]::new($($comp.Name | __podman-remote_escapeStringWithSpecialChars), "$($comp.Name)", 'ParameterValue', "$($comp.Description)")
} }
} }

View File

@ -123,19 +123,6 @@ Register-ArgumentCompleter -CommandName 'podman' -ScriptBlock {
$Space = "" $Space = ""
} }
if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) {
__podman_debug "ShellCompDirectiveNoFileComp is called"
if ($Values.Length -eq 0) {
# Just print an empty string here so the
# shell does not start to complete paths.
# We cannot use CompletionResult here because
# it does not accept an empty string as argument.
""
return
}
}
if ((($Directive -band $ShellCompDirectiveFilterFileExt) -ne 0 ) -or if ((($Directive -band $ShellCompDirectiveFilterFileExt) -ne 0 ) -or
(($Directive -band $ShellCompDirectiveFilterDirs) -ne 0 )) { (($Directive -band $ShellCompDirectiveFilterDirs) -ne 0 )) {
__podman_debug "ShellCompDirectiveFilterFileExt ShellCompDirectiveFilterDirs are not supported" __podman_debug "ShellCompDirectiveFilterFileExt ShellCompDirectiveFilterDirs are not supported"
@ -148,13 +135,26 @@ Register-ArgumentCompleter -CommandName 'podman' -ScriptBlock {
# filter the result # filter the result
$_.Name -like "$WordToComplete*" $_.Name -like "$WordToComplete*"
# Join the flag back if we have a equal sign flag # Join the flag back if we have an equal sign flag
if ( $IsEqualFlag ) { if ( $IsEqualFlag ) {
__podman_debug "Join the equal sign flag back to the completion value" __podman_debug "Join the equal sign flag back to the completion value"
$_.Name = $Flag + "=" + $_.Name $_.Name = $Flag + "=" + $_.Name
} }
} }
if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) {
__podman_debug "ShellCompDirectiveNoFileComp is called"
if ($Values.Length -eq 0) {
# Just print an empty string here so the
# shell does not start to complete paths.
# We cannot use CompletionResult here because
# it does not accept an empty string as argument.
""
return
}
}
# Get the current mode # Get the current mode
$Mode = (Get-PSReadLineKeyHandler | Where-Object {$_.Key -eq "Tab" }).Function $Mode = (Get-PSReadLineKeyHandler | Where-Object {$_.Key -eq "Tab" }).Function
__podman_debug "Mode: $Mode" __podman_debug "Mode: $Mode"
@ -216,7 +216,7 @@ Register-ArgumentCompleter -CommandName 'podman' -ScriptBlock {
Default { Default {
# Like MenuComplete but we don't want to add a space here because # Like MenuComplete but we don't want to add a space here because
# the user need to press space anyway to get the completion. # the user need to press space anyway to get the completion.
# Description will not be shown because that's not possible with TabCompleteNext # Description will not be shown because thats not possible with TabCompleteNext
[System.Management.Automation.CompletionResult]::new($($comp.Name | __podman_escapeStringWithSpecialChars), "$($comp.Name)", 'ParameterValue', "$($comp.Description)") [System.Management.Automation.CompletionResult]::new($($comp.Name | __podman_escapeStringWithSpecialChars), "$($comp.Name)", 'ParameterValue', "$($comp.Description)")
} }
} }

View File

@ -17,8 +17,6 @@ _podman()
local shellCompDirectiveNoFileComp=4 local shellCompDirectiveNoFileComp=4
local shellCompDirectiveFilterFileExt=8 local shellCompDirectiveFilterFileExt=8
local shellCompDirectiveFilterDirs=16 local shellCompDirectiveFilterDirs=16
local shellCompDirectiveLegacyCustomComp=32
local shellCompDirectiveLegacyCustomArgsComp=64
local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace
local -a completions local -a completions

View File

@ -17,8 +17,6 @@ _podman-remote()
local shellCompDirectiveNoFileComp=4 local shellCompDirectiveNoFileComp=4
local shellCompDirectiveFilterFileExt=8 local shellCompDirectiveFilterFileExt=8
local shellCompDirectiveFilterDirs=16 local shellCompDirectiveFilterDirs=16
local shellCompDirectiveLegacyCustomComp=32
local shellCompDirectiveLegacyCustomArgsComp=64
local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace
local -a completions local -a completions

View File

@ -196,6 +196,8 @@ function _run_consistency() {
SUGGESTION="run 'make vendor' and commit all changes" ./hack/tree_status.sh SUGGESTION="run 'make vendor' and commit all changes" ./hack/tree_status.sh
make generate-bindings make generate-bindings
SUGGESTION="run 'make generate-bindings' and commit all changes" ./hack/tree_status.sh SUGGESTION="run 'make generate-bindings' and commit all changes" ./hack/tree_status.sh
make completions
SUGGESTION="run 'make completions' and commit all changes" ./hack/tree_status.sh
} }
function _run_build() { function _run_build() {