Compare commits

..

17 Commits

Author SHA1 Message Date
Ingo Karkat
6a3ddad787 FIX: test-lib: Print differences when test_expect_output fails.
When the command-under-test fails with a non-zero exit code, neither the different exit code nor any output differences are printed. Also, there's a lot of duplication between test_expect_output and test_expect_code_and_output. So, let's fix both by delegating the first to the latter.
2012-04-27 21:58:07 +02:00
Ingo Karkat
35f9c4276c test-lib: Allow expected output with empty lines.
An empty line is used to delimit test commands in test_todo_session. (This wasn't properly reflected in the usage comment, fixed that, too.) This prevents us from testing commands that include empty lines. (Currently, there is no such output in todo.sh, but custom add-ons may have this.)
Instead of forcing the test to filter out the empty lines, extend the syntax to allow empty lines in the expected output by escaping them with a single backslash. (When redirecting via <<EOF, the backslash itself must be escaped = doubled; better use <<'EOF'.)
2012-04-13 16:54:40 +02:00
Ingo Karkat
661dac0cfb test-lib: Avoid eating leading whitespace in expected output.
Currently, todo.sh produces no indented output, so this hasn't affected tests so far. I found this while testing one of my custom actions with the test-lib.
By unsetting IFS, the read command won't strip off leading and trailing whitespace while parsing the test session definition.
2012-04-13 16:47:04 +02:00
Gina Trapani
ebe6a403c8 Merge pull request #81 from todb-r7/master
.gitignore for local data files.
2012-03-26 11:56:04 -07:00
Tod Beardsley
a6fed991e5 Ignore user data.
If you run out of git checkouts, should probably ignore the todo.txt
data file (and friends).
2012-03-19 11:00:51 -05:00
Gina Trapani
94f770926b Merge pull request #80 from inkarkat/complete-enhancements
Complete enhancements
2012-03-01 10:26:17 -08:00
Ingo Karkat
322f3075d2 FIX: task number completion doesn't work on OS X.
The recently added tests revealed that. Because of the sed \+ bound. As in  f3fc18af6b, fall back to the \{1,\} basic regexp.
2012-02-29 09:00:35 +01:00
Ingo Karkat
bc81db2f2b 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.
2012-02-29 08:53:18 +01:00
Ingo Karkat
6259cdb6da Add test for custom add-on action completion. 2012-02-29 08:53:17 +01:00
Ingo Karkat
f76b6d5210 Add test for todo file completion. 2012-02-29 08:53:17 +01:00
Ingo Karkat
c1ad7f3560 Add more test cases for arguments and options completion. 2012-02-29 08:53:17 +01:00
Ingo Karkat
a777b266ed Add test for task number completion. 2012-02-29 08:53:17 +01:00
Ingo Karkat
ebce735d04 test-lib: Allow completions containing whitespace.
This is necessary to test the completion of task text.
2012-02-29 08:53:17 +01:00
Ingo Karkat
e5a308eb03 test-lib: Also document test_expect_code. 2012-02-29 08:53:16 +01:00
Ingo Karkat
e600a2162b ENH: completion can use different todo.sh locations and configurations.
This was previously not supported; todo_completion always used plain todo.sh from the PATH. Now it's possible to override the used executable (and configuration used through _todo_sh, set from a completion function wrapper.

Cp. http://tech.groups.yahoo.com/group/todotxt/message/4003
2012-02-29 08:53:16 +01:00
Ingo Karkat
3d0a4d0b30 test-lib: Add test_todo_custom_completion variant.
This extension of test_todo_completion additionally takes the completion function to use, so that customized completions for todo.sh aliases can be tested.
2012-02-29 08:53:16 +01:00
Gina Trapani
79f428779c Merge pull request #77 from inkarkat/complete-from-done
Complete from done
2012-02-28 13:53:54 -08:00
6 changed files with 94 additions and 40 deletions

3
.gitignore vendored
View File

@@ -1,3 +1,6 @@
VERSION-FILE VERSION-FILE
tests/test-results tests/test-results
tests/trash\ directory.* tests/trash\ directory.*
done.txt
report.txt
todo.txt

View File

@@ -7,7 +7,7 @@ This test checks basic todo_completion of actions and options
' '
. ./test-lib.sh . ./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 OPTIONS='-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x'
test_todo_completion 'all arguments' 'todo.sh ' "$ACTIONS $OPTIONS" test_todo_completion 'all arguments' 'todo.sh ' "$ACTIONS $OPTIONS"

View File

@@ -7,20 +7,68 @@ This test checks todo_completion of custom actions in .todo.actions.d
' '
. ./test-lib.sh . ./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 OPTIONS='-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x'
readonly ADDONS='bar baz foobar' readonly ADDONS='bar baz foobar'
mkdir "$HOME/.todo.actions.d" makeCustomActions()
for addon in $ADDONS {
do set -e
> "$HOME/.todo.actions.d/$addon" mkdir "${1:?}"
chmod +x "$HOME/.todo.actions.d/$addon" for addon in $ADDONS
done 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' 'todo.sh ' "$ACTIONS $ADDONS $OPTIONS"
test_todo_completion 'all arguments after option' 'todo.sh -a ' "$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 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 'all arguments beginning with f after options' 'todo.sh -a -v f' 'foobar'
test_todo_completion 'nothing after addon action' 'todo.sh 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 test_done

View File

@@ -264,25 +264,7 @@ test_expect_success () {
test_expect_output () { test_expect_output () {
test "$#" = 2 || test "$#" = 2 ||
error "bug in the test script: not 2 parameters to test-expect-output" error "bug in the test script: not 2 parameters to test-expect-output"
if ! test_skip "$@" test_expect_code_and_output 0 "$@"
then
say >&3 "expecting success and output: $2"
test_run_ "$2"
if [ "$?" = 0 -a "$eval_ret" = 0 ]
then
cmp_output=$(test_cmp expect output)
if [ "$?" = 0 ]
then
test_ok_ "$1"
else
test_failure_ "$@" "
$cmp_output"
fi
else
test_failure_ "$@"
fi
fi
echo >&3 ""
} }
test_expect_code_and_output () { test_expect_code_and_output () {
@@ -290,7 +272,11 @@ test_expect_code_and_output () {
error "bug in the test script: not 3 parameters to test-expect-code-and-output" error "bug in the test script: not 3 parameters to test-expect-code-and-output"
if ! test_skip "$@" if ! test_skip "$@"
then then
say >&3 "expecting exit code $1 and output: $3" if [ "$1" = 0 ]; then
say >&3 "expecting success and output: $3"
else
say >&3 "expecting exit code $1 and output: $3"
fi
test_run_ "$3" test_run_ "$3"
if [ "$?" = 0 -a "$eval_ret" = "$1" ] if [ "$?" = 0 -a "$eval_ret" = "$1" ]
then then
@@ -566,14 +552,16 @@ test_tick () {
} }
# Generate and run a series of tests based on a transcript. # Generate and run a series of tests based on a transcript.
# Usage: test_todo_session "description" <<EOF # Usage: test_todo_session "description" <<'EOF'
# >>> command # >>> command
# output1 # output1
# output2 # output2
#
# >>> command # >>> command
# === exit status # === exit status
# output3 # output3 with empty line (must be escaped here)
# output4 # \
# output5
# EOF # EOF
test_todo_session () { test_todo_session () {
test "$#" = 1 || test "$#" = 1 ||
@@ -582,7 +570,7 @@ test_todo_session () {
cmd="" cmd=""
status=0 status=0
> expect > expect
while read -r line while IFS= read -r line
do do
case $line in case $line in
">>> "*) ">>> "*)
@@ -606,6 +594,9 @@ test_todo_session () {
> expect > expect
fi fi
;; ;;
\\)
echo "" >> expect
;;
*) *)
echo "$line" >> expect echo "$line" >> expect
;; ;;

16
todo.sh
View File

@@ -57,6 +57,7 @@ shorthelp()
help help
list|ls [TERM...] list|ls [TERM...]
listall|lsa [TERM...] listall|lsa [TERM...]
listaddons
listcon|lsc listcon|lsc
listfile|lf [SRC [TERM...]] listfile|lf [SRC [TERM...]]
listpri|lsp [PRIORITIES] [TERM...] listpri|lsp [PRIORITIES] [TERM...]
@@ -219,6 +220,9 @@ help()
TERM specified, lists entire todo.txt AND done.txt TERM specified, lists entire todo.txt AND done.txt
concatenated and sorted. concatenated and sorted.
listaddons
Lists all added and overridden actions in the actions directory.
listcon listcon
lsc lsc
Lists all the task contexts that start with the @ sign in todo.txt. Lists all the task contexts that start with the @ sign in todo.txt.
@@ -1300,6 +1304,18 @@ note: PRIORITY must be anywhere from A to Z."
fi fi
;; ;;
"listaddons" )
if [ -d "$TODO_ACTIONS_DIR" ]; then
cd "$TODO_ACTIONS_DIR" || exit $?
for action in *
do
if [ -f "$action" -a -x "$action" ]; then
echo "$action"
fi
done
fi
;;
* ) * )
usage;; usage;;
esac esac

View File

@@ -11,18 +11,14 @@ _todo()
local -r OPTS="-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x" local -r OPTS="-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x"
local -r COMMANDS="\ local -r COMMANDS="\
add a addto addm append app archive command del \ add a addto addm append app archive command del \
rm depri dp do help list ls listall lsa listcon \ rm depri dp do help list ls listaddons listall lsa listcon \
lsc listfile lf listpri lsp listproj lsprj move \ lsc listfile lf listpri lsp listproj lsprj move \
mv prepend prep pri p replace report shorthelp" mv prepend prep pri p replace report shorthelp"
# Add custom commands from add-ons, if installed.
# TODO: Filter for executable flag of files found in $TODO_ACTIONS_DIR.
local allCommands="$COMMANDS $('ls' "${TODO_ACTIONS_DIR:-$HOME/.todo.actions.d}/" 2>/dev/null)"
local _todo_sh=${_todo_sh:-todo.sh} local _todo_sh=${_todo_sh:-todo.sh}
local completions local completions
if [ $COMP_CWORD -eq 1 ]; then if [ $COMP_CWORD -eq 1 ]; then
completions="$allCommands $OPTS" completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS"
elif [[ $COMP_CWORD -gt 2 && ( \ elif [[ $COMP_CWORD -gt 2 && ( \
"${COMP_WORDS[COMP_CWORD-2]}" =~ ^(move|mv)$ || \ "${COMP_WORDS[COMP_CWORD-2]}" =~ ^(move|mv)$ || \
"${COMP_WORDS[COMP_CWORD-3]}" =~ ^(move|mv)$ ) ]]; then "${COMP_WORDS[COMP_CWORD-3]}" =~ ^(move|mv)$ ) ]]; then
@@ -34,7 +30,7 @@ _todo()
completions=$COMMANDS;; completions=$COMMANDS;;
addto|listfile|lf) addto|listfile|lf)
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile);; completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile);;
-*) completions="$allCommands $OPTS";; -*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS";;
*) case "$cur" in *) case "$cur" in
+*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj) +*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj)
COMPREPLY=( $( compgen -W "$completions" -- $cur )) COMPREPLY=( $( compgen -W "$completions" -- $cur ))
@@ -62,7 +58,7 @@ _todo()
# a safety check of the ls action output. # a safety check of the ls action output.
local todo=$( \ local todo=$( \
eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' | \ eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' | \
sed -e 's/^ *[0-9]\+ //' -e 's/\((.) \)[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/' \ sed -e 's/^ *[0-9]\{1,\} //' -e 's/\((.) \)[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/' \
-e 's/\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/' \ -e 's/\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/' \
-e 's/[[:space:]]*$//' \ -e 's/[[:space:]]*$//' \
-e '1q' \ -e '1q' \