Skip to content
Snippets Groups Projects
Commit 94014b63 authored by Michael Hanselmann's avatar Michael Hanselmann
Browse files

bash_completion: Always enable extglob


In older versions of GNU Bash extended patterns, such as “@(…)” are only
available with the “extglob” shell option. This patch adds a wrapper
function so that extglob is always enabled while doing any completion.
Due to early returns inside the main completion function this seemed
like the best option.

Reported by Sascha Lucas.

Signed-off-by: default avatarMichael Hanselmann <hansmi@google.com>
Reviewed-by: default avatarBernardo Dal Seno <bdalseno@google.com>
parent 9f2265bc
No related branches found
No related tags found
No related merge requests found
......@@ -520,13 +520,12 @@ def WriteCompletion(sw, scriptname, funcname,
@param commands: List of all subcommands in this program
"""
sw.Write("%s() {", funcname)
sw.Write("%s_inner() {", funcname)
sw.IncIndent()
try:
sw.Write("local "
sw.Write("local i first_arg_idx choices compgenargs arg_idx optcur"
' cur="${COMP_WORDS[COMP_CWORD]}"'
' prev="${COMP_WORDS[COMP_CWORD-1]}"'
' i first_arg_idx choices compgenargs arg_idx optcur')
' prev="${COMP_WORDS[COMP_CWORD-1]}"')
sw.Write("_gnt_log cur=\"$cur\" prev=\"$prev\"")
sw.Write("[[ -n \"$GANETI_COMPL_LOG\" ]] &&"
......@@ -575,6 +574,25 @@ def WriteCompletion(sw, scriptname, funcname,
sw.DecIndent()
sw.Write("}")
# Wrapper function to always enable extglob (needed for advanced pattern
# matching)
sw.Write("%s() {", funcname)
sw.IncIndent()
try:
# Get current state of extglob
sw.Write("local -r eg=$(shopt -p extglob || :)")
# Enable extglob
sw.Write("shopt -s extglob")
sw.Write("%s_inner \"$@\"", funcname)
# Reset extglob to original value
sw.Write("[[ -n \"$eg\" ]] && $eg")
finally:
sw.DecIndent()
sw.Write("}")
sw.Write("complete -F %s -o filenames %s",
utils.ShellQuote(funcname),
utils.ShellQuote(scriptname))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment