1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
#!/bin/bash
# Checks that the "_svn" function defined in the specified "bash_completion"
# script produces appropriate lists of completions for various incomplete svn
# command lines.
if [ ! -f "$1" ] || [ "$2" ]; then
echo "Usage: bash_completion_test BASH_COMPLETION_PATHNAME"
echo "Tests the specified \"bash_completion\" script,"
echo "including checking it against the \"svn\" program found in the current PATH."
exit 1
fi
set -e # Exit on error
shopt -s extglob
export LC_ALL=C
# Execute the script which is to be tested.
. "$1"
# From the given incomplete svn command, print a space-separated list of
# possible completions of the last argument (or of an empty first argument
# if no subcommand is given).
# Usage: get_svn_completions [SVN-SUBCOMMAND [SVN-OPTION...]]
get_svn_completions() {
COMP_WORDS=(svn "$@")
if [ $# == 0 ]; then
COMP_CWORD=1
else
COMP_CWORD=$#
fi
_svn
echo -n "${COMPREPLY[*]}"
}
# Print a failure message, record the failure, and return "false".
# Usage: fail MESSAGE
fail() {
PREFIX="FAIL: "
for LINE in "$@"; do
echo "$PREFIX$LINE"
PREFIX=" "
done
TESTS_FAILED=1
false
}
# Check that EXPECTED-WORD is among the completions of the last word in
# SVN-COMMAND. SVN-COMMAND is a single argument to this function, split
# into multiple arguments when passed to "get_svn_completions()".
# Usage: includes SVN-COMMAND EXPECTED-WORD
includes() {
COMPLETIONS=`get_svn_completions $1`
if [[ "$2" != @(${COMPLETIONS// /|}) ]]; then
fail "completions of \"svn $1\" should include \"$2\"" \
"(completions: $COMPLETIONS)"
fi
}
excludes() {
COMPLETIONS=`get_svn_completions $1`
if [[ "$2" == @(${COMPLETIONS// /|}) ]]; then
fail "completions of \"svn $1\" should exclude \"$2\"" \
"(completions: $COMPLETIONS)"
fi
}
# Print the valid subcommands for "svn", one per line, sorted.
# Exclude any synonym that is just a truncation of its full name.
# Usage: get_svn_subcommands
get_svn_subcommands() {
svn help |
# Find the relevant lines.
sed -n -e '1,/^Available subcommands:$/d;/^$/q;p' |
# Remove brackets and commas
tr -d ' )' | tr '(,' ' ' |
# Remove simple abbreviations
( while read SYNONYMS; do
for CMD in $SYNONYMS; do
if [ "$CMD" != "?" ]; then
for SYNONYM in $SYNONYMS; do
case $SYNONYM in
$CMD) ;;
$CMD*) CMD= ; break ;;
esac
done
if [ $CMD ]; then
echo $CMD
fi
fi
done
done
) |
sort
}
# Print the valid option switches for "svn SUBCMD", one per line, sorted.
# Usage: get_svn_options SUBCMD
get_svn_options() {
{ svn help "$1" |
# Find the relevant lines; remove "arg" and description.
sed -n -e '1,/^Valid options:$/d;/^ -/!d' \
-e 's/\( arg\)* * : .*//;p' |
# Remove brackets; put each word on its own line.
tr -d '] ' | tr '[' '\n'
# The following options are always accepted but not listed in the help
echo "-h"
echo "--help"
} | sort
}
# The tests.
set +e # Do not exit on error
TESTS_FAILED=
echo "Checking general completion"
includes "he" "help"
includes "" "help"
includes "" "--version"
echo "Checking list of subcommands"
HELP_SUBCMDS=`get_svn_subcommands | tr "\n" " "`
COMPLETION_SUBCMDS=`get_svn_completions | tr " " "\n" | grep -v "^-" | sort | tr "\n" " "`
if [ "$HELP_SUBCMDS" != "$COMPLETION_SUBCMDS" ]; then
fail "non-option completions for \"svn \" != subcommands accepted" \
" (non-o. cmpl.: $COMPLETION_SUBCMDS)" \
" (svn accepts: $HELP_SUBCMDS)"
fi
echo "Checking list of options for each subcommand"
for SUBCMD in $HELP_SUBCMDS; do
HELP_OPTIONS=`get_svn_options $SUBCMD | tr "\n" " "`
COMPLETION_OPTIONS=`get_svn_completions $SUBCMD - | tr " " "\n" | sort | tr "\n" " "`
if [ "$HELP_OPTIONS" != "$COMPLETION_OPTIONS" ]; then
fail "completions for \"svn $SUBCMD -\" != options accepted" \
" (completions: $COMPLETION_OPTIONS)" \
" (svn accepts: $HELP_OPTIONS)"
fi
done
echo "Checking rejection of synonyms"
excludes "diff -x -u -" "-x"
excludes "diff -x -u --e" "--extensions"
excludes "diff --extensions -u -" "--extensions"
excludes "diff --extensions -u -" "-x"
excludes "diff --extensions=-u -" "-x"
if [ $TESTS_FAILED ]; then
echo "FAILURE: at least one bash_completion test failed."
else
echo "All bash_completion tests passed."
fi
|