blob: d2c178539cf8e45875a791494d403037514d167e [file] [log] [blame]
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# 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" |
# Remove deprecated options
grep -v deprecated |
# 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
if [ "$1" != "help" ] ; then
echo "-h"
echo "--help"
fi
} | 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