Something went wrong. Try again.
forked from tailscale/tailscale
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334# Copyright 2013-2023 The Cobra Authors## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.
# bash completion V2 for %-36[1]s -*- shell-script -*-
__%[1]s_debug(){if [[ -n ${BASH_COMP_DEBUG_FILE-} ]]; thenecho "$*" >> "${BASH_COMP_DEBUG_FILE}"fi}
# Macs have bash3 for which the bash-completion package doesn't include# _init_completion. This is a minimal version of that function.__%[1]s_init_completion(){COMPREPLY=()_get_comp_words_by_ref "$@" cur prev words cword}
# This function calls the %[1]s program to obtain the completion# results and the directive. It fills the 'out' and 'directive' vars.__%[1]s_get_completion_results() {local requestComp lastParam lastChar args
# Prepare the command to request completions for the program.# Calling ${words[0]} instead of directly %[1]s allows handling aliasesargs=("${words[@]:1}")requestComp="${words[0]} %[2]s ${args[*]}"
lastParam=${words[$((${#words[@]}-1))]}lastChar=${lastParam:$((${#lastParam}-1)):1}__%[1]s_debug "lastParam ${lastParam}, lastChar ${lastChar}"
if [[ -z ${cur} && ${lastChar} != = ]]; then# 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.__%[1]s_debug "Adding extra empty parameter"requestComp="${requestComp} ''"fi
# When completing a flag with an = (e.g., %[1]s -n=<TAB>)# bash focuses on the part after the =, so we need to remove# the flag part from $curif [[ ${cur} == -*=* ]]; thencur="${cur#*=}"fi
__%[1]s_debug "Calling ${requestComp}"# Use eval to handle any environment variables and suchout=$(eval "${requestComp}" 2>/dev/null)
# Extract the directive integer at the very end of the output following a colon (:)directive=${out##*:}# Remove the directiveout=${out%%:*}if [[ ${directive} == "${out}" ]]; then# There is not directive specifieddirective=0fi__%[1]s_debug "The completion directive is: ${directive}"__%[1]s_debug "The completions are: ${out}"}
__%[1]s_process_completion_results() {local shellCompDirectiveError=%[3]dlocal shellCompDirectiveNoSpace=%[4]dlocal shellCompDirectiveNoFileComp=%[5]dlocal shellCompDirectiveFilterFileExt=%[6]dlocal shellCompDirectiveFilterDirs=%[7]dlocal shellCompDirectiveKeepOrder=%[8]d
if (((directive & shellCompDirectiveError) != 0)); then# Error code. No completion.__%[1]s_debug "Received error from custom completion go code"returnelseif (((directive & shellCompDirectiveNoSpace) != 0)); then if [[ $(type -t compopt) == builtin ]]; then __%[1]s_debug "Activating no space" compopt -o nospace else __%[1]s_debug "No space directive not supported in this version of bash" fifiif (((directive & shellCompDirectiveKeepOrder) != 0)); then if [[ $(type -t compopt) == builtin ]]; then # no sort isn't supported for bash less than < 4.4 if [[ ${BASH_VERSINFO[0]} -lt 4 || ( ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 4 ) ]]; then __%[1]s_debug "No sort directive not supported in this version of bash" else __%[1]s_debug "Activating keep order" compopt -o nosort fi else __%[1]s_debug "No sort directive not supported in this version of bash" fifiif (((directive & shellCompDirectiveNoFileComp) != 0)); then if [[ $(type -t compopt) == builtin ]]; then __%[1]s_debug "Activating no file completion" compopt +o default else __%[1]s_debug "No file completion directive not supported in this version of bash" fififi
# Separate activeHelp from normal completionslocal completions=()while IFS='' read -r comp; do completions+=("$comp")done <<<"${out}"
if (((directive & shellCompDirectiveFilterFileExt) != 0)); then# File extension filteringlocal fullFilter filter filteringCmd
# Do not use quotes around the $completions variable or else newline# characters will be kept.for filter in ${completions[*]}; do fullFilter+="$filter|"done
filteringCmd="_filedir $fullFilter"__%[1]s_debug "File filtering command: $filteringCmd"$filteringCmdelif (((directive & shellCompDirectiveFilterDirs) != 0)); then# File completion for directories only
local subdirsubdir=${completions[0]}if [[ -n $subdir ]]; then __%[1]s_debug "Listing directories in $subdir" pushd "$subdir" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || returnelse __%[1]s_debug "Listing directories in ." _filedir -dfielse__%[1]s_handle_completion_typesfi
__%[1]s_handle_special_char "$cur" :__%[1]s_handle_special_char "$cur" =
# Print the activeHelp statements before we finishif ((${#activeHelp[*]} != 0)); thenprintf "\n";printf "%%s\n" "${activeHelp[@]}"printf "\n"
# The prompt format is only available from bash 4.4.# We test if it is available before using it.if (x=${PS1@P}) 2> /dev/null; then printf "%%s" "${PS1@P}${COMP_LINE[@]}"else # Can't print the prompt. Just print the # text the user had typed, it is workable enough. printf "%%s" "${COMP_LINE[@]}"fifi}
__%[1]s_handle_completion_types() {__%[1]s_debug "__%[1]s_handle_completion_types: COMP_TYPE is $COMP_TYPE"
case $COMP_TYPE in37|42)# Type: menu-complete/menu-complete-backward and insert-completions# If the user requested inserting one completion at a time, or all# completions at once on the command-line we must remove the descriptions.# https://github.com/spf13/cobra/issues/1508local tab=$'\t' compwhile IFS='' read -r comp; do [[ -z $comp ]] && continue # Strip any description comp=${comp%%%%$tab*} # Only consider the completions that match if [[ $comp == "$cur"* ]]; then COMPREPLY+=("$comp") fidone < <(printf "%%s\n" "${completions[@]}");;
*)# Type: complete (normal completion)__%[1]s_handle_standard_completion_case;;esac}
__%[1]s_handle_standard_completion_case() {local tab=$'\t' comp
# Short circuit to optimize if we don't have descriptionsif [[ "${completions[*]}" != *$tab* ]]; thenIFS=$'\n' read -ra COMPREPLY -d '' < <(compgen -W "${completions[*]}" -- "$cur")return 0fi
local longest=0local compline# Look for the longest completion so that we can format things nicelywhile IFS='' read -r compline; do[[ -z $compline ]] && continue# Strip any description before checking the lengthcomp=${compline%%%%$tab*}# Only consider the completions that match[[ $comp == "$cur"* ]] || continueCOMPREPLY+=("$compline")if ((${#comp}>longest)); then longest=${#comp}fidone < <(printf "%%s\n" "${completions[@]}")
# If there is a single completion left, remove the description textif ((${#COMPREPLY[*]} == 1)); then__%[1]s_debug "COMPREPLY[0]: ${COMPREPLY[0]}"comp="${COMPREPLY[0]%%%%$tab*}"__%[1]s_debug "Removed description from single completion, which is now: ${comp}"COMPREPLY[0]=$compelse # Format the descriptions__%[1]s_format_comp_descriptions $longestfi}
__%[1]s_handle_special_char(){local comp="$1"local char=$2if [[ "$comp" == *${char}* && "$COMP_WORDBREAKS" == *${char}* ]]; thenlocal word=${comp%%"${comp##*${char}}"}local idx=${#COMPREPLY[*]}while ((--idx >= 0)); do COMPREPLY[idx]=${COMPREPLY[idx]#"$word"}donefi}
__%[1]s_format_comp_descriptions(){local tab=$'\t'local comp desc maxdesclengthlocal longest=$1
local i cifor ci in ${!COMPREPLY[*]}; docomp=${COMPREPLY[ci]}# Properly format the description string which follows a tab character if there is oneif [[ "$comp" == *$tab* ]]; then __%[1]s_debug "Original comp: $comp" desc=${comp#*$tab} comp=${comp%%%%$tab*}
# $COLUMNS stores the current shell width. # Remove an extra 4 because we add 2 spaces and 2 parentheses. maxdesclength=$(( COLUMNS - longest - 4 ))
# Make sure we can fit a description of at least 8 characters # if we are to align the descriptions. if ((maxdesclength > 8)); then # Add the proper number of spaces to align the descriptions for ((i = ${#comp} ; i < longest ; i++)); do comp+=" " done else # Don't pad the descriptions so we can fit more text after the completion maxdesclength=$(( COLUMNS - ${#comp} - 4 )) fi
# If there is enough space for any description text, # truncate the descriptions that are too long for the shell width if ((maxdesclength > 0)); then if ((${#desc} > maxdesclength)); then desc=${desc:0:$(( maxdesclength - 1 ))} desc+="…" fi comp+=" ($desc)" fi COMPREPLY[ci]=$comp __%[1]s_debug "Final comp: $comp"fidone}
__start_%[1]s(){local cur prev words cword split
COMPREPLY=()
# Call _init_completion from the bash-completion package# to prepare the arguments properlyif declare -F _init_completion >/dev/null 2>&1; then_init_completion -n =: || returnelse__%[1]s_init_completion -n =: || returnfi
__%[1]s_debug__%[1]s_debug "========= starting completion logic =========="__%[1]s_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}")__%[1]s_debug "Truncated words[*]: ${words[*]},"
local out directive__%[1]s_get_completion_results__%[1]s_process_completion_results}
if [[ $(type -t compopt) = "builtin" ]]; thencomplete -o default -F __start_%[1]s %[1]selsecomplete -o default -o nospace -F __start_%[1]s %[1]sfi
# ex: ts=4 sw=4 et filetype=sh