Fix error "bad array subscript"

Caused by _get_comp_words_by_ref() with cursor at position 0.
Patch by Igor Murzov (Debian: #559953)
This commit is contained in:
Freddy Vulto 2011-05-19 22:40:14 +02:00
parent 6e4912d9cc
commit fc96a951b7
4 changed files with 53 additions and 5 deletions

View File

@ -40,6 +40,8 @@ bash-completion (2.x)
[ Freddy Vulto ]
* Improve __reassemble_comp_words_by_ref() to not create words of
characters-to-exclude (Alioth: #313057)
* Improve _get_comp_words_by_ref() with cursor at position 0. Patch by
Igor Murzov (Debian: #559953)
[ Mattias Ulbrich ]
* Make java class completion suggest packages.

View File

@ -450,7 +450,7 @@ _get_comp_words_by_ref()
[[ $vcur ]] && { upvars+=("$vcur" ); upargs+=(-v $vcur "$cur" ); }
[[ $vcword ]] && { upvars+=("$vcword"); upargs+=(-v $vcword "$cword"); }
[[ $vprev ]] && { upvars+=("$vprev" ); upargs+=(-v $vprev
[[ $vprev && $cword -ge 1 ]] && { upvars+=("$vprev" ); upargs+=(-v $vprev
"${words[cword - 1]}"); }
[[ $vwords ]] && { upvars+=("$vwords"); upargs+=(-a${#words[@]} $vwords
"${words[@]}"); }

View File

@ -48,16 +48,27 @@ assert_bash_list {" a"} $cmd $test
sync_after_int
set test "|a "; # | = cursor position
set cmd {COMP_WORDS=(a); COMP_CWORD=0; COMP_LINE='a '; COMP_POINT=0; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
set test "|a"; # | = cursor position
set cmd {COMP_WORDS=(a); COMP_CWORD=0; COMP_LINE='a'; COMP_POINT=0; \
unset cur prev; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {" "} $cmd $test
sync_after_int
set test " | a "; # | = cursor position
set cmd {COMP_WORDS=(a); COMP_CWORD=0; COMP_LINE=' a '; COMP_POINT=1; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
set test "|a \$"; # | = cursor position
set cmd {COMP_WORDS=(a); COMP_CWORD=0; COMP_LINE='a '; COMP_POINT=0; \
unset cur prev; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {" "} $cmd $test
sync_after_int
set test " | a \$"; # | = cursor position
set cmd {COMP_WORDS=(a); COMP_CWORD=0; COMP_LINE=' a '; COMP_POINT=1; \
unset cur prev; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {" "} $cmd $test

View File

@ -0,0 +1,35 @@
proc setup {} {
save_env
}
proc teardown {} {
assert_bash_exec { \
unset COMP_CWORD COMP_LINE COMP_POINT COMP_WORDS cur prev words cword\
}
assert_env_unmodified {
/COMPREPLY=/d
}
}
setup
set test "function should not pollute environment"
# NOTE: A possible environment pollution is detected by assert_env_modified() in teardown()
assert_bash_exec {foo() { local cur prev words cword; _init_completion; }; foo; unset foo} $test
sync_after_int
set test "|a"; # | = cursor position
set cmd {COMP_WORDS=(a); COMP_CWORD=0; COMP_LINE='a'; COMP_POINT=0; _init_completion; echo "$cur $prev"}
assert_bash_list {" "} $cmd $test
sync_after_int
teardown