ENH: Better completion for custom add-ons via new listaddons command.
The todo_completion had the problem that it didn't consider the todo.cfg itself for the location of TODO_ACTIONS_DIR, it just tried the default location or a globally exported config value. With the injection of custom configuration now in place, we can actually delegate the listing to todo.sh itself. The added built-in "listaddons" command is used for that; it may also be helpful for troubleshooting or to find out about available add-ons. (But the help / shorthelp commands offer more information.) Additionally, completion is now more precise; only executable actions and no subdirs are listed now; this is also covered by the enhanced test. The last bonus: The custom add-on actions are now only determined when there's actually completion of commands.
This commit is contained in:
@@ -7,20 +7,68 @@ This test checks todo_completion of custom actions in .todo.actions.d
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
readonly ACTIONS='add a addto addm append app archive command del rm depri dp do help list ls listall lsa listcon lsc listfile lf listpri lsp listproj lsprj move mv prepend prep pri p replace report shorthelp'
|
||||
readonly ACTIONS='add a addto addm append app archive command del rm depri dp do help list ls listaddons listall lsa listcon lsc listfile lf listpri lsp listproj lsprj move mv prepend prep pri p replace report shorthelp'
|
||||
readonly OPTIONS='-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x'
|
||||
|
||||
readonly ADDONS='bar baz foobar'
|
||||
mkdir "$HOME/.todo.actions.d"
|
||||
for addon in $ADDONS
|
||||
do
|
||||
> "$HOME/.todo.actions.d/$addon"
|
||||
chmod +x "$HOME/.todo.actions.d/$addon"
|
||||
done
|
||||
makeCustomActions()
|
||||
{
|
||||
set -e
|
||||
mkdir "${1:?}"
|
||||
for addon in $ADDONS
|
||||
do
|
||||
addonFile="${1}/$addon"
|
||||
> "$addonFile"
|
||||
chmod +x "$addonFile"
|
||||
done
|
||||
|
||||
# Also create a subdirectory, to test that it is skipped.
|
||||
mkdir "${1}/subdir"
|
||||
|
||||
# Also create a non-executable file, to test that it is skipped.
|
||||
datafile="${1:?}/datafile"
|
||||
> "$datafile"
|
||||
chmod -x "$datafile"
|
||||
[ -x "$datafile" ] && rm "$datafile" # Some file systems may always make files executable; then, skip this check.
|
||||
|
||||
set +e
|
||||
}
|
||||
removeCustomActions()
|
||||
{
|
||||
set -e
|
||||
rmdir "${1}/subdir"
|
||||
rm "${1:?}/"*
|
||||
rmdir "$1"
|
||||
set +e
|
||||
}
|
||||
|
||||
#
|
||||
# Test resolution of the default TODO_ACTIONS_DIR.
|
||||
#
|
||||
makeCustomActions "$HOME/.todo.actions.d"
|
||||
test_todo_completion 'all arguments' 'todo.sh ' "$ACTIONS $ADDONS $OPTIONS"
|
||||
test_todo_completion 'all arguments after option' 'todo.sh -a ' "$ACTIONS $ADDONS $OPTIONS"
|
||||
test_todo_completion 'all arguments beginning with b' 'todo.sh b' 'bar baz'
|
||||
test_todo_completion 'all arguments beginning with f after options' 'todo.sh -a -v f' 'foobar'
|
||||
test_todo_completion 'nothing after addon action' 'todo.sh foobar ' ''
|
||||
removeCustomActions "$HOME/.todo.actions.d"
|
||||
|
||||
#
|
||||
# Test resolution of an alternative TODO_ACTIONS_DIR.
|
||||
#
|
||||
mkdir "$HOME/.todo"
|
||||
makeCustomActions "$HOME/.todo/actions"
|
||||
test_todo_completion 'all arguments with actions from .todo/actions/' 'todo.sh ' "$ACTIONS $ADDONS $OPTIONS"
|
||||
removeCustomActions "$HOME/.todo/actions"
|
||||
|
||||
#
|
||||
# Test resolution of a configured TODO_ACTIONS_DIR.
|
||||
#
|
||||
makeCustomActions "$HOME/addons"
|
||||
cat >> todo.cfg <<'EOF'
|
||||
export TODO_ACTIONS_DIR="$HOME/addons"
|
||||
EOF
|
||||
test_todo_completion 'all arguments with actions from addons/' 'todo.sh ' "$ACTIONS $ADDONS $OPTIONS"
|
||||
removeCustomActions "$HOME/addons"
|
||||
|
||||
test_done
|
||||
|
||||
Reference in New Issue
Block a user