Compare commits

...

9 Commits

Author SHA1 Message Date
Ingo Karkat
c1dcd0ed78 test-lib: Also check completion exit code.
The completion may unexpectedly abort somewhere.

Additionally, reformat the failure messages (don't prepend a "*", this should be reserved to mark the individual test runs) and use "compreply" instead of "output", so that it's already clear from the diff output that the completion is being tested.
2012-02-23 09:14:42 +01:00
Ingo Karkat
c9d1993dc8 test-lib: Avoid empty line in diff when no completion.
There should be a trailing newline when there are completions (to avoid diff complaining about "no trailing newline", but not when there are no completions at all.
2012-02-23 09:14:42 +01:00
Ingo Karkat
451dbdda6b Merge duplicate test files for listproj.
t1260-listprj.sh was accidentally created; the tests should be in t1320-listproj.sh.
2012-02-23 09:14:42 +01:00
Ingo Karkat
060e81aa05 ENH: completion offers projects and contexts from done.txt.
This is useful when there are no open projects/contexts any more, but one wants to re-use an existing name.
2012-02-23 09:14:42 +01:00
Ingo Karkat
296bad334d Add tests for project and context completion. 2012-02-23 09:14:42 +01:00
Ingo Karkat
3b90d09b27 Add testing of todo_completion.
Before adding any more features to todo_completion, I feel like I need test coverage, so this is a first stab at testing the completion results, via a new test function test_todo_completion.
Some basic tests showcase the capabilities.

Note: test-lib.sh now uses arrays, therefore all tests must use /bin/bash, not /bin/sh to avoid errors when sourcing test-lib. For consistency with todo.sh, we should have used Bash everywhere, anyway. Also note that t2000-multiline.sh needs some more quoting to avoid "Bash: ambiguous redirect" errors.
2012-02-23 09:14:41 +01:00
Ingo Karkat
46afb7f46a ENH: TODOTXT_SOURCEVAR enables different source file for listproj. 2012-02-23 09:14:41 +01:00
Ingo Karkat
9e13dfd290 ENH: TODOTXT_SOURCEVAR enables different source file for listcon.
To be used by todo_completion (to offer candidates from done.txt when there are no matches in todo.txt), and maybe by custom addons.
2012-02-23 09:14:41 +01:00
Gina Trapani
fbee428e75 Merge pull request #76 from inkarkat/reintroduce-mawk-support
Revert to safer POSIX AWK regexp.
2012-02-21 11:44:37 -08:00
36 changed files with 283 additions and 96 deletions

View File

@@ -125,10 +125,10 @@ Writing Tests
------------- -------------
The test script is written as a shell script. It should start The test script is written as a shell script. It should start
with the standard "#!/bin/sh" with copyright notices, and an with the standard "#!/bin/bash" with copyright notices, and an
assignment to variable 'test_description', like this: assignment to variable 'test_description', like this:
#!/bin/sh #!/bin/bash
# #
# Copyright (c) 2005 Junio C Hamano # Copyright (c) 2005 Junio C Hamano
# #
@@ -186,6 +186,17 @@ library for your script to use.
expected output. (See below for how to generate transcripts expected output. (See below for how to generate transcripts
easily.) easily.)
- test_todo_completion <message> <cmdline> <completions>
This takes three strings as parameter. Based on <cmdline>,
the todo_completion script is triggered in the current test
environment and completions are compared with <completions>,
which should be a space-separated list. Include a trailing
space in <cmdline> when you want to check new argument
completion; otherwise, completion is triggered with the
context of the last argument. <message> should state what it
is testing.
- test_tick [interval] - test_tick [interval]
The test harness has an internal view of time which is The test harness has an internal view of time which is

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='todo.sh configuration file location test_description='todo.sh configuration file location

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='todo.sh basic null functionality test. test_description='todo.sh basic null functionality test.

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='todo.sh actions.d test_description='todo.sh actions.d

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='no old-style backtick command substitution test_description='no old-style backtick command substitution

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic add and list functionality test_description='basic add and list functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='test the date on add feature test_description='test the date on add feature

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic addto and list functionality test_description='basic addto and list functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='test the date on addto feature test_description='test the date on addto feature

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic replace functionality test_description='basic replace functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic priority functionality test_description='basic priority functionality
' '

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='list priority functionality test_description='list priority functionality
' '

View File

@@ -1,42 +0,0 @@
#!/bin/sh
test_description='list project functionality
'
. ./test-lib.sh
cat > todo.txt <<EOF
(B) smell the uppercase Roses +roses @outside +shared
(C) notice the sunflowers +sunflowers @garden +shared +landscape
stop
EOF
test_todo_session 'basic listproj' <<EOF
>>> todo.sh listproj
+landscape
+roses
+shared
+sunflowers
EOF
test_todo_session 'listproj with context' <<EOF
>>> todo.sh listproj @garden
+landscape
+shared
+sunflowers
EOF
TEST_TODO_CUSTOM=todo-custom.cfg
cat todo.cfg > "$TEST_TODO_CUSTOM"
cat >> "$TEST_TODO_CUSTOM" <<'EOF'
export DEFAULT='</color>'
export PRI_B='<color type=green>'
export PRI_C='<color type=blue>'
export TODOTXT_FINAL_FILTER='grep -i roses'
EOF
test_todo_session 'listproj with context special cases' <<EOF
>>> todo.sh -+ -d "$TEST_TODO_CUSTOM" listproj @garden
+landscape
+shared
+sunflowers
EOF
test_done

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
# #
test_description='list functionality test_description='list functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
# #
test_description='listcon functionality test_description='listcon functionality
@@ -55,4 +55,23 @@ test_todo_session 'listcon e-mail address test' <<EOF
@con02 @con02
EOF EOF
cat > todo.txt <<EOF
@con01 -- Some context 1 task
EOF
cat > done.txt <<EOF
x 2012-02-21 @done01 -- Some context 1 done task
x 2012-02-21 @done02 -- Some context 2 done task
EOF
test_todo_session 'listcon from done tasks' <<'EOF'
>>> TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh listcon
@done01
@done02
EOF
test_todo_session 'listcon from combined open + done tasks' <<'EOF'
>>> TODOTXT_SOURCEVAR='("$TODO_FILE" "$DONE_FILE")' todo.sh listcon
@con01
@done01
@done02
EOF
test_done test_done

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
# #
test_description='listproj functionality test_description='listproj functionality
@@ -55,4 +55,63 @@ test_todo_session 'listproj embedded + test' <<EOF
+prj02 +prj02
EOF EOF
cat > todo.txt <<EOF
(B) smell the uppercase Roses +roses @outside +shared
(C) notice the sunflowers +sunflowers @garden +shared +landscape
stop
EOF
test_todo_session 'basic listproj' <<EOF
>>> todo.sh listproj
+landscape
+roses
+shared
+sunflowers
EOF
test_todo_session 'listproj with context' <<EOF
>>> todo.sh listproj @garden
+landscape
+shared
+sunflowers
EOF
TEST_TODO_CUSTOM=todo-custom.cfg
cat todo.cfg > "$TEST_TODO_CUSTOM"
cat >> "$TEST_TODO_CUSTOM" <<'EOF'
export DEFAULT='</color>'
export PRI_B='<color type=green>'
export PRI_C='<color type=blue>'
export TODOTXT_FINAL_FILTER='grep -i roses'
EOF
test_todo_session 'listproj with context special cases' <<EOF
>>> todo.sh -+ -d "$TEST_TODO_CUSTOM" listproj @garden
+landscape
+shared
+sunflowers
EOF
cat > todo.txt <<EOF
+prj01 -- Some project 1 task
EOF
cat > done.txt <<EOF
x 2012-02-21 +done01 -- Special project 1 done task
x 2012-02-21 +done02 -- Some project 2 done task
EOF
test_todo_session 'listproj from done tasks' <<'EOF'
>>> TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh listproj
+done01
+done02
EOF
test_todo_session 'listproj from done tasks with filtering' <<'EOF'
>>> TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh listproj Special
+done01
EOF
test_todo_session 'listproj from combined open + done tasks' <<'EOF'
>>> TODOTXT_SOURCEVAR='("$TODO_FILE" "$DONE_FILE")' todo.sh listproj
+done01
+done02
+prj01
EOF
test_done test_done

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
# #
test_description='list highlighting test_description='list highlighting

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='listall functionality test_description='listall functionality
' '

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic prepend functionality test_description='basic prepend functionality
' '

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='do functionality test_description='do functionality
' '

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic append functionality test_description='basic append functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic depriority functionality test_description='basic depriority functionality
' '

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic del functionality test_description='basic del functionality
' '

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='archive functionality test_description='archive functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='deduplicate functionality test_description='deduplicate functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='report functionality test_description='report functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='Multi-line functionality' test_description='Multi-line functionality'
@@ -8,18 +8,18 @@ test_description='Multi-line functionality'
# Create the expected file # Create the expected file
echo "1 smell the cheese echo "1 smell the cheese
TODO: Replaced task with: TODO: Replaced task with:
1 eat apples eat oranges drink milk">$HOME/expect.multi 1 eat apples eat oranges drink milk">"$HOME/expect.multi"
test_expect_success 'multiline squash item replace' ' test_expect_success 'multiline squash item replace' '
( (
# Prepare single line todo file # Prepare single line todo file
cat /dev/null > $HOME/todo.txt cat /dev/null > "$HOME/todo.txt"
"$HOME/bin/todo.sh" add smell the cheese "$HOME/bin/todo.sh" add smell the cheese
# Run replace # Run replace
"$HOME/bin/todo.sh" replace 1 "eat apples "$HOME/bin/todo.sh" replace 1 "eat apples
eat oranges eat oranges
drink milk" > $HOME/output.multi drink milk" > "$HOME/output.multi"
# Test output against expected # Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi" diff "$HOME/output.multi" "$HOME/expect.multi"
@@ -34,18 +34,18 @@ fi
## Add test ## Add test
# Create the expected file # Create the expected file
echo "2 eat apples eat oranges drink milk echo "2 eat apples eat oranges drink milk
TODO: 2 added.">$HOME/expect.multi TODO: 2 added.">"$HOME/expect.multi"
test_expect_success 'multiline squash item add' ' test_expect_success 'multiline squash item add' '
( (
# Prepare single line todo file # Prepare single line todo file
cat /dev/null > $HOME/todo.txt cat /dev/null > "$HOME/todo.txt"
"$HOME/bin/todo.sh" add smell the cheese "$HOME/bin/todo.sh" add smell the cheese
# Run add # Run add
"$HOME/bin/todo.sh" add "eat apples "$HOME/bin/todo.sh" add "eat apples
eat oranges eat oranges
drink milk" > $HOME/output.multi drink milk" > "$HOME/output.multi"
# Test output against expected # Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi" diff "$HOME/output.multi" "$HOME/expect.multi"
@@ -59,18 +59,18 @@ fi
## Append test ## Append test
# Create the expected file # Create the expected file
echo "1 smell the cheese eat apples eat oranges drink milk">$HOME/expect.multi echo "1 smell the cheese eat apples eat oranges drink milk">"$HOME/expect.multi"
test_expect_success 'multiline squash item append' ' test_expect_success 'multiline squash item append' '
( (
# Prepare single line todo file # Prepare single line todo file
cat /dev/null > $HOME/todo.txt cat /dev/null > "$HOME/todo.txt"
"$HOME/bin/todo.sh" add smell the cheese "$HOME/bin/todo.sh" add smell the cheese
# Run append # Run append
"$HOME/bin/todo.sh" append 1 "eat apples "$HOME/bin/todo.sh" append 1 "eat apples
eat oranges eat oranges
drink milk" > $HOME/output.multi drink milk" > "$HOME/output.multi"
# Test output against expected # Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi" diff "$HOME/output.multi" "$HOME/expect.multi"
@@ -84,18 +84,18 @@ fi
## Prepend test ## Prepend test
# Create the expected file # Create the expected file
echo "1 eat apples eat oranges drink milk smell the cheese">$HOME/expect.multi echo "1 eat apples eat oranges drink milk smell the cheese">"$HOME/expect.multi"
test_expect_success 'multiline squash item prepend' ' test_expect_success 'multiline squash item prepend' '
( (
# Prepare single line todo file # Prepare single line todo file
cat /dev/null > $HOME/todo.txt cat /dev/null > "$HOME/todo.txt"
"$HOME/bin/todo.sh" add smell the cheese "$HOME/bin/todo.sh" add smell the cheese
# Run prepend # Run prepend
"$HOME/bin/todo.sh" prepend 1 "eat apples "$HOME/bin/todo.sh" prepend 1 "eat apples
eat oranges eat oranges
drink milk" > $HOME/output.multi drink milk" > "$HOME/output.multi"
# Test output against expected # Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi" diff "$HOME/output.multi" "$HOME/expect.multi"
@@ -110,18 +110,18 @@ fi
## Multiple line addition ## Multiple line addition
# Create the expected file # Create the expected file
echo "2 eat apples echo "2 eat apples
TODO: 2 added." > $HOME/expect.multi TODO: 2 added." > "$HOME/expect.multi"
echo "3 eat oranges echo "3 eat oranges
TODO: 3 added." >>$HOME/expect.multi TODO: 3 added." >>"$HOME/expect.multi"
echo "4 drink milk echo "4 drink milk
TODO: 4 added." >> $HOME/expect.multi TODO: 4 added." >>"$HOME/expect.multi"
test_expect_success 'actual multiline add' ' test_expect_success 'actual multiline add' '
( (
# Run addm # Run addm
"$HOME/bin/todo.sh" addm "eat apples "$HOME/bin/todo.sh" addm "eat apples
eat oranges eat oranges
drink milk" > $HOME/output.multi drink milk" > "$HOME/output.multi"
# Test output against expected # Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi" diff "$HOME/output.multi" "$HOME/expect.multi"

18
tests/t6000-completion.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
#
test_description='Bash completion functionality
This test checks basic todo_completion of actions and options
'
. ./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 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 'arguments beginning with a' 'todo.sh a' 'add a addto addm append app archive'
test_todo_completion 'all options' 'todo.sh -' "$OPTIONS"
test_todo_completion 'all actions after command action' 'todo.sh command ' "$ACTIONS"
test_done

View File

@@ -0,0 +1,27 @@
#!/bin/bash
#
test_description='Bash context completion functionality
This test checks todo_completion of contexts
'
. ./test-lib.sh
cat > todo.txt <<EOF
(B) smell the +roses @outside @outdoor +shared
notice the sunflowers +sunflowers @outside @garden +shared +landscape
stop
EOF
cat > done.txt <<EOF
x 2012-02-21 +herbs @oriental buy spices
x 2012-02-21 +slack @home watch tv
EOF
test_todo_completion 'all contexts' 'todo.sh list @' '@garden @outdoor @outside'
test_todo_completion 'contexts beginning with o' 'todo.sh list @o' '@outdoor @outside'
test_todo_completion 'contexts beginning with outs' 'todo.sh list @outs' '@outside'
test_todo_completion 'contexts beginning with x' 'todo.sh list @x' ''
test_todo_completion 'contexts from done tasks beginning with h' 'todo.sh list @h' '@home'
test_todo_completion 'contexts from done tasks beginning with or' 'todo.sh list @or' '@oriental'
test_done

View File

@@ -0,0 +1,27 @@
#!/bin/bash
#
test_description='Bash project completion functionality
This test checks todo_completion of projects
'
. ./test-lib.sh
cat > todo.txt <<EOF
(B) smell the +roses @outside @outdoor +shared
notice the sunflowers +sunflowers @outside @garden +shared +landscape
stop
EOF
cat > done.txt <<EOF
x 2012-02-21 +herbs @oriental buy spices
x 2012-02-21 +slack @home watch tv
EOF
test_todo_completion 'all projects' 'todo.sh list +' '+landscape +roses +shared +sunflowers'
test_todo_completion 'projects beginning with s' 'todo.sh list +s' '+shared +sunflowers'
test_todo_completion 'projects beginning with ro' 'todo.sh list +ro' '+roses'
test_todo_completion 'projects beginning with x' 'todo.sh list +x' ''
test_todo_completion 'projects from done tasks beginning with h' 'todo.sh list +h' '+herbs'
test_todo_completion 'projects from done tasks beginning with sl' 'todo.sh list +sl' '+slack'
test_done

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='custom actions functionality test_description='custom actions functionality

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='basic tests imported from previous framework test_description='basic tests imported from previous framework
' '

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
# #
# Copyright (c) 2005 Junio C Hamano # Copyright (c) 2005 Junio C Hamano
# #
@@ -305,7 +305,7 @@ $cmp_output"
else else
cmp_output=$(test_cmp expect output) cmp_output=$(test_cmp expect output)
test_failure_ "$2" "$3" " test_failure_ "$2" "$3" "
* expected exit code $1, actual ${eval_ret}${cmp_output:+ expected exit code $1, actual ${eval_ret}${cmp_output:+
}${cmp_output}" }${cmp_output}"
fi fi
fi fi
@@ -324,7 +324,7 @@ test_expect_code () {
test_ok_ "$2" test_ok_ "$2"
else else
test_failure_ "$2" "$3" " test_failure_ "$2" "$3" "
* expected exit code $1, actual ${eval_ret}" expected exit code $1, actual ${eval_ret}"
fi fi
fi fi
echo >&3 "" echo >&3 ""
@@ -632,6 +632,59 @@ EOF
exit 0 exit 0
} }
test_todo_completion () {
test "$#" = 3 ||
error "bug in the test script: not 3 parameters to test_todo_completion"
if ! test_skip "$@"
then
description=$1
expected=$3
if [ "${2: -1}" = ' ' ]
then
offset=0
say >&3 "expecting completions after: '$2'"
else
offset=1
say >&3 "expecting context completions for: '$2'"
fi
SAVEIFS=$IFS
IFS=' ' set -- $2
COMP_WORDS=("$@")
COMP_CWORD=$(($# - $offset))
IFS=' ' set -- $expected
EXPECT=("$@")
source "$TEST_DIRECTORY/../todo_completion"
_todo
ret=$?
if [ "$ret" = 0 ]
then
IFS=$'\n'
printf "%s${EXPECT:+\\n}" "${EXPECT[*]}" > expect
printf "%s${COMPREPLY:+\\n}" "${COMPREPLY[*]}" > compreply
IFS=$SAVEIFS
if [ ${#COMPREPLY[@]} -eq ${#EXPECT[@]} ]
then
if [ "${COMPREPLY[*]}" = "${EXPECT[*]}" ]
then
test_ok_ "$description"
else
test_failure_ "$description" "$(test_cmp expect compreply)"
fi
else
test_failure_ "$description" "expected ${#EXPECT[@]} completion(s), got ${#COMPREPLY[@]}:
$(test_cmp expect compreply)"
fi
else
test_failure_ "$description" "expected completions, actual exit code $ret"
fi
fi
echo >&3 ""
}
test_init_todo "$test" test_init_todo "$test"
# Use -P to resolve symlinks in our working directory so that the pwd # Use -P to resolve symlinks in our working directory so that the pwd
# in subprocesses equals our $PWD (for pathname comparisons). # in subprocesses equals our $PWD (for pathname comparisons).

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
test_description='Providing an interactive shell in the proper environment' test_description='Providing an interactive shell in the proper environment'
. ./test-lib.sh . ./test-lib.sh

11
todo.sh
View File

@@ -136,7 +136,7 @@ help()
EndOptionsHelp EndOptionsHelp
[ $TODOTXT_VERBOSE -gt 1 ] && cat <<-EndVerboseHelp [ $TODOTXT_VERBOSE -gt 1 ] && cat <<-'EndVerboseHelp'
Environment variables: Environment variables:
TODOTXT_AUTO_ARCHIVE is same as option -a (0)/-A (1) TODOTXT_AUTO_ARCHIVE is same as option -a (0)/-A (1)
TODOTXT_CFG_FILE=CONFIG_FILE is same as option -d CONFIG_FILE TODOTXT_CFG_FILE=CONFIG_FILE is same as option -d CONFIG_FILE
@@ -149,6 +149,7 @@ help()
TODOTXT_DEFAULT_ACTION="" run this when called with no arguments TODOTXT_DEFAULT_ACTION="" run this when called with no arguments
TODOTXT_SORT_COMMAND="sort ..." customize list output TODOTXT_SORT_COMMAND="sort ..." customize list output
TODOTXT_FINAL_FILTER="sed ..." customize list after color, P@+ hiding TODOTXT_FINAL_FILTER="sed ..." customize list after color, P@+ hiding
TODOTXT_SOURCEVAR=\$DONE_FILE use another source for listcon, listproj
EndVerboseHelp EndVerboseHelp
@@ -1128,12 +1129,16 @@ case $action in
;; ;;
"listcon" | "lsc" ) "listcon" | "lsc" )
grep -o '[^ ]*@[^ ]\+' "$TODO_FILE" | grep '^@' | sort -u FILE=$TODO_FILE
[ "$TODOTXT_SOURCEVAR" ] && eval "FILE=$TODOTXT_SOURCEVAR"
grep -ho '[^ ]*@[^ ]\+' "${FILE[@]}" | grep '^@' | sort -u
;; ;;
"listproj" | "lsprj" ) "listproj" | "lsprj" )
FILE=$TODO_FILE
[ "$TODOTXT_SOURCEVAR" ] && eval "FILE=$TODOTXT_SOURCEVAR"
shift shift
eval "$(filtercommand 'cat "$TODO_FILE"' '' "$@")" | grep -o '[^ ]*+[^ ]\+' | grep '^+' | sort -u eval "$(filtercommand 'cat "${FILE[@]}"' '' "$@")" | grep -o '[^ ]*+[^ ]\+' | grep '^+' | sort -u
;; ;;
"listpri" | "lsp" ) "listpri" | "lsp" )

View File

@@ -35,8 +35,18 @@ _todo()
completions=$(TODOTXT_VERBOSE=0 todo.sh command listfile);; completions=$(TODOTXT_VERBOSE=0 todo.sh command listfile);;
-*) completions="$allCommands $OPTS";; -*) completions="$allCommands $OPTS";;
*) case "$cur" in *) case "$cur" in
+*) completions=$(TODOTXT_VERBOSE=0 todo.sh command listproj);; +*) completions=$(TODOTXT_VERBOSE=0 todo.sh command listproj)
@*) completions=$(TODOTXT_VERBOSE=0 todo.sh command listcon);; COMPREPLY=( $( compgen -W "$completions" -- $cur ))
[ ${#COMPREPLY[@]} -gt 0 ] && return 0
# Fall back to projects extracted from done tasks.
completions=$(TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh command listproj)
;;
@*) completions=$(TODOTXT_VERBOSE=0 todo.sh command listcon)
COMPREPLY=( $( compgen -W "$completions" -- $cur ))
[ ${#COMPREPLY[@]} -gt 0 ] && return 0
# Fall back to contexts extracted from done tasks.
completions=$(TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh command listcon)
;;
*) if [[ "$cur" =~ ^[0-9]+$ ]]; then *) if [[ "$cur" =~ ^[0-9]+$ ]]; then
# Remove the (padded) task number; we prepend the # Remove the (padded) task number; we prepend the
# user-provided $cur instead. # user-provided $cur instead.