diff --git a/bash_completion b/bash_completion index 96217d7b..806dacf5 100644 --- a/bash_completion +++ b/bash_completion @@ -1110,12 +1110,12 @@ _known_hosts_real() if [ ${#config[@]} -gt 0 ]; then local OIFS=$IFS IFS=$'\n' # expand path (if present) to global known hosts file - global_kh=($( sed -ne 's/^[ \t]*[Gg][Ll][Oo][Bb][Aa][Ll][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/\1/p' "${config[@]}" )) + global_kh=($( sed -ne 's/^[ \t]*[Gg][Ll][Oo][Bb][Aa][Ll][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/"\1"/p' "${config[@]}" )) for (( i=0; i < ${#global_kh[@]}; i++ )); do global_kh[i]=$(echo "${global_kh[i]//\"/}") done # expand path (if present) to user known hosts file - user_kh=($( sed -ne 's/^[ \t]*[Uu][Ss][Ee][Rr][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/\1/p' "${config[@]}" )) + user_kh=($( sed -ne 's/^[ \t]*[Uu][Ss][Ee][Rr][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/"\1"/p' "${config[@]}" )) for (( i=0; i < ${#user_kh[@]}; i++ )); do user_kh[i]=$(echo "${user_kh[i]//\"/}") done diff --git a/test/fixtures/_known_hosts_real/known*hosts b/test/fixtures/_known_hosts_real/known*hosts new file mode 100644 index 00000000..5db11437 --- /dev/null +++ b/test/fixtures/_known_hosts_real/known*hosts @@ -0,0 +1,2 @@ +star*d +tra,10.0.0.0 key diff --git a/test/fixtures/_known_hosts_real/known*hosts2 b/test/fixtures/_known_hosts_real/known*hosts2 new file mode 100644 index 00000000..3cabce93 --- /dev/null +++ b/test/fixtures/_known_hosts_real/known*hosts2 @@ -0,0 +1 @@ +star*d2 diff --git a/test/fixtures/_known_hosts_real/star*conf b/test/fixtures/_known_hosts_real/star*conf new file mode 100644 index 00000000..a20af358 --- /dev/null +++ b/test/fixtures/_known_hosts_real/star*conf @@ -0,0 +1,2 @@ +UserKnownHostsFile fixtures/_known_hosts_real/known*hosts +UserKnownHostsFile "fixtures/_known_hosts_real/known*hosts2" diff --git a/test/lib/library.exp b/test/lib/library.exp index b663d3f4..436c70cb 100644 --- a/test/lib/library.exp +++ b/test/lib/library.exp @@ -52,6 +52,29 @@ proc assert_bash_type {command} { }; # assert_bash_type() +# Make sure the expected list is returned by executing the specified command. +# @param list $expected +# @param string $cmd Command given to generate items +# @param string $test (optional) Test titel. Default is "$cmd should show completions" +# @param string $prompt (optional) Bash prompt. Default is "/@" +# @param integer $size (optional) Chunk size. Default is 20. +# @result boolean True if successful, False if not +proc assert_bash_list {expected cmd {test ""} {prompt /@} {size 20}} { + if {$test == ""} {set test "$cmd should show expected output"} + send "$cmd\r\n" + expect -ex "$cmd\r\n" + + if {[match_items $expected $test]} { + expect { + -re $prompt { pass "$test" } + -re eof { unresolved "eof" } + }; # expect + } else { + fail "$test" + }; # if +}; # assert_bash_list() + + # Make sure the expected items are returned by TAB-completing the specified # command. # @param list $expected @@ -328,7 +351,7 @@ proc match_items {items test {size 20}} { for {set j 0} {$j < $size && $i + $j < [llength $items]} {incr j} { set item "[lindex $items [expr {$i + $j}]]" # Escape special regexp characters - regsub -all {([\[\]\(\)\.\\\+])} $item {\\\1} item + regsub -all {([\[\]\(\)\.\\\+\*])} $item {\\\1} item append expected $item if {[llength $items] > 1} {append expected {\s+}}; }; # for diff --git a/test/unit/_known_hosts_real.exp b/test/unit/_known_hosts_real.exp index 94fc67ee..4c959982 100644 --- a/test/unit/_known_hosts_real.exp +++ b/test/unit/_known_hosts_real.exp @@ -57,7 +57,6 @@ expect { sync_after_int - set test "Config file containing space should work" set hosts [get_hosts] # Hosts `gee' and `hus' are defined in ./fixtures/_known_hosts_real/spaced conf @@ -101,6 +100,17 @@ sync_after_int assert_bash_exec "unset -v COMP_KNOWN_HOSTS_WITH_HOSTFILE" +sync_after_int + + +set test "Config file containing star (*) should work" +set hosts [get_hosts] + # Hosts `star*d', `tra' and `10.0.0.0' are defined in ./fixtures/_known_hosts_real/known*hosts + # Hosts `star*d2' is defined in ./fixtures/_known_hosts_real/known*hosts2 +lappend hosts star*d star*d2 tra 10.0.0.0 +set cmd {_known_hosts_real -aF 'fixtures/_known_hosts_real/star*conf' ''; echo_array COMPREPLY} +assert_bash_list $hosts $cmd $test + sync_after_int