Compare commits

..

3 Commits

Author SHA1 Message Date
Ingo Karkat
f45bbd1a1d Minor: Move cleaninput call closer to sed command. 2012-04-19 14:19:30 +02:00
Ingo Karkat
e0b93e48fb Refactoring: Extract duplicated regexp for priority and date. 2012-04-19 14:12:35 +02:00
Ingo Karkat
24d0fb003a FIX: Replacement with priority and date doesn't replace existing date. 2012-04-19 14:08:39 +02:00
10 changed files with 37 additions and 317 deletions

View File

@@ -1,18 +0,0 @@
#!/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"
}

View File

@@ -164,4 +164,12 @@ TODO: Replaced task with:
1 (A) 2010-07-04 this also has a new date 1 (A) 2010-07-04 this also has a new date
EOF EOF
echo '2009-02-13 this is just a new one' > todo.txt
test_todo_session 'replace with prepended priority and date replaces existing date' <<EOF
>>> todo.sh replace 1 '(B) 2010-07-04 this also has a new date'
1 2009-02-13 this is just a new one
TODO: Replaced task with:
1 (B) 2010-07-04 this also has a new date
EOF
test_done test_done

View File

@@ -1,44 +0,0 @@
#!/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

View File

@@ -1,66 +0,0 @@
#!/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

View File

@@ -1,20 +0,0 @@
#!/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,9 +4,19 @@ test_description='custom actions functionality
This test covers the contract between todo.sh and custom actions. This test covers the contract between todo.sh and custom actions.
' '
. ./actions-test-lib.sh
. ./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" make_action "foo"
test_todo_session 'executable action' <<EOF test_todo_session 'executable action' <<EOF
>>> todo.sh foo >>> todo.sh foo

View File

@@ -1,44 +0,0 @@
#!/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

View File

@@ -1,76 +0,0 @@
#!/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

54
todo.sh
View File

@@ -54,7 +54,7 @@ shorthelp()
del|rm ITEM# [TERM] del|rm ITEM# [TERM]
depri|dp ITEM#[, ITEM#, ITEM#, ...] depri|dp ITEM#[, ITEM#, ITEM#, ...]
do ITEM#[, ITEM#, ITEM#, ...] do ITEM#[, ITEM#, ITEM#, ...]
help [ACTION...] help
list|ls [TERM...] list|ls [TERM...]
listall|lsa [TERM...] listall|lsa [TERM...]
listaddons listaddons
@@ -154,12 +154,6 @@ help()
EndVerboseHelp EndVerboseHelp
actionsHelp
addonHelp
}
actionsHelp()
{
cat <<-EndActionsHelp cat <<-EndActionsHelp
Built-in Actions: Built-in Actions:
add "THING I NEED TO DO +project @context" add "THING I NEED TO DO +project @context"
@@ -206,9 +200,8 @@ actionsHelp()
do ITEM#[, ITEM#, ITEM#, ...] do ITEM#[, ITEM#, ITEM#, ...]
Marks task(s) on line ITEM# as done in todo.txt. Marks task(s) on line ITEM# as done in todo.txt.
help [ACTION...] help
Display help about usage, options, built-in and add-on actions, Display this help message.
or just the usage help for the passed ACTION(s).
list [TERM...] list [TERM...]
ls [TERM...] ls [TERM...]
@@ -285,6 +278,9 @@ actionsHelp()
List the one-line usage of all built-in and add-on actions. List the one-line usage of all built-in and add-on actions.
EndActionsHelp EndActionsHelp
addonHelp
exit 1
} }
addonHelp() addonHelp()
@@ -306,25 +302,6 @@ addonHelp()
fi 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() die()
{ {
echo "$*" echo "$*"
@@ -412,21 +389,22 @@ replaceOrPrepend()
else else
input=$* input=$*
fi fi
cleaninput "for sed"
# Retrieve existing priority and prepended date # Retrieve existing priority and prepended date
priority=$(sed -e "$item!d" -e $item's/^\((.) \)\{0,1\}\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{0,1\}.*/\1/' "$TODO_FILE") local -r priAndDateExpr='^\((.) \)\{0,1\}\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{0,1\}'
prepdate=$(sed -e "$item!d" -e $item's/^\((.) \)\{0,1\}\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{0,1\}.*/\2/' "$TODO_FILE") priority=$(sed -e "$item!d" -e "${item}s/${priAndDateExpr}.*/\\1/" "$TODO_FILE")
prepdate=$(sed -e "$item!d" -e "${item}s/${priAndDateExpr}.*/\\2/" "$TODO_FILE")
if [ "$prepdate" -a "$action" = "replace" ] && [ "$(echo "$input"|sed -e 's/^\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\}\)\{0,1\}.*/\1/')" ]; then if [ "$prepdate" -a "$action" = "replace" ] && [ "$(echo "$input"|sed -e "s/${priAndDateExpr}.*/\\1\\2/")" ]; then
# If the replaced text starts with a date, it will replace the existing # If the replaced text starts with a [priority +] date, it will replace
# date, too. # the existing date, too.
prepdate= prepdate=
fi fi
# Temporarily remove any existing priority and prepended date, perform the # Temporarily remove any existing priority and prepended date, perform the
# change (replace/prepend) and re-insert the existing priority and prepended # change (replace/prepend) and re-insert the existing priority and prepended
# date again. # date again.
cleaninput "for sed"
sed -i.bak -e "$item s/^${priority}${prepdate}//" -e "$item s|^.*|${priority}${prepdate}${input}${backref}|" "$TODO_FILE" sed -i.bak -e "$item s/^${priority}${prepdate}//" -e "$item s|^.*|${priority}${prepdate}${input}${backref}|" "$TODO_FILE"
if [ $TODOTXT_VERBOSE -gt 0 ]; then if [ $TODOTXT_VERBOSE -gt 0 ]; then
getNewtodo "$item" getNewtodo "$item"
@@ -1098,11 +1076,6 @@ case $action in
;; ;;
"help" ) "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 [ -t 1 ] ; then # STDOUT is a TTY
if which "${PAGER:-less}" >/dev/null 2>&1; then if which "${PAGER:-less}" >/dev/null 2>&1; then
# we have a working PAGER (or less as a default) # we have a working PAGER (or less as a default)
@@ -1110,7 +1083,6 @@ case $action in
fi fi
fi fi
help # just in case something failed above, we go ahead and just spew to STDOUT help # just in case something failed above, we go ahead and just spew to STDOUT
fi
;; ;;
"shorthelp" ) "shorthelp" )

View File

@@ -28,8 +28,6 @@ _todo()
case "$prev" in case "$prev" in
command) command)
completions=$COMMANDS;; completions=$COMMANDS;;
help)
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons)";;
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="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS";; -*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS";;