Files
swupd-client/scripts/swupd-completion.sh
T
Icarus Sparry bbb9774703 Fix generation of swupd.bash
When output was changed to stderr for user output, this broke
automatic generation of the bash completion function.

Add suitable redirection to the generation script to capture stderr.

Add test to check the generated file looks reasonable.

Signed-off-by: Icarus Sparry <icarus.w.sparry@intel.com>
2017-11-02 09:06:57 -07:00

163 lines
4.7 KiB
Bash
Executable File

#!/bin/bash
#
# Software Updater - autocompletion script
#
# Copyright © 2016 Intel Corporation.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 2 or later of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This program creates a _swupd function to be used by completion built-in
# bash command to complete swup.
# It reads options and subcommands from swup --help and then it reads
# options for each subcommand recursively.
SCRIPTNAME="swupd.bash"
COMPLETIONFUNCTION="_swupd"
SWUPDCOMMAND="./swupd"
optionsfromhelp=""
subcommandsfromhelp=()
#Checks if swupd commad exists in current shell
if [ ! -e $SWUPDCOMMAND ] ; then
echo "Error: No swupd found"
exit 1
fi
currenttype=""
nexttype=""
#reads "swupd --help" line by line
while read word1 word2 rest
do
#For each line checks in what section is
if [[ "$word1 $word2" == "Help Options:" ]]; then
currenttype="options"
continue
fi
if [[ "$word1" == "Subcommands:" ]]; then
currenttype="subcommand"
continue
fi
if [[ "$word1" == "" ]]; then
currenttype=""
continue
fi
case $currenttype in
#In case of subcommand it inserts first word of line in an array
("subcommand")
subcommandsfromhelp+=("$word1") ;;
#For options it reads short and long options, remove the commma from short
("options")
optionsfromhelp="${optionsfromhelp} ${word1%,} ${word2}" ;;
#For the rest do nothing
("") : ;;
esac
done < <($SWUPDCOMMAND --help 2>&1)
# Construct sed script
#Convert all tabs to spaces
SEDSCRIPT=$'s/\t/ /g'
#get rid of anything that does not start with a -
SEDSCRIPT+=';/^ *-/!d'
#remove leading spaces
SEDSCRIPT+=';s/^ *//'
# remove commas, any extra spaces between options
SEDSCRIPT+=';s/, *-/ -/'
# Strip trailing junk, anything after = or the second word
SEDSCRIPT+=';s/=.*//'
SEDSCRIPT+=';s/^\([^ ]* [^ ]*\).*/\1/'
# See if there is only one option on line
SEDSCRIPT+=';/ -/!s/ .*//'
#Autocomplete script creation
{
cat <<EOM
#!/bin/bash
# WARNING: This is an autogenerated script
# Software Updater - autocompletion script
#
# Copyright © 2017 Intel Corporation.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 2 or later of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#declares the completion function
${COMPLETIONFUNCTION}()
{
# \$1 is the command being completed, \$2 is the current word being expanded
local opts IFS=\$' \t\n'
local -i i installed
COMPREPLY=()
for ((i=COMP_CWORD-1;i>=0;i--))
do case "\${COMP_WORDS[\$i]}" in
EOM
#This adds options for all subcommands
printf '\t ("$1")\n\t\topts="%s"\n' "$optionsfromhelp ${subcommandsfromhelp[*]}"
printf '\t break;;\n'
for i in "${subcommandsfromhelp[@]}"; do
printf '\t ("%s")\n' "$i"
C="$($SWUPDCOMMAND $i --help 2>&1 | sed -e "$SEDSCRIPT" | tr '\n' ' ')"
printf '\t\topts="%s"\n' "$C"
printf '\t\tbreak;;\n'
done
# The tail of the script
cat >> $SCRIPTNAME << 'EOM'
esac
done
# Add in additional completion options if we need to
if (( $i >= 0 ))
then
case "${COMP_WORDS[$i]}" in
("bundle-add")
if [ -r /var/lib/swupd/version ] &&
installed=$(</var/lib/swupd/version) &&
[ -r /var/lib/swupd/$installed/Manifest.MoM ]
then
opts+="$( sed '1,/^$/d; s/^.*\t/ /' /var/lib/swupd/$installed/Manifest.MoM | LC_ALL=C sort )"
fi ;;
("bundle-remove")
opts+=" $(unset CDPATH; test -d /usr/share/clear/bundles && \
cd /usr/share/clear/bundles && ls | grep -v '^os-core' )"
;;
esac
fi
COMPREPLY=($(compgen -W "${opts}" -- ${2}));
return 0
}
if [ ${BASH_VERSINFO[0]} -gt 4 ] || ( [ ${BASH_VERSINFO[0]} -eq 4 ] && [ ${BASH_VERSINFO[1]} -ge 4 ] )
then
complete -F _swupd -o nosort swupd
else
complete -F _swupd swupd
fi
EOM
} > $SCRIPTNAME