Compare commits

...

9 Commits

Author SHA1 Message Date
Ingo Karkat
e48ad81ecc FIX: Built-in action help for OS X.
POSIX sed doesn't support regex branches; I don't want to switch to modern regexp (via -E), since that makes more characters special. Rather, expand the alternatives into two sed commands.
2012-05-11 21:18:43 +02:00
Ingo Karkat
c0c93c8c0c FIX: Adapt test for OS X.
POSIX sed doesn't understand the \w atom; use [A-Z] instead; it's also more precise.
2012-05-11 09:05:44 +02:00
Ingo Karkat
7acb521190 Add action argument for help to todo_completion.
Note that this is not perfect, as it only handles completing a single action after "help", but that should over the most important use case.
2012-04-27 14:29:29 +02:00
Ingo Karkat
f2b9734047 FIX: Always return success after help.
Usually (i.e. when a pager is available), the help() output is piped through the pager, and then the return code will be the one of the pager. So the exit 1 at the end of help() doesn't make much sense, and should be abolished for consistency.
2012-04-27 13:40:52 +02:00
Ingo Karkat
97035d3425 ENH: Print usage help for all passed actions.
Extend the support for specific usage help to built-in actions.
2012-04-27 13:37:14 +02:00
Ingo Karkat
99e5e57a75 Refactoring: Extract make_action into actions-test-lib.sh.
This reduces the duplication in the individual test files.
2012-04-27 12:42:10 +02:00
Ingo Karkat
42424d5881 ENH: Print usage help for custom action.
Currently, the only way to get usage help for a custom action is to use "todo.sh help" and scroll / search for the action name. (Or try to call the action without / with invalid parameters to hopefully get a one-line syntax summary.)
This extends the help command to print the usage of optionally passed custom action names.
2012-04-27 11:48:01 +02:00
Ingo Karkat
7ab90476f7 Tests: Add test for ordinary help. 2012-04-27 11:34:46 +02:00
Ingo Karkat
fac5533b96 Tests: Add test for listaddons. 2012-04-27 09:25:00 +02:00
9 changed files with 311 additions and 22 deletions

18
tests/actions-test-lib.sh Normal file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
make_action()
{
unset TODO_ACTIONS_DIR
[ -d .todo.actions.d ] || mkdir .todo.actions.d
cat > ".todo.actions.d/$1" <<EOF
#!/bin/bash
[ "\$1" = "usage" ] && {
echo " $1 ITEM#[, ITEM#, ...] [TERM...]"
echo " This custom action does $1."
echo ""
exit
}
echo "custom action $1"
EOF
chmod +x ".todo.actions.d/$1"
}

44
tests/t2100-help.sh Executable file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
#
test_description='help functionality
This test covers the help output.
'
. ./actions-test-lib.sh
. ./test-lib.sh
# Note: To avoid having to adapt the test whenever the help documentation
# slightly changes, only check for the section headers.
test_todo_session 'help output' <<EOF
>>> todo.sh help | sed '/^ [A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Options:
Built-in Actions:
EOF
test_todo_session 'verbose help output' <<EOF
>>> todo.sh -v help | sed '/^ [A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Options:
Built-in Actions:
EOF
test_todo_session 'very verbose help output' <<EOF
>>> todo.sh -vv help | sed '/^ [A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Options:
Environment variables:
Built-in Actions:
EOF
make_action "foo"
test_todo_session 'help output with custom action' <<EOF
>>> todo.sh -v help | sed '/^ [A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Options:
Built-in Actions:
Add-on Actions:
EOF
test_done

66
tests/t2110-help-action.sh Executable file
View File

@@ -0,0 +1,66 @@
#!/bin/bash
test_description='built-in actions help functionality
This test checks listing the usage help of a built-in action.
'
. ./test-lib.sh
test_todo_session 'nonexisting action help' <<'EOF'
>>> todo.sh help doesnotexist
TODO: No action "doesnotexist" exists.
=== 1
>>> todo.sh help hel
TODO: No action "hel" exists.
=== 1
>>> todo.sh help h
TODO: No action "h" exists.
=== 1
EOF
test_todo_session 'single action help' <<'EOF'
>>> todo.sh help shorthelp
shorthelp
List the one-line usage of all built-in and add-on actions.
\
EOF
test_todo_session 'multiple actions help' <<'EOF'
>>> todo.sh help shorthelp append
shorthelp
List the one-line usage of all built-in and add-on actions.
\
append ITEM# "TEXT TO APPEND"
app ITEM# "TEXT TO APPEND"
Adds TEXT TO APPEND to the end of the task on line ITEM#.
Quotes optional.
\
EOF
test_todo_session 'short and long form of action help' <<'EOF'
>>> todo.sh help append
append ITEM# "TEXT TO APPEND"
app ITEM# "TEXT TO APPEND"
Adds TEXT TO APPEND to the end of the task on line ITEM#.
Quotes optional.
\
>>> todo.sh help app
app ITEM# "TEXT TO APPEND"
Adds TEXT TO APPEND to the end of the task on line ITEM#.
Quotes optional.
\
EOF
test_todo_session 'mixed existing and nonexisting action help' <<'EOF'
>>> todo.sh help shorthelp doesnotexist list
shorthelp
List the one-line usage of all built-in and add-on actions.
\
TODO: No action "doesnotexist" exists.
=== 1
EOF
test_done

20
tests/t6100-completion-help.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/bin/bash
#
test_description='Bash help completion functionality
This test checks todo_completion of actions for usage help.
'
. ./actions-test-lib.sh
. ./test-lib.sh
make_action "zany"
make_action "aardvark"
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 ADDONS='aardvark zany'
test_todo_completion 'all actions after help' 'todo.sh help ' "$ACTIONS $ADDONS"
test_todo_completion 'all actions after command help' 'todo.sh command help ' "$ACTIONS $ADDONS"
test_todo_completion 'actions beginning with a' 'todo.sh help a' 'add a addto addm append app archive aardvark'
test_done

View File

@@ -4,19 +4,9 @@ test_description='custom actions functionality
This test covers the contract between todo.sh and custom actions.
'
. ./actions-test-lib.sh
. ./test-lib.sh
unset TODO_ACTIONS_DIR
mkdir .todo.actions.d
make_action()
{
cat > ".todo.actions.d/$1" <<- EOF
#!/bin/bash
echo "custom action $1"
EOF
chmod +x ".todo.actions.d/$1"
}
make_action "foo"
test_todo_session 'executable action' <<EOF
>>> todo.sh foo

44
tests/t8010-listaddons.sh Executable file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
test_description='listaddons functionality
This test checks listing of custom actions.
'
. ./actions-test-lib.sh
. ./test-lib.sh
test_todo_session 'no custom actions' <<EOF
>>> todo.sh listaddons
EOF
make_action "foo"
test_todo_session 'one custom action' <<EOF
>>> todo.sh listaddons
foo
EOF
make_action "bar"
make_action "ls"
make_action "quux"
test_todo_session 'multiple custom actions' <<EOF
>>> todo.sh listaddons
bar
foo
ls
quux
EOF
chmod -x .todo.actions.d/foo
# On Cygwin, clearing the executable flag may have no effect, as the Windows ACL
# may still grant execution rights. In this case, we skip the test.
if [ -x .todo.actions.d/foo ]; then
SKIP_TESTS="${SKIP_TESTS}${SKIP_TESTS+ }t8010.4"
fi
test_todo_session 'nonexecutable action' <<EOF
>>> todo.sh listaddons
bar
ls
quux
EOF
test_done

76
tests/t8020-actions-help.sh Executable file
View File

@@ -0,0 +1,76 @@
#!/bin/bash
test_description='custom actions help functionality
This test checks listing the usage help of a custom action.
'
. ./actions-test-lib.sh
. ./test-lib.sh
test_todo_session 'custom action help with no custom action directory' <<'EOF'
>>> todo.sh help foo
TODO: No action "foo" exists.
=== 1
EOF
make_action "foo"
make_action "bar"
make_action "ls"
make_action "quux"
test_todo_session 'custom action help' <<'EOF'
>>> todo.sh help foo
foo ITEM#[, ITEM#, ...] [TERM...]
This custom action does foo.
\
>>> todo.sh help bar
bar ITEM#[, ITEM#, ...] [TERM...]
This custom action does bar.
\
EOF
test_todo_session 'multiple custom actions help' <<'EOF'
>>> todo.sh help foo bar
foo ITEM#[, ITEM#, ...] [TERM...]
This custom action does foo.
\
bar ITEM#[, ITEM#, ...] [TERM...]
This custom action does bar.
\
EOF
test_todo_session 'nonexisting action help' <<'EOF'
>>> todo.sh help doesnotexist
TODO: No action "doesnotexist" exists.
=== 1
>>> todo.sh help foo doesnotexist bar
foo ITEM#[, ITEM#, ...] [TERM...]
This custom action does foo.
\
TODO: No action "doesnotexist" exists.
=== 1
EOF
test_todo_session 'mixed built-in and custom actions help' <<'EOF'
>>> todo.sh help foo shorthelp bar
foo ITEM#[, ITEM#, ...] [TERM...]
This custom action does foo.
\
shorthelp
List the one-line usage of all built-in and add-on actions.
\
bar ITEM#[, ITEM#, ...] [TERM...]
This custom action does bar.
\
EOF
test_todo_session 'custom override of built-in action help' <<'EOF'
>>> todo.sh help ls
ls ITEM#[, ITEM#, ...] [TERM...]
This custom action does ls.
\
EOF
test_done

41
todo.sh
View File

@@ -54,7 +54,7 @@ shorthelp()
del|rm ITEM# [TERM]
depri|dp ITEM#[, ITEM#, ITEM#, ...]
do ITEM#[, ITEM#, ITEM#, ...]
help
help [ACTION...]
list|ls [TERM...]
listall|lsa [TERM...]
listaddons
@@ -154,6 +154,12 @@ help()
EndVerboseHelp
actionsHelp
addonHelp
}
actionsHelp()
{
cat <<-EndActionsHelp
Built-in Actions:
add "THING I NEED TO DO +project @context"
@@ -200,8 +206,9 @@ help()
do ITEM#[, ITEM#, ITEM#, ...]
Marks task(s) on line ITEM# as done in todo.txt.
help
Display this help message.
help [ACTION...]
Display help about usage, options, built-in and add-on actions,
or just the usage help for the passed ACTION(s).
list [TERM...]
ls [TERM...]
@@ -278,9 +285,6 @@ help()
List the one-line usage of all built-in and add-on actions.
EndActionsHelp
addonHelp
exit 1
}
addonHelp()
@@ -302,6 +306,25 @@ addonHelp()
fi
}
actionUsage()
{
for actionName
do
action="${TODO_ACTIONS_DIR}/${actionName}"
if [ -f "$action" -a -x "$action" ]; then
"$action" usage
else
builtinActionUsage=$(actionsHelp | sed -n -e "/^ ${actionName//\//\\/} /,/^\$/p" -e "/^ ${actionName//\//\\/}$/,/^\$/p")
if [ "$builtinActionUsage" ]; then
echo "$builtinActionUsage"
echo
else
die "TODO: No action \"${actionName}\" exists."
fi
fi
done
}
die()
{
echo "$*"
@@ -1075,6 +1098,11 @@ case $action in
;;
"help" )
shift ## Was help; new $1 is first help topic / action name
if [ $# -gt 0 ]; then
# Don't use PAGER here; we don't expect much usage output from one / few actions.
actionUsage "$@"
else
if [ -t 1 ] ; then # STDOUT is a TTY
if which "${PAGER:-less}" >/dev/null 2>&1; then
# we have a working PAGER (or less as a default)
@@ -1082,6 +1110,7 @@ case $action in
fi
fi
help # just in case something failed above, we go ahead and just spew to STDOUT
fi
;;
"shorthelp" )

View File

@@ -28,6 +28,8 @@ _todo()
case "$prev" in
command)
completions=$COMMANDS;;
help)
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons)";;
addto|listfile|lf)
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile);;
-*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS";;