From 17c9722733a3e50f7b5113ca99fba9424b078274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Mon, 5 Dec 2011 21:58:04 +0200 Subject: [PATCH] _known_hosts_real: Support > 1 files per *KnownHostsFile line (Debian: #650514). --- bash_completion | 23 +++++++++++++------- test/fixtures/_known_hosts_real/config_tilde | 4 ++-- test/fixtures/_known_hosts_real/known_hosts4 | 1 + test/unit/_known_hosts_real.exp | 3 ++- 4 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 test/fixtures/_known_hosts_real/known_hosts4 diff --git a/bash_completion b/bash_completion index 03e31d4f..835146f2 100644 --- a/bash_completion +++ b/bash_completion @@ -1425,21 +1425,28 @@ _known_hosts_real() # Known hosts files from configs if [[ ${#config[@]} -gt 0 ]]; then - local OIFS=$IFS IFS=$'\n' + local OIFS=$IFS IFS=$'\n' j local -a tmpkh # expand paths (if present) to global and user known hosts files # TODO(?): try to make known hosts files with more than one consecutive # spaces in their name work (watch out for ~ expansion # breakage! Alioth#311595) tmpkh=( $( awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u ) ) - for i in "${tmpkh[@]}"; do - # Remove possible quotes - i=${i//\"} - # Eval/expand possible `~' or `~user' - __expand_tilde_by_ref i - [[ -r $i ]] && kh+=( "$i" ) - done IFS=$OIFS + for i in "${tmpkh[@]}"; do + # First deal with quoted entries... + while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do + i=${BASH_REMATCH[1]}${BASH_REMATCH[3]} + j=${BASH_REMATCH[2]} + __expand_tilde_by_ref j # Eval/expand possible `~' or `~user' + [[ -r $j ]] && kh+=( "$j" ) + done + # ...and then the rest. + for j in $i; do + __expand_tilde_by_ref j # Eval/expand possible `~' or `~user' + [[ -r $j ]] && kh+=( "$j" ) + done + done fi if [[ -z $configfile ]]; then diff --git a/test/fixtures/_known_hosts_real/config_tilde b/test/fixtures/_known_hosts_real/config_tilde index 1068e299..0893515b 100644 --- a/test/fixtures/_known_hosts_real/config_tilde +++ b/test/fixtures/_known_hosts_real/config_tilde @@ -1,4 +1,4 @@ # With quotes and tilde UserKnownHostsFile "~/fixtures/_known_hosts_real/known_hosts2" -# Without quotes, with tilde -UserKnownHostsFile ~/fixtures/_known_hosts_real/known_hosts3 +# Without quotes, with tilde, and another on the same line +UserKnownHostsFile ~/fixtures/_known_hosts_real/known_hosts3 fixtures/_known_hosts_real/known_hosts4 diff --git a/test/fixtures/_known_hosts_real/known_hosts4 b/test/fixtures/_known_hosts_real/known_hosts4 new file mode 100644 index 00000000..85106651 --- /dev/null +++ b/test/fixtures/_known_hosts_real/known_hosts4 @@ -0,0 +1 @@ +four diff --git a/test/unit/_known_hosts_real.exp b/test/unit/_known_hosts_real.exp index d4ba804e..30ede41c 100644 --- a/test/unit/_known_hosts_real.exp +++ b/test/unit/_known_hosts_real.exp @@ -80,7 +80,8 @@ set test "Files starting with tilde (~) should work" set hosts [get_hosts -unsorted] # Hosts `two*' are defined in ./fixtures/_known_hosts_real/known_hosts2 # Host `three' is defined in ./fixtures/_known_hosts_real/known_hosts3 -lappend hosts two two2 two3 two4 three + # Host `four' is defined in ./fixtures/_known_hosts_real/known_hosts4 +lappend hosts two two2 two3 two4 three four set hosts [join [bash_sort $hosts] "\\s+"] # Setup environment set cmd {OLDHOME=$HOME; HOME=$SRCDIRABS}