From 9ed515fd546a6ed5e82b2b87d12f0241727d3f89 Mon Sep 17 00:00:00 2001 From: Michael Muré Date: Tue, 15 Feb 2022 19:57:26 +0100 Subject: update gqlgen --- misc/bash_completion/git-bug | 47 ++++++---- misc/fish_completion/git-bug | 178 ++++++++++++++++++++----------------- misc/powershell_completion/git-bug | 38 ++++---- misc/zsh_completion/git-bug | 54 +++++++---- 4 files changed, 178 insertions(+), 139 deletions(-) (limited to 'misc') diff --git a/misc/bash_completion/git-bug b/misc/bash_completion/git-bug index 8b303991..2320c1c0 100644 --- a/misc/bash_completion/git-bug +++ b/misc/bash_completion/git-bug @@ -2,7 +2,7 @@ __git-bug_debug() { - if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then + if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then echo "$*" >> "${BASH_COMP_DEBUG_FILE}" fi } @@ -112,7 +112,7 @@ __git-bug_handle_go_custom_completion() $filteringCmd elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then # File completion for directories only - local subDir + local subdir # Use printf to strip any trailing newline subdir=$(printf "%s" "${out[0]}") if [ -n "$subdir" ]; then @@ -165,13 +165,19 @@ __git-bug_handle_reply() PREFIX="" cur="${cur#*=}" ${flags_completion[${index}]} - if [ -n "${ZSH_VERSION}" ]; then + if [ -n "${ZSH_VERSION:-}" ]; then # zsh completion needs --flag= prefix eval "COMPREPLY=( \"\${COMPREPLY[@]/#/${flag}=}\" )" fi fi fi - return 0; + + if [[ -z "${flag_parsing_disabled}" ]]; then + # If flag parsing is enabled, we have completed the flags and can return. + # If flag parsing is disabled, we may not know all (or any) of the flags, so we fallthrough + # to possibly call handle_go_custom_completion. + return 0; + fi ;; esac @@ -210,13 +216,13 @@ __git-bug_handle_reply() fi if [[ ${#COMPREPLY[@]} -eq 0 ]]; then - if declare -F __git-bug_custom_func >/dev/null; then - # try command name qualified custom func - __git-bug_custom_func - else - # otherwise fall back to unqualified for compatibility - declare -F __custom_func >/dev/null && __custom_func - fi + if declare -F __git-bug_custom_func >/dev/null; then + # try command name qualified custom func + __git-bug_custom_func + else + # otherwise fall back to unqualified for compatibility + declare -F __custom_func >/dev/null && __custom_func + fi fi # available in bash-completion >= 2, not always present on macOS @@ -250,7 +256,7 @@ __git-bug_handle_flag() # if a command required a flag, and we found it, unset must_have_one_flag() local flagname=${words[c]} - local flagvalue + local flagvalue="" # if the word contained an = if [[ ${words[c]} == *"="* ]]; then flagvalue=${flagname#*=} # take in as flagvalue after the = @@ -269,7 +275,7 @@ __git-bug_handle_flag() # keep flag value with flagname as flaghash # flaghash variable is an associative array which is only supported in bash > 3. - if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then + if [[ -z "${BASH_VERSION:-}" || "${BASH_VERSINFO[0]:-}" -gt 3 ]]; then if [ -n "${flagvalue}" ] ; then flaghash[${flagname}]=${flagvalue} elif [ -n "${words[ $((c+1)) ]}" ] ; then @@ -281,7 +287,7 @@ __git-bug_handle_flag() # skip the argument to a two word flag if [[ ${words[c]} != *"="* ]] && __git-bug_contains_word "${words[c]}" "${two_word_flags[@]}"; then - __git-bug_debug "${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument" + __git-bug_debug "${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument" c=$((c+1)) # if we are looking for a flags value, don't show commands if [[ $c -eq $cword ]]; then @@ -341,7 +347,7 @@ __git-bug_handle_word() __git-bug_handle_command elif __git-bug_contains_word "${words[c]}" "${command_aliases[@]}"; then # aliashash variable is an associative array which is only supported in bash > 3. - if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then + if [[ -z "${BASH_VERSION:-}" || "${BASH_VERSINFO[0]:-}" -gt 3 ]]; then words[c]=${aliashash[${words[c]}]} __git-bug_handle_command else @@ -1445,7 +1451,7 @@ _git-bug_root_command() commands+=("show") commands+=("status") commands+=("termui") - if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then + if [[ -z "${BASH_VERSION:-}" || "${BASH_VERSINFO[0]:-}" -gt 3 ]]; then command_aliases+=("tui") aliashash["tui"]="termui" fi @@ -1468,7 +1474,7 @@ _git-bug_root_command() __start_git-bug() { - local cur prev words cword + local cur prev words cword split declare -A flaghash 2>/dev/null || : declare -A aliashash 2>/dev/null || : if declare -F _init_completion >/dev/null 2>&1; then @@ -1478,17 +1484,20 @@ __start_git-bug() fi local c=0 + local flag_parsing_disabled= local flags=() local two_word_flags=() local local_nonpersistent_flags=() local flags_with_completion=() local flags_completion=() local commands=("git-bug") + local command_aliases=() local must_have_one_flag=() local must_have_one_noun=() - local has_completion_function - local last_command + local has_completion_function="" + local last_command="" local nouns=() + local noun_aliases=() __git-bug_handle_word } diff --git a/misc/fish_completion/git-bug b/misc/fish_completion/git-bug index 28e66532..a3c2d008 100644 --- a/misc/fish_completion/git-bug +++ b/misc/fish_completion/git-bug @@ -1,44 +1,47 @@ # fish completion for git-bug -*- shell-script -*- function __git_bug_debug - set file "$BASH_COMP_DEBUG_FILE" + set -l file "$BASH_COMP_DEBUG_FILE" if test -n "$file" echo "$argv" >> $file end end function __git_bug_perform_completion - __git_bug_debug "Starting __git_bug_perform_completion with: $argv" + __git_bug_debug "Starting __git_bug_perform_completion" - set args (string split -- " " "$argv") - set lastArg "$args[-1]" + # Extract all args except the last one + 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)) __git_bug_debug "args: $args" __git_bug_debug "last arg: $lastArg" - set emptyArg "" - if test -z "$lastArg" - __git_bug_debug "Setting emptyArg" - set emptyArg \"\" - end - __git_bug_debug "emptyArg: $emptyArg" - - if not type -q "$args[1]" - # This can happen when "complete --do-complete git-bug" is called when running this script. - __git_bug_debug "Cannot find $args[1]. No completions." - return - end + set -l requestComp "$args[1] __complete $args[2..-1] $lastArg" - set requestComp "$args[1] __complete $args[2..-1] $emptyArg" __git_bug_debug "Calling $requestComp" + set -l results (eval $requestComp 2> /dev/null) + + # Some programs may output extra empty lines after the directive. + # Let's ignore them or else it will break completion. + # Ref: https://github.com/spf13/cobra/issues/1279 + for line in $results[-1..1] + if test (string trim -- $line) = "" + # 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 results (eval $requestComp 2> /dev/null) - set comps $results[1..-2] - set directiveLine $results[-1] + set -l comps $results[1..-2] + set -l directiveLine $results[-1] # For Fish, when completing a flag with an = (e.g., -n=) # completions must be prefixed with the flag - set flagPrefix (string match -r -- '-.*=' "$lastArg") + set -l flagPrefix (string match -r -- '-.*=' "$lastArg") __git_bug_debug "Comps: $comps" __git_bug_debug "DirectiveLine: $directiveLine" @@ -51,114 +54,123 @@ function __git_bug_perform_completion printf "%s\n" "$directiveLine" end -# This function does three things: -# 1- Obtain the completions and store them in the global __git_bug_comp_results -# 2- Set the __git_bug_comp_do_file_comp flag if file completion should be performed -# and unset it otherwise -# 3- Return true if the completion results are not empty +# This function does two things: +# - Obtain the completions and store them in the global __git_bug_comp_results +# - Return false if file completion should be performed function __git_bug_prepare_completions + __git_bug_debug "" + __git_bug_debug "========= starting completion logic ==========" + # Start fresh - set --erase __git_bug_comp_do_file_comp set --erase __git_bug_comp_results - # Check if the command-line is already provided. This is useful for testing. - if not set --query __git_bug_comp_commandLine - # Use the -c flag to allow for completion in the middle of the line - set __git_bug_comp_commandLine (commandline -c) - end - __git_bug_debug "commandLine is: $__git_bug_comp_commandLine" - - set results (__git_bug_perform_completion "$__git_bug_comp_commandLine") - set --erase __git_bug_comp_commandLine + set -l results (__git_bug_perform_completion) __git_bug_debug "Completion results: $results" if test -z "$results" __git_bug_debug "No completion, probably due to a failure" # Might as well do file completion, in case it helps - set --global __git_bug_comp_do_file_comp 1 return 1 end - set directive (string sub --start 2 $results[-1]) + set -l directive (string sub --start 2 $results[-1]) set --global __git_bug_comp_results $results[1..-2] __git_bug_debug "Completions are: $__git_bug_comp_results" __git_bug_debug "Directive is: $directive" - set shellCompDirectiveError 1 - set shellCompDirectiveNoSpace 2 - set shellCompDirectiveNoFileComp 4 - set shellCompDirectiveFilterFileExt 8 - set shellCompDirectiveFilterDirs 16 + set -l shellCompDirectiveError 1 + set -l shellCompDirectiveNoSpace 2 + set -l shellCompDirectiveNoFileComp 4 + set -l shellCompDirectiveFilterFileExt 8 + set -l shellCompDirectiveFilterDirs 16 if test -z "$directive" set directive 0 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 __git_bug_debug "Received error directive: aborting." # Might as well do file completion, in case it helps - set --global __git_bug_comp_do_file_comp 1 return 1 end - set filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) - set dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) + set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) + set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) if test $filefilter -eq 1; or test $dirfilter -eq 1 __git_bug_debug "File extension filtering or directory filtering not supported" # Do full file completion instead - set --global __git_bug_comp_do_file_comp 1 return 1 end - set nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) - set nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) + set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) + set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) __git_bug_debug "nospace: $nospace, nofiles: $nofiles" - # Important not to quote the variable for count to work - set numComps (count $__git_bug_comp_results) - __git_bug_debug "numComps: $numComps" - - if test $numComps -eq 1; and test $nospace -ne 0 - # To support the "nospace" directive we trick the shell - # by outputting an extra, longer completion. - __git_bug_debug "Adding second completion to perform nospace directive" - set --append __git_bug_comp_results $__git_bug_comp_results[1]. - end - - if test $numComps -eq 0; and test $nofiles -eq 0 - __git_bug_debug "Requesting file completion" - set --global __git_bug_comp_do_file_comp 1 + # If we want to prevent a space, or if file completion is NOT disabled, + # we need to count the number of valid completions. + # To do so, we will filter on prefix as the completions we have received + # may not already be filtered so as to allow fish to match on different + # criteria than the prefix. + if test $nospace -ne 0; or test $nofiles -eq 0 + set -l prefix (commandline -t | string escape --style=regex) + __git_bug_debug "prefix: $prefix" + + set -l completions (string match -r -- "^$prefix.*" $__git_bug_comp_results) + set --global __git_bug_comp_results $completions + __git_bug_debug "Filtered completions are: $__git_bug_comp_results" + + # Important not to quote the variable for count to work + set -l numComps (count $__git_bug_comp_results) + __git_bug_debug "numComps: $numComps" + + if test $numComps -eq 1; and test $nospace -ne 0 + # We must first split on \t to get rid of the descriptions to be + # able to check what the actual completion will be. + # We don't need descriptions anyway since there is only a single + # real completion which the shell will expand immediately. + set -l split (string split --max 1 \t $__git_bug_comp_results[1]) + + # Fish won't add a space if the completion ends with any + # of the following characters: @=/:., + set -l lastChar (string sub -s -1 -- $split) + if not string match -r -q "[@=/:.,]" -- "$lastChar" + # In other cases, to support the "nospace" directive we trick the shell + # by outputting an extra, longer completion. + __git_bug_debug "Adding second completion to perform nospace directive" + set --global __git_bug_comp_results $split[1] $split[1]. + __git_bug_debug "Completions are now: $__git_bug_comp_results" + end + end + + if test $numComps -eq 0; and test $nofiles -eq 0 + # To be consistent with bash and zsh, we only trigger file + # completion when there are no other completions + __git_bug_debug "Requesting file completion" + return 1 + end end - # If we don't want file completion, we must return true even if there - # are no completions found. This is because fish will perform the last - # completion command, even if its condition is false, if no other - # completion command was triggered - return (not set --query __git_bug_comp_do_file_comp) + return 0 end # 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. -# The space after the the program name is essential to trigger completion for the program -# and not completion of the program name itself. -complete --do-complete "git-bug " > /dev/null 2>&1 -# Using '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. +# Only do this if the program can be found, or else fish may print some errors; besides, +# the existing completions will only be loaded if the program can be found. +if type -q "git-bug" + # 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 "git-bug " > /dev/null 2>&1 +end # Remove any pre-existing completions for the program since we will be handling all of them. complete -c git-bug -e -# The order in which the below two lines are defined is very important so that __git_bug_prepare_completions -# is called first. It is __git_bug_prepare_completions that sets up the __git_bug_comp_do_file_comp variable. -# -# This completion will be run second as complete commands are added FILO. -# It triggers file completion choices when __git_bug_comp_do_file_comp is set. -complete -c git-bug -n 'set --query __git_bug_comp_do_file_comp' - -# This completion will be run first as complete commands are added FILO. -# The call to __git_bug_prepare_completions will setup both __git_bug_comp_results and __git_bug_comp_do_file_comp. -# It provides the program's completion choices. +# The call to __git_bug_prepare_completions will setup __git_bug_comp_results +# which provides the program's completion choices. complete -c git-bug -n '__git_bug_prepare_completions' -f -a '$__git_bug_comp_results' diff --git a/misc/powershell_completion/git-bug b/misc/powershell_completion/git-bug index a5bc9fdf..b8280eea 100644 --- a/misc/powershell_completion/git-bug +++ b/misc/powershell_completion/git-bug @@ -33,7 +33,7 @@ Register-ArgumentCompleter -CommandName 'git-bug' -ScriptBlock { if ($Command.Length -gt $CursorPosition) { $Command=$Command.Substring(0,$CursorPosition) } - __git-bug_debug "Truncated command: $Command" + __git-bug_debug "Truncated command: $Command" $ShellCompDirectiveError=1 $ShellCompDirectiveNoSpace=2 @@ -41,7 +41,7 @@ Register-ArgumentCompleter -CommandName 'git-bug' -ScriptBlock { $ShellCompDirectiveFilterFileExt=8 $ShellCompDirectiveFilterDirs=16 - # Prepare the command to request completions for the program. + # Prepare the command to request completions for the program. # Split the command at the first space to separate the program and arguments. $Program,$Arguments = $Command.Split(" ",2) $RequestComp="$Program __completeNoDesc $Arguments" @@ -69,7 +69,7 @@ Register-ArgumentCompleter -CommandName 'git-bug' -ScriptBlock { # We add an extra empty parameter so we can indicate this to the go method. __git-bug_debug "Adding extra empty parameter" # We need to use `"`" to pass an empty argument a "" or '' does not work!!! - $RequestComp="$RequestComp" + ' `"`"' + $RequestComp="$RequestComp" + ' `"`"' } __git-bug_debug "Calling $RequestComp" @@ -123,19 +123,6 @@ Register-ArgumentCompleter -CommandName 'git-bug' -ScriptBlock { $Space = "" } - if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) { - __git-bug_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 (($Directive -band $ShellCompDirectiveFilterDirs) -ne 0 )) { __git-bug_debug "ShellCompDirectiveFilterFileExt ShellCompDirectiveFilterDirs are not supported" @@ -148,20 +135,33 @@ Register-ArgumentCompleter -CommandName 'git-bug' -ScriptBlock { # filter the result $_.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 ) { __git-bug_debug "Join the equal sign flag back to the completion value" $_.Name = $Flag + "=" + $_.Name } } + if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) { + __git-bug_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 $Mode = (Get-PSReadLineKeyHandler | Where-Object {$_.Key -eq "Tab" }).Function __git-bug_debug "Mode: $Mode" $Values | ForEach-Object { - # store temporay because switch will overwrite $_ + # store temporary because switch will overwrite $_ $comp = $_ # PowerShell supports three different completion modes @@ -216,7 +216,7 @@ Register-ArgumentCompleter -CommandName 'git-bug' -ScriptBlock { Default { # Like MenuComplete but we don't want to add a space here because # the user need to press space anyway to get the completion. - # Description will not be shown because thats not possible with TabCompleteNext + # Description will not be shown because that's not possible with TabCompleteNext [System.Management.Automation.CompletionResult]::new($($comp.Name | __git-bug_escapeStringWithSpecialChars), "$($comp.Name)", 'ParameterValue', "$($comp.Description)") } } diff --git a/misc/zsh_completion/git-bug b/misc/zsh_completion/git-bug index e0a6d8a1..e7cbe9a9 100644 --- a/misc/zsh_completion/git-bug +++ b/misc/zsh_completion/git-bug @@ -18,7 +18,7 @@ _git-bug() local shellCompDirectiveFilterFileExt=8 local shellCompDirectiveFilterDirs=16 - local lastParam lastChar flagPrefix requestComp out directive compCount comp lastComp + local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace local -a completions __git-bug_debug "\n========= starting completion logic ==========" @@ -86,7 +86,6 @@ _git-bug() return fi - compCount=0 while IFS='\n' read -r comp; do if [ -n "$comp" ]; then # If requested, completions are returned with a description. @@ -98,13 +97,17 @@ _git-bug() local tab=$(printf '\t') comp=${comp//$tab/:} - ((compCount++)) __git-bug_debug "Adding completion: ${comp}" completions+=${comp} lastComp=$comp fi done < <(printf "%s\n" "${out[@]}") + if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then + __git-bug_debug "Activating nospace." + noSpace="-S ''" + fi + if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then # File extension filtering local filteringCmd @@ -122,7 +125,7 @@ _git-bug() _arguments '*:filename:'"$filteringCmd" elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then # File completion for directories only - local subDir + local subdir subdir="${completions[1]}" if [ -n "$subdir" ]; then __git-bug_debug "Listing directories in $subdir" @@ -131,29 +134,44 @@ _git-bug() __git-bug_debug "Listing directories in ." fi + local result _arguments '*:dirname:_files -/'" ${flagPrefix}" + result=$? if [ -n "$subdir" ]; then popd >/dev/null 2>&1 fi - elif [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ] && [ ${compCount} -eq 1 ]; then - __git-bug_debug "Activating nospace." - # We can use compadd here as there is no description when - # there is only one completion. - compadd -S '' "${lastComp}" - elif [ ${compCount} -eq 0 ]; then - if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then - __git-bug_debug "deactivating file completion" + return $result + else + __git-bug_debug "Calling _describe" + if eval _describe "completions" completions $flagPrefix $noSpace; then + __git-bug_debug "_describe found some completions" + + # Return the success of having called _describe + return 0 else - # Perform file completion - __git-bug_debug "activating file completion" - _arguments '*:filename:_files'" ${flagPrefix}" + __git-bug_debug "_describe did not find completions." + __git-bug_debug "Checking if we should do file completion." + if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then + __git-bug_debug "deactivating file completion" + + # We must return an error code here to let zsh know that there were no + # completions found by _describe; this is what will trigger other + # matching algorithms to attempt to find completions. + # For example zsh can match letters in the middle of words. + return 1 + else + # Perform file completion + __git-bug_debug "Activating file completion" + + # We must return the result of this command, so it must be the + # last command, or else we must store its result to return it. + _arguments '*:filename:_files'" ${flagPrefix}" + fi fi - else - _describe "completions" completions $(echo $flagPrefix) fi } # don't run the completion function when being source-ed or eval-ed if [ "$funcstack[1]" = "_git-bug" ]; then - _git-bug + _git-bug fi -- cgit