diff --git a/tests/t2120-shorthelp.sh b/tests/t2120-shorthelp.sh new file mode 100755 index 0000000..1724dee --- /dev/null +++ b/tests/t2120-shorthelp.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# + +test_description='shorthelp functionality + +This test covers the output of the -h option and the shorthelp action. +' +. ./actions-test-lib.sh +. ./test-lib.sh + +# Note: To avoid having to adapt the test whenever the actions change, only +# check for the section headers. +test_todo_session '-h output' <>> todo.sh -h | sed '/^ [A-Z]/!d' + Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description] + Actions: + Actions can be added and overridden using scripts in the actions + See "help" for more details. +EOF + +test_todo_session 'shorthelp output' <>> todo.sh shorthelp | sed '/^ [A-Z]/!d' + Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description] + Actions: + Actions can be added and overridden using scripts in the actions + See "help" for more details. +EOF + +make_action "foo" +test_todo_session 'shorthelp output with custom action' <>> todo.sh -v shorthelp | sed '/^ [A-Z]/!d' + Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description] + Actions: + Actions can be added and overridden using scripts in the actions + Add-on Actions: + See "help" for more details. +EOF + + +# Verify that custom configuration is actually processed (when the -d option +# precedes the -h option) by specifying a different actions directory and moving +# our custom action there. The help output should mention the "Add-On Actions". +set -o pipefail # So that the sed filter doesn't swallow todo.sh's exit code. +mv todo.cfg custom.cfg +mv .todo.actions.d custom.actions +echo 'export TODO_ACTIONS_DIR=$HOME/custom.actions' >> custom.cfg + +test_todo_session '-h and fatal error without config' <>> todo.sh -h | sed '/^ \\{0,2\\}[A-Z]/!d' + Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description] + Actions: + Actions can be added and overridden using scripts in the actions + See "help" for more details. +Fatal Error: Cannot read configuration file $HOME/.todo/config +=== 1 +EOF + +# Config option comes too late; "Add-on Actions" is *not* mentioned here. +test_todo_session '-h and fatal error with trailing custom config' <>> todo.sh -h -d custom.cfg | sed '/^ \\{0,2\\}[A-Z]/!d' + Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description] + Actions: + Actions can be added and overridden using scripts in the actions + See "help" for more details. +Fatal Error: Cannot read configuration file $HOME/.todo/config +=== 1 +EOF + +# Config option processed; "Add-on Actions" is mentioned here. +test_todo_session '-h output with preceding custom config' <>> todo.sh -d custom.cfg -h | sed '/^ \\{0,2\\}[A-Z]/!d' + Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description] + Actions: + Actions can be added and overridden using scripts in the actions + Add-on Actions: + See "help" for more details. +EOF + +test_done diff --git a/todo.sh b/todo.sh index a6c6c54..7e75ceb 100755 --- a/todo.sh +++ b/todo.sh @@ -81,7 +81,6 @@ shorthelp() See "help" for more details. EndHelpFooter - exit 0 } help() @@ -327,6 +326,16 @@ actionUsage() done } +dieWithHelp() +{ + case "$1" in + help) help;; + shorthelp) shorthelp;; + esac + shift + + die "$@" +} die() { echo "$*" @@ -514,6 +523,7 @@ do # Cannot just invoke shorthelp() because we need the configuration # processed to locate the add-on actions directory. set -- '-h' 'shorthelp' + OPTIND=2 ;; n ) OVR_TODOTXT_PRESERVE_LINE_NUMBERS=0 @@ -654,7 +664,7 @@ fi } # === SANITY CHECKS (thanks Karl!) === -[ -r "$TODOTXT_CFG_FILE" ] || die "Fatal Error: Cannot read configuration file $TODOTXT_CFG_FILE" +[ -r "$TODOTXT_CFG_FILE" ] || dieWithHelp "$1" "Fatal Error: Cannot read configuration file $TODOTXT_CFG_FILE" . "$TODOTXT_CFG_FILE" @@ -693,8 +703,8 @@ fi ACTION=${1:-$TODOTXT_DEFAULT_ACTION} [ -z "$ACTION" ] && usage -[ -d "$TODO_DIR" ] || die "Fatal Error: $TODO_DIR is not a directory" -( cd "$TODO_DIR" ) || die "Fatal Error: Unable to cd to $TODO_DIR" +[ -d "$TODO_DIR" ] || dieWithHelp "$1" "Fatal Error: $TODO_DIR is not a directory" +( cd "$TODO_DIR" ) || dieWithHelp "$1" "Fatal Error: Unable to cd to $TODO_DIR" [ -f "$TODO_FILE" ] || cp /dev/null "$TODO_FILE" [ -f "$DONE_FILE" ] || cp /dev/null "$DONE_FILE"