[ovs-dev] [RFC bashcomp] ovs-vsctl-bashcomp: Avoid setting the COMP_WORDBREAKS.

Alex Wang alexw at nicira.com
Tue Mar 17 06:17:47 UTC 2015


Haven't heard back from Peter,

I fixed the unittest failure and added the 'make install' + package install~

Resend RFC to master.

Thanks,
Alex Wang,

On Fri, Mar 13, 2015 at 4:57 PM, Alex Wang <alexw at nicira.com> wrote:

> Hey Ben, Peter,
>
> I did some hack to avoid setting the $COMP_WORDBREAKS (based on this
> link
> http://stackoverflow.com/questions/10528695/how-to-reset-comp-wordbreaks-without-effecting-other-completion-script
> ).
>
> This patch breaks the unittest.  Want to hear some feedback before fixing
> the tests.
>
> Thanks,
> Alex Wang,
>
> On Fri, Mar 13, 2015 at 4:57 PM, Alex Wang <alexw at nicira.com> wrote:
>
>> Modifying $COMP_WORDBREAKS in completion script is not the recommended
>> as it is a global variable and the modification could affect the behavior
>> of other completion scripts.  As a workaround, this commit uses the
>> _get_comp_words_by_ref which allows user to exclude characters out of
>> $COMP_WORDBREAKS and reassemble input command line.  However, as a side
>> effect, the bash completion module cannot handle ':' and '=' correctly
>> in the resulting completions.  Thusly, we need to remove those
>> completions.  This will reduce the functionality of some fancy
>> completions.
>> For example, COLUMN?:KEY=VALUE will not complete on KEY and VALUE.
>>
>> Signed-off-by: Alex Wang <alexw at nicira.com>
>> ---
>>  utilities/ovs-vsctl-bashcomp.bash |   19 +++++++++++++------
>>  1 file changed, 13 insertions(+), 6 deletions(-)
>>
>> diff --git a/utilities/ovs-vsctl-bashcomp.bash
>> b/utilities/ovs-vsctl-bashcomp.bash
>> index e79c6a2..3db7165 100755
>> --- a/utilities/ovs-vsctl-bashcomp.bash
>> +++ b/utilities/ovs-vsctl-bashcomp.bash
>> @@ -36,7 +36,7 @@ _OVS_VSCTL_COMMANDS="$(_ovs_vsctl --commands)"
>>
>>  # This doesn't complete on short arguments, so it filters them out.
>>  _OVS_VSCTL_OPTIONS="$(_ovs_vsctl --options | awk '/^--/ { print $0 }' \
>> -                      | sed -e 's/\(.*\)=ARG/\1=/')"
>> +                      | sed -e 's/\(.*\)=ARG/\1/')"
>>  IFS=$SAVE_IFS
>>
>>  declare -A _OVS_VSCTL_PARSED_ARGS
>> @@ -358,7 +358,7 @@ _ovs_vsctl_complete_column_optkey_value () {
>>              $_OVSDB_SERVER_LOCATION Open_vSwitch $table)
>>
>>          result=$(printf "%s\n" "${columns}" \
>> -                 | awk '/key.*value/ { print $1":"; next }
>> +                 | awk '/key.*value/ { print $1; next }
>>                                       { print $1; next }' \
>>                   | _ovs_vsctl_check_startswith_string "$1" | sort | uniq)
>>      fi
>> @@ -627,7 +627,7 @@ _ovs_vsctl_process_messages () {
>>  # status of the function _ovs_vsctl_complete_argument represents where
>>  # it has determined that the next argument will be.
>>  _ovs_vsctl_bashcomp () {
>> -    local cur valid_globals cmd_args raw_cmd cmd_pos valid_globals
>> valid_opts
>> +    local words cword valid_globals cmd_args raw_cmd cmd_pos
>> valid_globals valid_opts
>>      local test="false"
>>
>>      # Does not support BASH_VERSION < 4.0
>> @@ -645,6 +645,12 @@ _ovs_vsctl_bashcomp () {
>>                    <<< "$tmp"
>>          export COMP_WORDS
>>          export COMP_CWORD="$((${#COMP_WORDS[@]}-1))"
>> +    else
>> +        # If not in test mode, reassembles the COMP_WORDS and COMP_CWORD
>> +        # using just space as word break.
>> +        _get_comp_words_by_ref -n "\"'><=;|&(:" -w words -i cword
>> +        COMP_WORDS=( "${words[@]}")
>> +        COMP_CWORD=${cword}
>>      fi
>>
>>      # Extract the conf.db path.
>> @@ -661,13 +667,11 @@ _ovs_vsctl_bashcomp () {
>>      _OVS_VSCTL_PARSED_ARGS=()
>>      _OVS_VSCTL_NEW_RECORDS=()
>>      cmd_pos=-1
>> -    cur=${COMP_WORDS[COMP_CWORD]}
>>      valid_globals=true
>>      valid_opts=true
>>      valid_commands=true
>>      given_opts=""
>>      index=1
>> -    export COMP_WORDBREAKS=" "
>>      for word in "${COMP_WORDS[@]:1:${COMP_CWORD}} "; do
>>          _OVS_VSCTL_COMP_NOSPACE=false
>>          local completion
>> @@ -750,7 +754,10 @@ _ovs_vsctl_bashcomp () {
>>              valid_commands=true
>>              given_opts=""
>>          fi
>> -        completion="$(sort -u <<< "$(tr ' ' '\n' <<< ${completion})")"
>> +        # colon, equal sign will mess up the completion output, just
>> deletes
>> +        # any completion with those signs.
>> +        completion="$(sort -u <<< "$(tr ' ' '\n' <<< ${completion})" \
>> +                      | sed -e '/:/d; /=/d')"
>>          if [ $index -eq $COMP_CWORD ]; then
>>              if [ "$test" = "true" ]; then
>>                  if [ "${_OVS_VSCTL_COMP_NOSPACE}" = "true" ]; then
>> --
>> 1.7.9.5
>>
>>
>



More information about the dev mailing list