Compare commits

...

53 Commits
v2.4.0 ... v2.6

Author SHA1 Message Date
Yujie Wu
2a65615c7a Added a case for the fixed replace command. 2010-05-08 08:52:59 +08:00
Yujie Wu
d7e194b09d Fixed bug for replace command. 2010-05-08 08:52:59 +08:00
Jared Cordasco
a4ab8a808a Tab fixes. 2010-04-16 06:12:00 +08:00
Gina Trapani
e395ac78d8 Fix line endings 2010-03-26 12:55:55 -07:00
Paul Mansfield
6fc2d81919 Bugfix: Old versions of bash do not have =~
Versions of bash before 3.0 do not have =~ syntax to match on a regex.
Changed to using a simple grep -c test instead.
Fixes issues with osx and Solaris 9 and before.
2010-02-23 23:05:03 +00:00
Jared Cordasco
b6467eaa64 Updated _list() output to match updated addto. Adjusted tests to match.
- _list() now shows the capitalized filename in place of 'TODO:'.
  For example, listing garden.txt produces a output prefixed by 'GARDEN:'
  This eliminates the ' from $FILE' part of the _list() output. All tests
  were adjusted to match this new output.
2010-01-12 14:42:02 -05:00
Jared Cordasco
2d3820394a Refactored various add functionality to one function. Added tests.
- 'add' and 'addm' now 'addto' with $TODO_FILE instead of user supplied file

- 'addto' now shows the capitalized filename in place of 'TODO:'.
  For example, adding to garden.txt produces a output prefixed by 'GARDEN:'
  (Probably the most controversial part of this commit and up for
  discussion. If kept, the 'listfile' output should be made to match.
  Note that this convention would then minimize standard output by
  dropping the file name.)

- All existing add/addm/add-date tests pass. Two new test sequences were
  added to test 'addto' and 'listfile' functionality.

- A space/tab nuissance was cleared up in the tests/README file.
2010-01-10 01:16:11 -05:00
Jared Cordasco
394c4c748a Correctly fixed regexp quoting issue for bash v3.1.x and v3.2.x.
See: http://stackoverflow.com/questions/218156/bash-regex-with-quotes
2010-01-06 21:05:22 -05:00
Jared Cordasco
4c76f04a82 Merge branch 'master' into personal_opts (w/ spacing corrections) 2010-01-05 23:26:08 -06:00
Gina Trapani
bf537934d7 Removed vim plugin; should be in separate repo for addons 2010-01-05 20:54:14 -08:00
Jared Cordasco
2bb14eb9bc Consolidated TODOTXT_VERBOSE tests. 2010-01-05 15:45:36 -05:00
Jared Cordasco
99511169c3 Fixed erroneous hide/show comments. 2010-01-05 15:38:24 -05:00
Jared Cordasco
acc881f0dd Faster here document outputs. (Help/Usage messages) 2010-01-05 15:33:34 -05:00
Jared Cordasco
d337933fd9 Changed odd tabs to spaces. 2010-01-05 15:33:34 -05:00
Jared Cordasco
0a7e6337b2 Quoting regexp to parse properly. 2010-01-04 17:01:29 -05:00
Brian Phillips
0e326067e3 fixed tabs/spaces, also set height on new window 2009-12-03 13:14:13 -06:00
Brian Phillips
f6cf3fe76f fixed auto-complete function name for contexts 2009-12-02 15:55:59 -06:00
Brian Phillips
20e04d5a4d more 'silent' additions 2009-12-02 15:38:46 -06:00
Brian Phillips
9c56d2137a added 'silent' to a bunch of calls 2009-12-02 15:26:32 -06:00
Brian Phillips
ceed8bf841 more tweaks 2009-12-02 15:17:12 -06:00
Brian Phillips
b8ced51a22 added some additional mappings, plus a project context 2009-12-02 14:37:36 -06:00
Brian Phillips
9a56bdd4ed vim support! (first cut, anyway) 2009-12-02 12:09:51 -06:00
Brian Phillips
9b580acf14 support PAGER pipe for help output 2009-12-02 08:55:46 -06:00
Paul Mansfield
0d5904658e Portability fixes
* Removed last echo -e instances, no support in OSX
2009-09-21 03:17:10 +01:00
Paul Mansfield
97866082e6 Small change for addm test case.
* Seems echo -e isn't multiplatform compatible. Using >> for append
  instead.
2009-09-17 23:52:43 +01:00
Mike West
5f9fd4c759 Bug Fix: tasks whose ID begins with '0' ought to be ignored.
*   Fixed regex in `_list` to exclude lines that begin with whitespace,
    as the ' ' => '0' replacement hadn't yet been performed.

*   Added test cases to `t1300-ls.sh` to check for this condition.
2009-09-14 21:21:25 +02:00
Gina Trapani
5a49f4b5d5 Merge branch 'the1ts/addm' 2009-09-08 11:58:04 -07:00
Gina Trapani
f8e6a8d69d Merge branch 'the1ts/master' 2009-09-08 11:57:20 -07:00
Paul Mansfield
2983917f25 whitespace fix 2009-09-06 19:05:46 +01:00
Paul Mansfield
7a87077dfc Added new action addm
This allows addition of multiple todo items by sending multiple lines.
2009-09-06 18:53:31 +01:00
Paul Mansfield
51dd50b41d Tighten the regex in Issue 6 bugfix.
Checks for complete action names before escaping &'s
2009-09-05 23:55:22 +01:00
Paul Mansfield
ddaf9ade22 Bug Fix: Issue 6 append and replace unexpected behavior if there's an & in task (even in quotes)
Using the cleaninput function, to escape &'s on certain actions.
Currently the actions needing escaped &'s are append, prepend and replace.
Other actions including add need unescaped &'s.
2009-09-05 20:36:38 +01:00
Gina Trapani
ce8a0a7875 Merge branch 'the1ts/master' 2009-09-04 16:11:50 -07:00
Paul Mansfield
5e71728cda Added a new variable $TODO_FULL_SH
This gives access to the full path of the script. It may prove useful
for addon developers to rerun todo.sh from within their addons, in order
to populate variables for context, projects etc. As we have the config
and actions directory available via variables, this is a missing piece.
2009-09-04 13:37:07 +01:00
Paul Mansfield
f44bcfb067 Bug Fix, better fix for "add does not escape line breaks"
Now removes windows and unix style line breaks. Each test has a windows
and a unix style line break.
2009-09-04 12:23:48 +01:00
Gina Trapani
a19a3616c4 Merge branch 'the1ts/master' 2009-09-03 10:45:03 -07:00
Paul Mansfield
229737bd2f Bug Fix: Issue 1
Added a cleanitem function, this replaces newlines with a space.
Currently this is used in the add, append, prepend and replace actions.
2009-09-02 23:30:14 +01:00
Gina Trapani
857121090a Merge branch 'FND/disable_final_filter' 2009-09-01 09:53:37 -07:00
FND
490f5d34e8 added option to disable final filter
The option marker was chosen as "-x" here.
Alternatives might be "-X" or "-*".
2009-08-30 09:48:44 +01:00
Paul Mansfield
7baf051942 Bug Fix: do: no safeguard to do twice
Tests item is not marked done before attempting to mark item as "done".
2009-08-29 21:13:38 +01:00
Gina Trapani
266d9e1258 Merge branch 'mivok/master' 2009-08-26 16:21:14 -07:00
Gina Trapani
e0b3ea1da9 Added new multiple do capability to help message 2009-08-26 15:51:27 -07:00
Gina Trapani
35e80b3f33 Merge branch 'the1ts/master' 2009-08-26 15:34:39 -07:00
David A. Harding
294e2ac9a4 Fixed issue #14: invalid date range. Changed regex [ -~] to [ ~-]. 2009-08-22 16:01:20 -04:00
Paul Mansfield
8d78cc6053 Merge branch 'issues11' of git@github.com:the1ts/todo.txt-cli 2009-07-04 11:07:41 +01:00
Paul Mansfield
092e83404f Bug Fix: prepend not correct on prioritized tasks
Check for priority, if one exists, remove, prepend and add back.
If priority doesn't exist just runs the normal prepend functionality.
2009-06-27 12:51:48 +01:00
Paul Mansfield
91126e38aa Issue fix: Multiple do items
Can now do multiple items in one go.
Either comma seperated list or a whitespace seperated list
2009-06-25 00:14:00 +01:00
Paul Mansfield
5df58793a0 Bug fix: for replace with priority
Checks for priority, removes, does replace then reinserts priority
2009-06-24 23:25:33 +01:00
Paul Mansfield
d2e892049d Bugfix: Replace with priority set
Checks for a priority, if found removes priority does the replace
then adds back the priority.

Added a test for replace with priority set.
2009-06-24 19:24:53 +01:00
Paul Mansfield
0e2798acce Added test for prepend and priority fix 2009-06-24 14:06:25 +01:00
Mark Harrison
98569d5f8c Tests for additional default config file location 2009-06-22 22:34:45 -04:00
Mark Harrison
75622c4a72 Support use of $HOME/.todo/ for all todo.sh configuration 2009-06-22 22:26:16 -04:00
Paul Mansfield
f9bb135068 Fixing prepend and priority issue.
Check for priority, delete if found, prepend and add back priority.
Uses awk and sed, works in linux.
2009-06-22 22:47:13 +01:00
16 changed files with 1029 additions and 262 deletions

View File

@@ -105,7 +105,7 @@ First digit tells the family:
0 - the absolute basics and global stuff 0 - the absolute basics and global stuff
1 - basic every-day usage 1 - basic every-day usage
2 - add ins 2 - add ins
Second digit tells the particular command we are testing. Second digit tells the particular command we are testing.

View File

@@ -10,7 +10,7 @@ to find it somewhere else.
# Remove the pre-created todo.cfg to test behavior in its absence # Remove the pre-created todo.cfg to test behavior in its absence
rm -f todo.cfg rm -f todo.cfg
echo "Fatal error: Cannot read configuration file $HOME/todo.cfg" > expect echo "Fatal error: Cannot read configuration file $HOME/.todo/config" > expect
test_expect_success 'no config file' ' test_expect_success 'no config file' '
todo.sh > output 2>&1 || test_cmp expect output todo.sh > output 2>&1 || test_cmp expect output
' '
@@ -32,6 +32,15 @@ EOF
rm -f used_config rm -f used_config
test_expect_success 'config file (default location 1)' ' test_expect_success 'config file (default location 1)' '
mkdir .todo
cp test.cfg .todo/config
todo.sh > output;
test_cmp expect output && test -f used_config &&
rm -rf .todo
'
rm -f used_config
test_expect_success 'config file (default location 2)' '
cp test.cfg todo.cfg cp test.cfg todo.cfg
todo.sh > output; todo.sh > output;
test_cmp expect output && test -f used_config && test_cmp expect output && test -f used_config &&
@@ -39,7 +48,7 @@ test_expect_success 'config file (default location 1)' '
' '
rm -f used_config rm -f used_config
test_expect_success 'config file (default location 2)' ' test_expect_success 'config file (default location 3)' '
cp test.cfg .todo.cfg cp test.cfg .todo.cfg
todo.sh > output; todo.sh > output;
test_cmp expect output && test -f used_config && test_cmp expect output && test -f used_config &&

View File

@@ -12,7 +12,7 @@ when there are no todos.
# #
cat > expect <<EOF cat > expect <<EOF
-- --
TODO: 0 of 0 tasks shown from $HOME/todo.txt TODO: 0 of 0 tasks shown
EOF EOF
test_expect_success 'null ls' ' test_expect_success 'null ls' '
@@ -44,7 +44,7 @@ test_expect_success 'null listpri a' '
# #
cat > expect <<EOF cat > expect <<EOF
-- --
TODO: 0 of 0 tasks shown from $HOME/todo.tmp TODO: 0 of 0 tasks shown
EOF EOF
test_expect_success 'null lsa' ' test_expect_success 'null lsa' '

View File

@@ -17,7 +17,7 @@ TODO: 'notice the daisies' added on line 1.
>>> todo.sh list >>> todo.sh list
1 notice the daisies 1 notice the daisies
-- --
TODO: 1 of 1 tasks shown from $HOME/todo.txt TODO: 1 of 1 tasks shown
>>> todo.sh add smell the roses >>> todo.sh add smell the roses
TODO: 'smell the roses' added on line 2. TODO: 'smell the roses' added on line 2.
@@ -26,7 +26,7 @@ TODO: 'smell the roses' added on line 2.
1 notice the daisies 1 notice the daisies
2 smell the roses 2 smell the roses
-- --
TODO: 2 of 2 tasks shown from $HOME/todo.txt TODO: 2 of 2 tasks shown
EOF EOF
# #
@@ -36,12 +36,12 @@ test_todo_session 'basic list filtering' <<EOF
>>> todo.sh list daisies >>> todo.sh list daisies
1 notice the daisies 1 notice the daisies
-- --
TODO: 1 of 2 tasks shown from $HOME/todo.txt TODO: 1 of 2 tasks shown
>>> todo.sh list smell >>> todo.sh list smell
2 smell the roses 2 smell the roses
-- --
TODO: 1 of 2 tasks shown from $HOME/todo.txt TODO: 1 of 2 tasks shown
EOF EOF
test_todo_session 'case-insensitive filtering' <<EOF test_todo_session 'case-insensitive filtering' <<EOF
@@ -52,7 +52,21 @@ TODO: 'smell the uppercase Roses' added on line 3.
2 smell the roses 2 smell the roses
3 smell the uppercase Roses 3 smell the uppercase Roses
-- --
TODO: 2 of 3 tasks shown from $HOME/todo.txt TODO: 2 of 3 tasks shown
EOF
test_todo_session 'add with &' <<EOF
>>> todo.sh add "dig the garden & water the flowers"
TODO: 'dig the garden & water the flowers' added on line 4.
>>> todo.sh list
4 dig the garden & water the flowers
1 notice the daisies
2 smell the roses
3 smell the uppercase Roses
--
TODO: 4 of 4 tasks shown
EOF EOF
test_done test_done

View File

@@ -17,7 +17,7 @@ TODO: '2009-02-13 notice the daisies' added on line 1.
>>> todo.sh list >>> todo.sh list
1 2009-02-13 notice the daisies 1 2009-02-13 notice the daisies
-- --
TODO: 1 of 1 tasks shown from $HOME/todo.txt TODO: 1 of 1 tasks shown
EOF EOF
test_tick test_tick
@@ -30,7 +30,7 @@ TODO: '2009-02-14 smell the roses' added on line 2.
1 2009-02-13 notice the daisies 1 2009-02-13 notice the daisies
2 2009-02-14 smell the roses 2 2009-02-14 smell the roses
-- --
TODO: 2 of 2 tasks shown from $HOME/todo.txt TODO: 2 of 2 tasks shown
EOF EOF
test_tick test_tick
@@ -44,7 +44,7 @@ TODO: '2009-02-15 mow the lawn' added on line 3.
2 2009-02-14 smell the roses 2 2009-02-14 smell the roses
3 2009-02-15 mow the lawn 3 2009-02-15 mow the lawn
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
EOF EOF
# Switch to config file # Switch to config file
@@ -63,7 +63,7 @@ TODO: '2009-02-15 take out the trash' added on line 4.
3 2009-02-15 mow the lawn 3 2009-02-15 mow the lawn
4 2009-02-15 take out the trash 4 2009-02-15 take out the trash
-- --
TODO: 4 of 4 tasks shown from $HOME/todo.txt TODO: 4 of 4 tasks shown
EOF EOF
test_done test_done

78
tests/t1020-addtolistfile.sh Executable file
View File

@@ -0,0 +1,78 @@
#!/bin/sh
test_description='basic addto and list functionality
This test just makes sure the basic addto and listfile
commands work, including support for filtering.
'
. ./test-lib.sh
#
# Addto and listfile
#
test_todo_session 'nonexistant file' <<EOF
>>> todo.sh addto garden.txt notice the daisies
TODO: Destination file $HOME/garden.txt does not exist.
EOF
touch "$HOME/garden.txt"
test_todo_session 'basic addto/listfile' <<EOF
>>> todo.sh addto garden.txt notice the daisies
GARDEN: 'notice the daisies' added on line 1.
>>> todo.sh listfile garden.txt
1 notice the daisies
--
GARDEN: 1 of 1 tasks shown
>>> todo.sh addto garden.txt smell the roses
GARDEN: 'smell the roses' added on line 2.
>>> todo.sh listfile garden.txt
1 notice the daisies
2 smell the roses
--
GARDEN: 2 of 2 tasks shown
EOF
#
# Filter
#
test_todo_session 'basic listfile filtering' <<EOF
>>> todo.sh listfile garden.txt daisies
1 notice the daisies
--
GARDEN: 1 of 2 tasks shown
>>> todo.sh listfile garden.txt smell
2 smell the roses
--
GARDEN: 1 of 2 tasks shown
EOF
test_todo_session 'case-insensitive filtering' <<EOF
>>> todo.sh addto garden.txt smell the uppercase Roses
GARDEN: 'smell the uppercase Roses' added on line 3.
>>> todo.sh listfile garden.txt roses
2 smell the roses
3 smell the uppercase Roses
--
GARDEN: 2 of 3 tasks shown
EOF
test_todo_session 'addto with &' <<EOF
>>> todo.sh addto garden.txt "dig the garden & water the flowers"
GARDEN: 'dig the garden & water the flowers' added on line 4.
>>> todo.sh listfile garden.txt
4 dig the garden & water the flowers
1 notice the daisies
2 smell the roses
3 smell the uppercase Roses
--
GARDEN: 4 of 4 tasks shown
EOF
test_done

71
tests/t1030-addto-date.sh Executable file
View File

@@ -0,0 +1,71 @@
#!/bin/sh
test_description='test the date on addto feature
Tests paths by which we might automatically add
a date to each item.
'
. ./test-lib.sh
touch "$HOME/garden.txt"
#
# Add and list
#
test_todo_session 'cmd line first day' <<EOF
>>> todo.sh -t addto garden.txt notice the daisies
GARDEN: '2009-02-13 notice the daisies' added on line 1.
>>> todo.sh listfile garden.txt
1 2009-02-13 notice the daisies
--
GARDEN: 1 of 1 tasks shown
EOF
test_tick
test_todo_session 'cmd line second day' <<EOF
>>> todo.sh -t addto garden.txt smell the roses
GARDEN: '2009-02-14 smell the roses' added on line 2.
>>> todo.sh listfile garden.txt
1 2009-02-13 notice the daisies
2 2009-02-14 smell the roses
--
GARDEN: 2 of 2 tasks shown
EOF
test_tick
test_todo_session 'cmd line third day' <<EOF
>>> todo.sh -t addto garden.txt mow the lawn
GARDEN: '2009-02-15 mow the lawn' added on line 3.
>>> todo.sh listfile garden.txt
1 2009-02-13 notice the daisies
2 2009-02-14 smell the roses
3 2009-02-15 mow the lawn
--
GARDEN: 3 of 3 tasks shown
EOF
# Switch to config file
echo "export TODOTXT_DATE_ON_ADD=1" >> todo.cfg
# Bump the clock, for good measure.
test_tick 3600
test_todo_session 'config file third day' <<EOF
>>> todo.sh addto garden.txt take out the trash
GARDEN: '2009-02-15 take out the trash' added on line 4.
>>> todo.sh listfile garden.txt
1 2009-02-13 notice the daisies
2 2009-02-14 smell the roses
3 2009-02-15 mow the lawn
4 2009-02-15 take out the trash
--
GARDEN: 4 of 4 tasks shown
EOF
test_done

View File

@@ -26,7 +26,7 @@ replaced with
>>> todo.sh list >>> todo.sh list
1 smell the cows 1 smell the cows
-- --
TODO: 1 of 1 tasks shown from $HOME/todo.txt TODO: 1 of 1 tasks shown
>>> todo.sh replace 1 smell the roses >>> todo.sh replace 1 smell the roses
1: smell the cows 1: smell the cows
@@ -36,7 +36,7 @@ replaced with
>>> todo.sh list >>> todo.sh list
1 smell the roses 1 smell the roses
-- --
TODO: 1 of 1 tasks shown from $HOME/todo.txt TODO: 1 of 1 tasks shown
EOF EOF
cat > todo.txt <<EOF cat > todo.txt <<EOF
@@ -62,6 +62,28 @@ replaced with
4: collect the eggs 4: collect the eggs
EOF EOF
test_todo_session 'replace with priority' <<EOF
>>> todo.sh pri 4 a
4: (A) collect the eggs
TODO: 4 prioritized (A).
>>> todo.sh replace 4 "collect the bread"
4: (A) collect the eggs
replaced with
4: (A) collect the bread
>>> todo.sh replace 4 collect the eggs
4: (A) collect the bread
replaced with
4: (A) collect the eggs
EOF
test_todo_session 'replace with &' << EOF
>>> todo.sh replace 3 "thrash the hay & thresh the wheat"
3: jump on hay
replaced with
3: thrash the hay & thresh the wheat
EOF
test_todo_session 'replace error' << EOF test_todo_session 'replace error' << EOF
>>> todo.sh replace 10 "hej!" >>> todo.sh replace 10 "hej!"
=== 1 === 1

View File

@@ -22,7 +22,7 @@ test_todo_session 'basic priority' <<EOF
1 smell the uppercase Roses +flowers @outside 1 smell the uppercase Roses +flowers @outside
3 stop 3 stop
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
>>> todo.sh pri 1 B >>> todo.sh pri 1 B
1: (B) smell the uppercase Roses +flowers @outside 1: (B) smell the uppercase Roses +flowers @outside
@@ -33,14 +33,14 @@ TODO: 1 prioritized (B).
2 notice the sunflowers 2 notice the sunflowers
3 stop 3 stop
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
>>> todo.sh -p list >>> todo.sh -p list
1 (B) smell the uppercase Roses +flowers @outside 1 (B) smell the uppercase Roses +flowers @outside
2 notice the sunflowers 2 notice the sunflowers
3 stop 3 stop
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
>>> todo.sh pri 2 C >>> todo.sh pri 2 C
2: (C) notice the sunflowers 2: (C) notice the sunflowers
@@ -51,7 +51,7 @@ TODO: 2 prioritized (C).
2 (C) notice the sunflowers 2 (C) notice the sunflowers
3 stop 3 stop
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
>>> todo.sh pri 2 A >>> todo.sh pri 2 A
2: (A) notice the sunflowers 2: (A) notice the sunflowers
@@ -62,7 +62,7 @@ TODO: 2 prioritized (A).
1 (B) smell the uppercase Roses +flowers @outside 1 (B) smell the uppercase Roses +flowers @outside
3 stop 3 stop
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
>>> todo.sh pri 2 a >>> todo.sh pri 2 a
2: (A) notice the sunflowers 2: (A) notice the sunflowers
@@ -72,7 +72,7 @@ TODO: 2 prioritized (A).
2 (A) notice the sunflowers 2 (A) notice the sunflowers
1 (B) smell the uppercase Roses +flowers @outside 1 (B) smell the uppercase Roses +flowers @outside
-- --
TODO: 2 of 3 tasks shown from $HOME/todo.txt TODO: 2 of 3 tasks shown
>>> todo.sh add "smell the coffee +wakeup" >>> todo.sh add "smell the coffee +wakeup"
TODO: 'smell the coffee +wakeup' added on line 4. TODO: 'smell the coffee +wakeup' added on line 4.
@@ -83,7 +83,7 @@ TODO: 'smell the coffee +wakeup' added on line 4.
4 smell the coffee +wakeup 4 smell the coffee +wakeup
3 stop 3 stop
-- --
TODO: 4 of 4 tasks shown from $HOME/todo.txt TODO: 4 of 4 tasks shown
EOF EOF
test_done test_done

View File

@@ -28,14 +28,14 @@ test_todo_session 'checking TODOTXT_SORT_COMMAND' <<EOF
3 bbb yyy this line should be second. 3 bbb yyy this line should be second.
1 ccc xxx this line should be third. 1 ccc xxx this line should be third.
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
>>> todo.sh -d "$TEST_TODO1_" ls >>> todo.sh -d "$TEST_TODO1_" ls
1 ccc xxx this line should be third. 1 ccc xxx this line should be third.
3 bbb yyy this line should be second. 3 bbb yyy this line should be second.
2 aaa zzz this line should be first. 2 aaa zzz this line should be first.
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
EOF EOF
# #
@@ -50,11 +50,38 @@ test_todo_session 'checking TODOTXT_FINAL_FILTER' <<EOF
3 bbb yyy this line s... 3 bbb yyy this line s...
1 ccc xxx this line s... 1 ccc xxx this line s...
-- --
TODO: 3 of 3 tasks shown from $HOME/todo.txt TODO: 3 of 3 tasks shown
EOF EOF
# #
# check the p command line option # check the x command line option
#
TEST_TODO3_=todo3.cfg
sed -e "s%^.*export TODOTXT_FINAL_FILTER=.*$%export TODOTXT_FINAL_FILTER=\"grep -v xxx\"%" "${TEST_TODO_}" > "${TEST_TODO3_}"
cat > todo.txt <<EOF
foo
bar xxx
baz
EOF
test_todo_session 'final filter suppression' <<EOF
>>> todo.sh -d "$TEST_TODO3_" ls
3 baz
1 foo
--
TODO: 2 of 3 tasks shown
>>> todo.sh -d "$TEST_TODO3_" -x ls
2 bar xxx
3 baz
1 foo
--
TODO: 3 of 3 tasks shown
EOF
#
# check the p command line option
# #
cat > todo.txt <<EOF cat > todo.txt <<EOF
(A) @con01 +prj01 -- Some project 01 task, pri A (A) @con01 +prj01 -- Some project 01 task, pri A
@@ -101,7 +128,7 @@ test_todo_session 'plain mode option' <<EOF
19 @con02 +prj03 -- Some project 03 task, no priorty 19 @con02 +prj03 -- Some project 03 task, no priorty
20 @con02 +prj04 -- Some project 04 task, no priority 20 @con02 +prj04 -- Some project 04 task, no priority
-- --
TODO: 20 of 20 tasks shown from $HOME/todo.txt TODO: 20 of 20 tasks shown
>>> todo.sh -p ls >>> todo.sh -p ls
01 (A) @con01 +prj01 -- Some project 01 task, pri A 01 (A) @con01 +prj01 -- Some project 01 task, pri A
@@ -125,7 +152,7 @@ TODO: 20 of 20 tasks shown from $HOME/todo.txt
19 @con02 +prj03 -- Some project 03 task, no priorty 19 @con02 +prj03 -- Some project 03 task, no priorty
20 @con02 +prj04 -- Some project 04 task, no priority 20 @con02 +prj04 -- Some project 04 task, no priority
-- --
TODO: 20 of 20 tasks shown from $HOME/todo.txt TODO: 20 of 20 tasks shown
EOF EOF
# #
@@ -176,7 +203,7 @@ test_todo_session 'context, project, and priority suppression' <<EOF
19 @con02 +prj03 -- Some project 03 task, no priorty 19 @con02 +prj03 -- Some project 03 task, no priorty
20 @con02 +prj04 -- Some project 04 task, no priority 20 @con02 +prj04 -- Some project 04 task, no priority
-- --
TODO: 20 of 20 tasks shown from $HOME/todo.txt TODO: 20 of 20 tasks shown
>>> todo.sh ls @con01 >>> todo.sh ls @con01
01 (A) @con01 +prj01 -- Some project 01 task, pri A 01 (A) @con01 +prj01 -- Some project 01 task, pri A
@@ -190,7 +217,7 @@ TODO: 20 of 20 tasks shown from $HOME/todo.txt
17 @con01 +prj01 -- Some project 01 task, no priority 17 @con01 +prj01 -- Some project 01 task, no priority
18 @con01 +prj02 -- Some project 02 task, no priority 18 @con01 +prj02 -- Some project 02 task, no priority
-- --
TODO: 10 of 20 tasks shown from $HOME/todo.txt TODO: 10 of 20 tasks shown
>>> todo.sh -P ls @con01 >>> todo.sh -P ls @con01
01 @con01 +prj01 -- Some project 01 task, pri A 01 @con01 +prj01 -- Some project 01 task, pri A
@@ -204,7 +231,7 @@ TODO: 10 of 20 tasks shown from $HOME/todo.txt
17 @con01 +prj01 -- Some project 01 task, no priority 17 @con01 +prj01 -- Some project 01 task, no priority
18 @con01 +prj02 -- Some project 02 task, no priority 18 @con01 +prj02 -- Some project 02 task, no priority
-- --
TODO: 10 of 20 tasks shown from $HOME/todo.txt TODO: 10 of 20 tasks shown
>>> todo.sh -+ ls @con01 >>> todo.sh -+ ls @con01
01 (A) @con01 -- Some project 01 task, pri A 01 (A) @con01 -- Some project 01 task, pri A
@@ -218,7 +245,7 @@ TODO: 10 of 20 tasks shown from $HOME/todo.txt
17 @con01 -- Some project 01 task, no priority 17 @con01 -- Some project 01 task, no priority
18 @con01 -- Some project 02 task, no priority 18 @con01 -- Some project 02 task, no priority
-- --
TODO: 10 of 20 tasks shown from $HOME/todo.txt TODO: 10 of 20 tasks shown
>>> todo.sh -@ ls @con01 >>> todo.sh -@ ls @con01
01 (A) +prj01 -- Some project 01 task, pri A 01 (A) +prj01 -- Some project 01 task, pri A
@@ -232,7 +259,7 @@ TODO: 10 of 20 tasks shown from $HOME/todo.txt
17 +prj01 -- Some project 01 task, no priority 17 +prj01 -- Some project 01 task, no priority
18 +prj02 -- Some project 02 task, no priority 18 +prj02 -- Some project 02 task, no priority
-- --
TODO: 10 of 20 tasks shown from $HOME/todo.txt TODO: 10 of 20 tasks shown
>>> todo.sh -P -@ ls @con01 >>> todo.sh -P -@ ls @con01
01 +prj01 -- Some project 01 task, pri A 01 +prj01 -- Some project 01 task, pri A
@@ -246,7 +273,7 @@ TODO: 10 of 20 tasks shown from $HOME/todo.txt
17 +prj01 -- Some project 01 task, no priority 17 +prj01 -- Some project 01 task, no priority
18 +prj02 -- Some project 02 task, no priority 18 +prj02 -- Some project 02 task, no priority
-- --
TODO: 10 of 20 tasks shown from $HOME/todo.txt TODO: 10 of 20 tasks shown
>>> todo.sh -P -@ -+ -P -@ -+ ls @con01 >>> todo.sh -P -@ -+ -P -@ -+ ls @con01
01 (A) @con01 +prj01 -- Some project 01 task, pri A 01 (A) @con01 +prj01 -- Some project 01 task, pri A
@@ -260,7 +287,7 @@ TODO: 10 of 20 tasks shown from $HOME/todo.txt
17 @con01 +prj01 -- Some project 01 task, no priority 17 @con01 +prj01 -- Some project 01 task, no priority
18 @con01 +prj02 -- Some project 02 task, no priority 18 @con01 +prj02 -- Some project 02 task, no priority
-- --
TODO: 10 of 20 tasks shown from $HOME/todo.txt TODO: 10 of 20 tasks shown
>>> todo.sh -P -@ -+ -P -@ -+ -P -@ -+ ls @con01 >>> todo.sh -P -@ -+ -P -@ -+ -P -@ -+ ls @con01
01 -- Some project 01 task, pri A 01 -- Some project 01 task, pri A
@@ -274,7 +301,7 @@ TODO: 10 of 20 tasks shown from $HOME/todo.txt
17 -- Some project 01 task, no priority 17 -- Some project 01 task, no priority
18 -- Some project 02 task, no priority 18 -- Some project 02 task, no priority
-- --
TODO: 10 of 20 tasks shown from $HOME/todo.txt TODO: 10 of 20 tasks shown
EOF EOF
# #
@@ -509,7 +536,88 @@ test_todo_session 'check line number padding, out to 3 digits' <<EOF
111 hex6E this is another line 111 hex6E this is another line
112 hex6F this is another line 112 hex6F this is another line
-- --
TODO: 112 of 112 tasks shown from $HOME/todo.txt TODO: 112 of 112 tasks shown
EOF
#
# check that blank lines are ignored.
#
# Less than 10
cat > todo.txt <<EOF
hex00 this is one line
hex02 this is another line
hex03 this is another line
hex04 this is another line
hex05 this is another line
hex06 this is another line
hex07 this is another line
EOF
test_todo_session 'check that blank lines are ignored for less than 10 items' <<EOF
>>> todo.sh ls
1 hex00 this is one line
3 hex02 this is another line
4 hex03 this is another line
5 hex04 this is another line
6 hex05 this is another line
7 hex06 this is another line
8 hex07 this is another line
--
TODO: 7 of 7 tasks shown
EOF
# More than 10
cat > todo.txt <<EOF
hex00 this is one line
hex02 this is another line
hex03 this is another line
hex04 this is another line
hex05 this is another line
hex06 this is another line
hex07 this is another line
hex08 this is another line
hex09 this is another line
EOF
test_todo_session 'check that blank lines are ignored for blank lines whose ID begins with `0` (one blank)' <<EOF
>>> todo.sh ls
01 hex00 this is one line
03 hex02 this is another line
04 hex03 this is another line
05 hex04 this is another line
06 hex05 this is another line
07 hex06 this is another line
08 hex07 this is another line
09 hex08 this is another line
10 hex09 this is another line
--
TODO: 9 of 9 tasks shown
EOF
cat > todo.txt <<EOF
hex00 this is one line
hex02 this is another line
hex03 this is another line
hex04 this is another line
hex05 this is another line
hex07 this is another line
hex08 this is another line
hex09 this is another line
EOF
test_todo_session 'check that blank lines are ignored for blank lines whose ID begins with `0` (many blanks)' <<EOF
>>> todo.sh ls
01 hex00 this is one line
03 hex02 this is another line
04 hex03 this is another line
05 hex04 this is another line
06 hex05 this is another line
08 hex07 this is another line
09 hex08 this is another line
10 hex09 this is another line
--
TODO: 8 of 8 tasks shown
EOF EOF
test_done test_done

60
tests/t1400-prepend.sh Executable file
View File

@@ -0,0 +1,60 @@
#!/bin/sh
test_description='basic prepend functionality
'
. ./test-lib.sh
test_todo_session 'prepend usage' <<EOF
>>> todo.sh prepend B B
usage: todo.sh prepend ITEM# "TEXT TO PREPEND"
=== 1
EOF
cat > todo.txt <<EOF
(B) smell the uppercase Roses +flowers @outside
notice the sunflowers
stop
EOF
test_todo_session 'basic prepend' <<EOF
>>> todo.sh list
1 (B) smell the uppercase Roses +flowers @outside
2 notice the sunflowers
3 stop
--
TODO: 3 of 3 tasks shown
>>> todo.sh -p list
1 (B) smell the uppercase Roses +flowers @outside
2 notice the sunflowers
3 stop
--
TODO: 3 of 3 tasks shown
>>> todo.sh prepend 2 test
2: test notice the sunflowers
>>> todo.sh -p list
1 (B) smell the uppercase Roses +flowers @outside
3 stop
2 test notice the sunflowers
--
TODO: 3 of 3 tasks shown
>>> todo.sh prepend 1 test
1: (B) test smell the uppercase Roses +flowers @outside
>>> todo.sh -p list
1 (B) test smell the uppercase Roses +flowers @outside
3 stop
2 test notice the sunflowers
--
TODO: 3 of 3 tasks shown
EOF
test_todo_session 'prepend with &' <<EOF
>>> todo.sh prepend 3 "no running & jumping now"
3: no running & jumping now stop
EOF
test_done

80
tests/t1500-do.sh Executable file
View File

@@ -0,0 +1,80 @@
#!/bin/sh
test_description='do functionality
'
. ./test-lib.sh
#DATE=`date '+%Y-%m-%d'`
test_todo_session 'do usage' <<EOF
>>> todo.sh do B B
usage: todo.sh do ITEM#
=== 1
EOF
cat > todo.txt <<EOF
smell the uppercase Roses +flowers @outside
notice the sunflowers
stop
remove1
remove2
remove3
remove4
EOF
test_todo_session 'basic do' <<EOF
>>> todo.sh list
2 notice the sunflowers
4 remove1
5 remove2
6 remove3
7 remove4
1 smell the uppercase Roses +flowers @outside
3 stop
--
TODO: 7 of 7 tasks shown
>>> todo.sh do 7,6
7: x 2009-02-13 remove4
TODO: 7 marked as done.
6: x 2009-02-13 remove3
TODO: 6 marked as done.
x 2009-02-13 remove3
x 2009-02-13 remove4
TODO: $HOME/todo.txt archived.
>>> todo.sh -p list
2 notice the sunflowers
4 remove1
5 remove2
1 smell the uppercase Roses +flowers @outside
3 stop
--
TODO: 5 of 5 tasks shown
>>> todo.sh do 5 4
5: x 2009-02-13 remove2
TODO: 5 marked as done.
4: x 2009-02-13 remove1
TODO: 4 marked as done.
x 2009-02-13 remove1
x 2009-02-13 remove2
TODO: $HOME/todo.txt archived.
>>> todo.sh -p list
2 notice the sunflowers
1 smell the uppercase Roses +flowers @outside
3 stop
--
TODO: 3 of 3 tasks shown
EOF
test_todo_session 'fail multiple do attempts' <<EOF
>>> todo.sh -a do 3
3: x 2009-02-13 stop
TODO: 3 marked as done.
>>> todo.sh -a do 3
3 is already marked done
EOF
test_done

47
tests/t1600-append.sh Executable file
View File

@@ -0,0 +1,47 @@
#!/bin/sh
test_description='basic append functionality
Ensure we can append items successfully.
'
. ./test-lib.sh
#
# Set up the basic todo.txt
#
todo.sh add notice the daisies > /dev/null
test_todo_session 'append usage' <<EOF
>>> todo.sh append adf asdfa
=== 1
usage: todo.sh append ITEM# "TEXT TO APPEND"
EOF
test_todo_session 'basic append' <<EOF
>>> todo.sh append 1 "smell the roses"
1: notice the daisies smell the roses
>>> todo.sh list
1 notice the daisies smell the roses
--
TODO: 1 of 1 tasks shown
EOF
test_todo_session 'basic append with &' <<EOF
>>> todo.sh append 1 "see the wasps & bees"
1: notice the daisies smell the roses see the wasps & bees
>>> todo.sh list
1 notice the daisies smell the roses see the wasps & bees
--
TODO: 1 of 1 tasks shown
EOF
test_todo_session 'append error' << EOF
>>> todo.sh append 10 "hej!"
=== 1
10: No such todo.
EOF
test_done

132
tests/t2000-multiline.sh Executable file
View File

@@ -0,0 +1,132 @@
#!/bin/sh
test_description='Multi-line functionality'
. ./test-lib.sh
## Replace test
# Create the expected file
echo "1: smell the cheese
replaced with
1: eat apples eat oranges drink milk">$HOME/expect.multi
test_expect_success 'multiline squash item replace' '
(
# Prepare single line todo file
cat /dev/null > $HOME/todo.txt
"$HOME/bin/todo.sh" add smell the cheese
# Run replace
"$HOME/bin/todo.sh" replace 1 "eat apples
eat oranges
drink milk" > $HOME/output.multi
# Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi"
if [ $? -ne 0 ]; then
exit 1
else
exit 0
fi
)
'
## Add test
# Create the expected file
echo "TODO: 'eat apples eat oranges drink milk' added on line 2.">$HOME/expect.multi
test_expect_success 'multiline squash item add' '
(
# Prepare single line todo file
cat /dev/null > $HOME/todo.txt
"$HOME/bin/todo.sh" add smell the cheese
# Run add
"$HOME/bin/todo.sh" add "eat apples
eat oranges
drink milk" > $HOME/output.multi
# Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi"
if [ $? -ne 0 ]; then
exit 1
else
exit 0
fi
)
'
## Append test
# Create the expected file
echo "1: smell the cheese eat apples eat oranges drink milk">$HOME/expect.multi
test_expect_success 'multiline squash item append' '
(
# Prepare single line todo file
cat /dev/null > $HOME/todo.txt
"$HOME/bin/todo.sh" add smell the cheese
# Run append
"$HOME/bin/todo.sh" append 1 "eat apples
eat oranges
drink milk" > $HOME/output.multi
# Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi"
if [ $? -ne 0 ]; then
exit 1
else
exit 0
fi
)
'
## Prepend test
# Create the expected file
echo "1: eat apples eat oranges drink milk smell the cheese">$HOME/expect.multi
test_expect_success 'multiline squash item prepend' '
(
# Prepare single line todo file
cat /dev/null > $HOME/todo.txt
"$HOME/bin/todo.sh" add smell the cheese
# Run prepend
"$HOME/bin/todo.sh" prepend 1 "eat apples
eat oranges
drink milk" > $HOME/output.multi
# Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi"
if [ $? -ne 0 ]; then
exit 1
else
exit 0
fi
)
'
## Multiple line addition
# Create the expected file
echo "TODO: 'eat apples' added on line 2." > $HOME/expect.multi
echo "TODO: 'eat oranges' added on line 3." >>$HOME/expect.multi
echo "TODO: 'drink milk' added on line 4." >> $HOME/expect.multi
test_expect_success 'actual multiline add' '
(
# Run addm
"$HOME/bin/todo.sh" addm "eat apples
eat oranges
drink milk" > $HOME/output.multi
# Test output against expected
diff "$HOME/output.multi" "$HOME/expect.multi"
if [ $? -ne 0 ]; then
exit 1
else
exit 0
fi
)
'
test_done

View File

@@ -17,23 +17,23 @@ test_todo_session 'basic tests' <<EOF
4 smell the coffee +wakeup 4 smell the coffee +wakeup
3 stop 3 stop
-- --
TODO: 4 of 4 tasks shown from $HOME/todo.txt TODO: 4 of 4 tasks shown
>>> todo.sh -p list +flowers >>> todo.sh -p list +flowers
1 (B) smell the uppercase Roses +flowers @outside 1 (B) smell the uppercase Roses +flowers @outside
-- --
TODO: 1 of 4 tasks shown from $HOME/todo.txt TODO: 1 of 4 tasks shown
>>> todo.sh -p list flowers >>> todo.sh -p list flowers
2 (A) notice the sunflowers 2 (A) notice the sunflowers
1 (B) smell the uppercase Roses +flowers @outside 1 (B) smell the uppercase Roses +flowers @outside
-- --
TODO: 2 of 4 tasks shown from $HOME/todo.txt TODO: 2 of 4 tasks shown
>>> todo.sh -p list flowers out >>> todo.sh -p list flowers out
1 (B) smell the uppercase Roses +flowers @outside 1 (B) smell the uppercase Roses +flowers @outside
-- --
TODO: 1 of 4 tasks shown from $HOME/todo.txt TODO: 1 of 4 tasks shown
>>> todo.sh -a do 2 >>> todo.sh -a do 2
2: x 2009-02-13 notice the sunflowers 2: x 2009-02-13 notice the sunflowers
@@ -45,7 +45,7 @@ TODO: 2 marked as done.
3 stop 3 stop
2 x 2009-02-13 notice the sunflowers 2 x 2009-02-13 notice the sunflowers
-- --
TODO: 4 of 4 tasks shown from $HOME/todo.txt TODO: 4 of 4 tasks shown
>>> todo.sh add "make the coffee +wakeup" >>> todo.sh add "make the coffee +wakeup"
TODO: 'make the coffee +wakeup' added on line 5. TODO: 'make the coffee +wakeup' added on line 5.
@@ -54,7 +54,7 @@ TODO: 'make the coffee +wakeup' added on line 5.
5 make the coffee +wakeup 5 make the coffee +wakeup
4 smell the coffee +wakeup 4 smell the coffee +wakeup
-- --
TODO: 2 of 5 tasks shown from $HOME/todo.txt TODO: 2 of 5 tasks shown
>>> todo.sh add "visit http://example.com" >>> todo.sh add "visit http://example.com"
TODO: 'visit http://example.com' added on line 6. TODO: 'visit http://example.com' added on line 6.
@@ -67,7 +67,7 @@ TODO: 'visit http://example.com' added on line 6.
6 visit http://example.com 6 visit http://example.com
2 x 2009-02-13 notice the sunflowers 2 x 2009-02-13 notice the sunflowers
-- --
TODO: 6 of 6 tasks shown from $HOME/todo.txt TODO: 6 of 6 tasks shown
>>> todo.sh archive >>> todo.sh archive
x 2009-02-13 notice the sunflowers x 2009-02-13 notice the sunflowers
@@ -80,7 +80,7 @@ TODO: $HOME/todo.txt archived.
2 stop 2 stop
5 visit http://example.com 5 visit http://example.com
-- --
TODO: 5 of 5 tasks shown from $HOME/todo.txt TODO: 5 of 5 tasks shown
>>> todo.sh report >>> todo.sh report
TODO: Report file updated. TODO: Report file updated.
@@ -105,7 +105,7 @@ usage: todo.sh append ITEM# "TEXT TO APPEND"
2 stop and think 2 stop and think
5 visit http://example.com 5 visit http://example.com
-- --
TODO: 5 of 5 tasks shown from $HOME/todo.txt TODO: 5 of 5 tasks shown
>>> todo.sh append 10 "hej!" >>> todo.sh append 10 "hej!"
10: No such todo. 10: No such todo.
@@ -118,7 +118,7 @@ TODO: 5 of 5 tasks shown from $HOME/todo.txt
2 stop and think 2 stop and think
5 visit http://example.com 5 visit http://example.com
-- --
TODO: 5 of 5 tasks shown from $HOME/todo.txt TODO: 5 of 5 tasks shown
>>> todo.sh do 10 >>> todo.sh do 10
10: No such todo. 10: No such todo.
@@ -131,7 +131,7 @@ TODO: 5 of 5 tasks shown from $HOME/todo.txt
2 stop and think 2 stop and think
5 visit http://example.com 5 visit http://example.com
-- --
TODO: 5 of 5 tasks shown from $HOME/todo.txt TODO: 5 of 5 tasks shown
>>> todo.sh add "the coffee +wakeup" >>> todo.sh add "the coffee +wakeup"
TODO: 'the coffee +wakeup' added on line 6. TODO: 'the coffee +wakeup' added on line 6.
@@ -144,7 +144,7 @@ TODO: 'the coffee +wakeup' added on line 6.
6 the coffee +wakeup 6 the coffee +wakeup
5 visit http://example.com 5 visit http://example.com
-- --
TODO: 6 of 6 tasks shown from $HOME/todo.txt TODO: 6 of 6 tasks shown
>>> todo.sh prepend 6 "make" >>> todo.sh prepend 6 "make"
6: make the coffee +wakeup 6: make the coffee +wakeup
@@ -157,7 +157,7 @@ TODO: 6 of 6 tasks shown from $HOME/todo.txt
2 stop and think 2 stop and think
5 visit http://example.com 5 visit http://example.com
-- --
TODO: 6 of 6 tasks shown from $HOME/todo.txt TODO: 6 of 6 tasks shown
>>> todo.sh remdup >>> todo.sh remdup
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description] Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]

568
todo.sh
View File

@@ -1,215 +1,228 @@
#! /bin/bash #! /bin/bash
# NOTE: Todo.sh requires the todo.cfg configuration file to run. # NOTE: Todo.sh requires the .todo/config configuration file to run.
# Place the todo.cfg file in your home directory or use the -d option for a custom location. # Place the .todo/config file in your home directory or use the -d option for a custom location.
[ -f VERSION-FILE ] && . VERSION-FILE || VERSION="@DEV_VERSION@" [ -f VERSION-FILE ] && . VERSION-FILE || VERSION="@DEV_VERSION@"
version() { sed -e 's/^ //' <<EndVersion version() {
TODO.TXT Command Line Interface v$VERSION cat <<-EndVersion
TODO.TXT Command Line Interface v$VERSION
First release: 5/11/2006
Original conception by: Gina Trapani (http://ginatrapani.org) First release: 5/11/2006
Contributors: http://github.com/ginatrapani/todo.txt-cli/network Original conception by: Gina Trapani (http://ginatrapani.org)
License: GPL, http://www.gnu.org/copyleft/gpl.html Contributors: http://github.com/ginatrapani/todo.txt-cli/network
More information and mailing list at http://todotxt.com License: GPL, http://www.gnu.org/copyleft/gpl.html
Code repository: http://github.com/ginatrapani/todo.txt-cli/tree/master More information and mailing list at http://todotxt.com
EndVersion Code repository: http://github.com/ginatrapani/todo.txt-cli/tree/master
EndVersion
exit 1 exit 1
} }
# Set script name early. # Set script name and full path early.
TODO_SH=$(basename "$0") TODO_SH=$(basename "$0")
export TODO_SH TODO_FULL_SH="$0"
export TODO_SH TODO_FULL_SH
oneline_usage="$TODO_SH [-fhpantvV] [-d todo_config] action [task_number] [task_description]" oneline_usage="$TODO_SH [-fhpantvV] [-d todo_config] action [task_number] [task_description]"
usage() usage()
{ {
sed -e 's/^ //' <<EndUsage cat <<-EndUsage
Usage: $oneline_usage Usage: $oneline_usage
Try '$TODO_SH -h' for more information. Try '$TODO_SH -h' for more information.
EndUsage EndUsage
exit 1 exit 1
} }
shorthelp() shorthelp()
{ {
sed -e 's/^ //' <<EndHelp cat <<-EndHelp
Usage: $oneline_usage Usage: $oneline_usage
Actions: Actions:
add|a "THING I NEED TO DO +project @context" add|a "THING I NEED TO DO +project @context"
addto DEST "TEXT TO ADD" addto DEST "TEXT TO ADD"
append|app NUMBER "TEXT TO APPEND" addm "THINGS I NEED TO DO
archive MORE THINGS I NEED TO DO"
command [ACTIONS] append|app NUMBER "TEXT TO APPEND"
del|rm NUMBER [TERM] archive
dp|depri NUMBER command [ACTIONS]
do NUMBER del|rm NUMBER [TERM]
help dp|depri NUMBER
list|ls [TERM...] do NUMBER
listall|lsa [TERM...] help
listcon|lsc list|ls [TERM...]
listfile|lf SRC [TERM...] listall|lsa [TERM...]
listpri|lsp [PRIORITY] listcon|lsc
listproj|lsprj listfile|lf SRC [TERM...]
move|mv NUMBER DEST [SRC] listpri|lsp [PRIORITY]
prepend|prep NUMBER "TEXT TO PREPEND" listproj|lsprj
pri|p NUMBER PRIORITY move|mv NUMBER DEST [SRC]
replace NUMBER "UPDATED TODO" prepend|prep NUMBER "TEXT TO PREPEND"
report pri|p NUMBER PRIORITY
replace NUMBER "UPDATED TODO"
report
See "help" for more details. See "help" for more details.
EndHelp EndHelp
exit 0 exit 0
} }
help() help()
{ {
sed -e 's/^ //' <<EndHelp cat <<-EndHelp
Usage: $oneline_usage Usage: $oneline_usage
Actions: Actions:
add "THING I NEED TO DO +project @context" add "THING I NEED TO DO +project @context"
a "THING I NEED TO DO +project @context" a "THING I NEED TO DO +project @context"
Adds THING I NEED TO DO to your todo.txt file on its own line. Adds THING I NEED TO DO to your todo.txt file on its own line.
Project and context notation optional. Project and context notation optional.
Quotes optional. Quotes optional.
addto DEST "TEXT TO ADD" addm "FIRST THING I NEED TO DO +project1 @context
Adds a line of text to any file located in the todo.txt directory. SECOND THING I NEED TO DO +project2 @context"
For example, addto inbox.txt "decide about vacation" Adds FIRST THING I NEED TO DO to your todo.txt on its own line and
Adds SECOND THING I NEED TO DO to you todo.txt on its own line.
Project and context notation optional.
Quotes optional.
append NUMBER "TEXT TO APPEND" addto DEST "TEXT TO ADD"
app NUMBER "TEXT TO APPEND" Adds a line of text to any file located in the todo.txt directory.
Adds TEXT TO APPEND to the end of the todo on line NUMBER. For example, addto inbox.txt "decide about vacation"
Quotes optional.
archive append NUMBER "TEXT TO APPEND"
Moves done items from todo.txt to done.txt and removes blank lines. app NUMBER "TEXT TO APPEND"
Adds TEXT TO APPEND to the end of the todo on line NUMBER.
Quotes optional.
command [ACTIONS] archive
Runs the remaining arguments using only todo.sh builtins. Moves done items from todo.txt to done.txt and removes blank lines.
Will not call any .todo.actions.d scripts.
del NUMBER [TERM] command [ACTIONS]
rm NUMBER [TERM] Runs the remaining arguments using only todo.sh builtins.
Deletes the item on line NUMBER in todo.txt. Will not call any .todo.actions.d scripts.
If term specified, deletes only the term from the line.
depri NUMBER del NUMBER [TERM]
dp NUMBER rm NUMBER [TERM]
Deprioritizes (removes the priority) from the item Deletes the item on line NUMBER in todo.txt.
on line NUMBER in todo.txt. If term specified, deletes only the term from the line.
do NUMBER depri NUMBER
Marks item on line NUMBER as done in todo.txt. dp NUMBER
Deprioritizes (removes the priority) from the item
on line NUMBER in todo.txt.
help do NUMBER[, NUMBER, NUMBER, ...]
Display this help message. Marks item(s) on line NUMBER as done in todo.txt.
list [TERM...] help
ls [TERM...] Display this help message.
Displays all todo's that contain TERM(s) sorted by priority with line
numbers. If no TERM specified, lists entire todo.txt.
listall [TERM...] list [TERM...]
lsa [TERM...] ls [TERM...]
Displays all the lines in todo.txt AND done.txt that contain TERM(s) Displays all todo's that contain TERM(s) sorted by priority with line
sorted by priority with line numbers. If no TERM specified, lists numbers. If no TERM specified, lists entire todo.txt.
entire todo.txt AND done.txt concatenated and sorted.
listcon listall [TERM...]
lsc lsa [TERM...]
Lists all the task contexts that start with the @ sign in todo.txt. Displays all the lines in todo.txt AND done.txt that contain TERM(s)
sorted by priority with line numbers. If no TERM specified, lists
entire todo.txt AND done.txt concatenated and sorted.
listfile SRC [TERM...] listcon
lf SRC [TERM...] lsc
Displays all the lines in SRC file located in the todo.txt directory, Lists all the task contexts that start with the @ sign in todo.txt.
sorted by priority with line numbers. If TERM specified, lists
all lines that contain TERM in SRC file.
listpri [PRIORITY] listfile SRC [TERM...]
lsp [PRIORITY] lf SRC [TERM...]
Displays all items prioritized PRIORITY. Displays all the lines in SRC file located in the todo.txt directory,
If no PRIORITY specified, lists all prioritized items. sorted by priority with line numbers. If TERM specified, lists
all lines that contain TERM in SRC file.
listproj listpri [PRIORITY]
lsprj lsp [PRIORITY]
Lists all the projects that start with the + sign in todo.txt. Displays all items prioritized PRIORITY.
If no PRIORITY specified, lists all prioritized items.
move NUMBER DEST [SRC] listproj
mv NUMBER DEST [SRC] lsprj
Moves a line from source text file (SRC) to destination text file (DEST). Lists all the projects that start with the + sign in todo.txt.
Both source and destination file must be located in the directory defined
in the configuration directory. When SRC is not defined
it's by default todo.txt.
prepend NUMBER "TEXT TO PREPEND" move NUMBER DEST [SRC]
prep NUMBER "TEXT TO PREPEND" mv NUMBER DEST [SRC]
Adds TEXT TO PREPEND to the beginning of the todo on line NUMBER. Moves a line from source text file (SRC) to destination text file (DEST).
Quotes optional. Both source and destination file must be located in the directory defined
in the configuration directory. When SRC is not defined
it's by default todo.txt.
pri NUMBER PRIORITY prepend NUMBER "TEXT TO PREPEND"
p NUMBER PRIORITY prep NUMBER "TEXT TO PREPEND"
Adds PRIORITY to todo on line NUMBER. If the item is already Adds TEXT TO PREPEND to the beginning of the todo on line NUMBER.
prioritized, replaces current priority with new PRIORITY. Quotes optional.
PRIORITY must be an uppercase letter between A and Z.
replace NUMBER "UPDATED TODO" pri NUMBER PRIORITY
Replaces todo on line NUMBER with UPDATED TODO. p NUMBER PRIORITY
Adds PRIORITY to todo on line NUMBER. If the item is already
prioritized, replaces current priority with new PRIORITY.
PRIORITY must be an uppercase letter between A and Z.
report replace NUMBER "UPDATED TODO"
Adds the number of open todo's and closed done's to report.txt. Replaces todo on line NUMBER with UPDATED TODO.
report
Adds the number of open todo's and closed done's to report.txt.
Options: Options:
-@ -@
Hide context names in list output. Use twice to show context Hide context names in list output. Use twice to show context
names (default). names (default).
-+ -+
Hide project names in list output. Use twice to show project Hide project names in list output. Use twice to show project
names (default). names (default).
-d CONFIG_FILE -d CONFIG_FILE
Use a configuration file other than the default ~/todo.cfg Use a configuration file other than the default ~/.todo/config
-f -f
Forces actions without confirmation or interactive input Forces actions without confirmation or interactive input
-h -h
Display a short help message Display a short help message
-p -p
Plain mode turns off colors Plain mode turns off colors
-P -P
Hide priority labels in list output. Use twice to show Hide priority labels in list output. Use twice to show
priority labels (default). priority labels (default).
-a -a
Don't auto-archive tasks automatically on completion Don't auto-archive tasks automatically on completion
-n -n
Don't preserve line numbers; automatically remove blank lines Don't preserve line numbers; automatically remove blank lines
on task deletion on task deletion
-t -t
Prepend the current date to a task automatically Prepend the current date to a task automatically
when it's added. when it's added.
-v -v
Verbose mode turns on confirmation messages Verbose mode turns on confirmation messages
-vv -vv
Extra verbose mode prints some debugging information Extra verbose mode prints some debugging information
-V -V
Displays version, license and credits Displays version, license and credits
-x
Disables TODOTXT_FINAL_FILTER
Environment variables: Environment variables:
TODOTXT_AUTO_ARCHIVE=0 is same as option -a TODOTXT_AUTO_ARCHIVE=0 is same as option -a
TODOTXT_CFG_FILE=CONFIG_FILE is same as option -d CONFIG_FILE TODOTXT_CFG_FILE=CONFIG_FILE is same as option -d CONFIG_FILE
TODOTXT_FORCE=1 is same as option -f TODOTXT_FORCE=1 is same as option -f
TODOTXT_PRESERVE_LINE_NUMBERS=0 is same as option -n TODOTXT_PRESERVE_LINE_NUMBERS=0 is same as option -n
TODOTXT_PLAIN=1 is same as option -p TODOTXT_PLAIN=1 is same as option -p
TODOTXT_DATE_ON_ADD=1 is same as option -t TODOTXT_DATE_ON_ADD=1 is same as option -t
TODOTXT_VERBOSE=1 is same as option -v TODOTXT_VERBOSE=1 is same as option -v
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
EndHelp EndHelp
if [ -d "$TODO_ACTIONS_DIR" ] if [ -d "$TODO_ACTIONS_DIR" ]
then then
@@ -240,6 +253,21 @@ cleanup()
exit 0 exit 0
} }
cleaninput()
{
# Cleanup the input
# Replace newlines with spaces Always
input=`echo $input | tr -d '\r|\n'`
action_regexp="^\(append\|app\|prepend\|prep\|replace\)$"
# Check which action we are being used in as this affects what cleaning we do
if [ `echo $action | grep -c $action_regexp` -eq 1 ]; then
# These actions use sed and & as the matched string so escape it
input=`echo $input | sed 's/\&/\\\&/g'`
fi
}
archive() archive()
{ {
#defragment blank lines #defragment blank lines
@@ -248,7 +276,7 @@ archive()
grep "^x " "$TODO_FILE" >> "$DONE_FILE" grep "^x " "$TODO_FILE" >> "$DONE_FILE"
sed -i.bak '/^x /d' "$TODO_FILE" sed -i.bak '/^x /d' "$TODO_FILE"
cp "$TODO_FILE" "$TMP_FILE" cp "$TODO_FILE" "$TMP_FILE"
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' "$TMP_FILE" > "$TODO_FILE" sed -n 'G; s/\n/&&/; /^\([ ~-]*\n\).*\n\1/d; s/\n//; h; P' "$TMP_FILE" > "$TODO_FILE"
#[[ $TODOTXT_VERBOSE -gt 0 ]] && echo "TODO: Duplicate tasks have been removed." #[[ $TODOTXT_VERBOSE -gt 0 ]] && echo "TODO: Duplicate tasks have been removed."
[ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: $TODO_FILE archived." [ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: $TODO_FILE archived."
cleanup cleanup
@@ -256,14 +284,14 @@ archive()
# == PROCESS OPTIONS == # == PROCESS OPTIONS ==
while getopts ":fhpnatvV+@Pd:" Option while getopts ":fhpnatvVx+@Pd:" Option
do do
case $Option in case $Option in
'@' ) '@' )
## HIDE_CONTEXT_NAMES starts at zero (false); increment it to one ## HIDE_CONTEXT_NAMES starts at zero (false); increment it to one
## (true) the first time this flag is seen. Each time the flag ## (true) the first time this flag is seen. Each time the flag
## is seen after that, increment it again so that an even ## is seen after that, increment it again so that an even
## number hides project names and an odd number shows project ## number shows context names and an odd number hides context
## names. ## names.
: $(( HIDE_CONTEXT_NAMES++ )) : $(( HIDE_CONTEXT_NAMES++ ))
if [ $(( $HIDE_CONTEXT_NAMES % 2 )) -eq 0 ] if [ $(( $HIDE_CONTEXT_NAMES % 2 )) -eq 0 ]
@@ -279,7 +307,7 @@ do
## HIDE_PROJECT_NAMES starts at zero (false); increment it to one ## HIDE_PROJECT_NAMES starts at zero (false); increment it to one
## (true) the first time this flag is seen. Each time the flag ## (true) the first time this flag is seen. Each time the flag
## is seen after that, increment it again so that an even ## is seen after that, increment it again so that an even
## number hides project names and an odd number shows project ## number shows project names and an odd number hides project
## names. ## names.
: $(( HIDE_PROJECT_NAMES++ )) : $(( HIDE_PROJECT_NAMES++ ))
if [ $(( $HIDE_PROJECT_NAMES % 2 )) -eq 0 ] if [ $(( $HIDE_PROJECT_NAMES % 2 )) -eq 0 ]
@@ -313,8 +341,8 @@ do
## HIDE_PRIORITY_LABELS starts at zero (false); increment it to one ## HIDE_PRIORITY_LABELS starts at zero (false); increment it to one
## (true) the first time this flag is seen. Each time the flag ## (true) the first time this flag is seen. Each time the flag
## is seen after that, increment it again so that an even ## is seen after that, increment it again so that an even
## number hides project names and an odd number shows project ## number shows priority labels and an odd number hides priority
## names. ## labels.
: $(( HIDE_PRIORITY_LABELS++ )) : $(( HIDE_PRIORITY_LABELS++ ))
if [ $(( $HIDE_PRIORITY_LABELS % 2 )) -eq 0 ] if [ $(( $HIDE_PRIORITY_LABELS % 2 )) -eq 0 ]
then then
@@ -334,6 +362,9 @@ do
V ) V )
version version
;; ;;
x )
TODOTXT_DISABLE_FILTER=1
;;
esac esac
done done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
@@ -341,7 +372,7 @@ shift $(($OPTIND - 1))
# defaults if not yet defined # defaults if not yet defined
TODOTXT_VERBOSE=${TODOTXT_VERBOSE:-1} TODOTXT_VERBOSE=${TODOTXT_VERBOSE:-1}
TODOTXT_PLAIN=${TODOTXT_PLAIN:-0} TODOTXT_PLAIN=${TODOTXT_PLAIN:-0}
TODOTXT_CFG_FILE=${TODOTXT_CFG_FILE:-$HOME/todo.cfg} TODOTXT_CFG_FILE=${TODOTXT_CFG_FILE:-$HOME/.todo/config}
TODOTXT_FORCE=${TODOTXT_FORCE:-0} TODOTXT_FORCE=${TODOTXT_FORCE:-0}
TODOTXT_PRESERVE_LINE_NUMBERS=${TODOTXT_PRESERVE_LINE_NUMBERS:-1} TODOTXT_PRESERVE_LINE_NUMBERS=${TODOTXT_PRESERVE_LINE_NUMBERS:-1}
TODOTXT_AUTO_ARCHIVE=${TODOTXT_AUTO_ARCHIVE:-1} TODOTXT_AUTO_ARCHIVE=${TODOTXT_AUTO_ARCHIVE:-1}
@@ -379,6 +410,15 @@ export PRI_B=$GREEN # color for B priority
export PRI_C=$LIGHT_BLUE # color for C priority export PRI_C=$LIGHT_BLUE # color for C priority
export PRI_X=$WHITE # color for rest of them export PRI_X=$WHITE # color for rest of them
[ -e "$TODOTXT_CFG_FILE" ] || {
CFG_FILE_ALT="$HOME/todo.cfg"
if [ -e "$CFG_FILE_ALT" ]
then
TODOTXT_CFG_FILE="$CFG_FILE_ALT"
fi
}
[ -e "$TODOTXT_CFG_FILE" ] || { [ -e "$TODOTXT_CFG_FILE" ] || {
CFG_FILE_ALT="$HOME/.todo.cfg" CFG_FILE_ALT="$HOME/.todo.cfg"
@@ -390,10 +430,19 @@ export PRI_X=$WHITE # color for rest of them
if [ -z "$TODO_ACTIONS_DIR" -o ! -d "$TODO_ACTIONS_DIR" ] if [ -z "$TODO_ACTIONS_DIR" -o ! -d "$TODO_ACTIONS_DIR" ]
then then
TODO_ACTIONS_DIR="$HOME/.todo.actions.d" TODO_ACTIONS_DIR="$HOME/.todo/actions"
export TODO_ACTIONS_DIR export TODO_ACTIONS_DIR
fi fi
[ -d "$TODO_ACTIONS_DIR" ] || {
TODO_ACTIONS_DIR_ALT="$HOME/.todo.actions.d"
if [ -d "$TODO_ACTIONS_DIR_ALT" ]
then
TODO_ACTIONS_DIR="$TODO_ACTIONS_DIR_ALT"
fi
}
# === SANITY CHECKS (thanks Karl!) === # === SANITY CHECKS (thanks Karl!) ===
[ -r "$TODOTXT_CFG_FILE" ] || die "Fatal error: Cannot read configuration file $TODOTXT_CFG_FILE" [ -r "$TODOTXT_CFG_FILE" ] || die "Fatal error: Cannot read configuration file $TODOTXT_CFG_FILE"
@@ -421,6 +470,24 @@ fi
# === HEAVY LIFTING === # === HEAVY LIFTING ===
shopt -s extglob shopt -s extglob
_addto() {
file="$1"
input="$2"
cleaninput $input
if [[ $TODOTXT_DATE_ON_ADD = 1 ]]; then
now=`date '+%Y-%m-%d'`
input="$now $input"
fi
echo "$input" >> "$file"
[ $TODOTXT_VERBOSE -gt 0 ] && {
TASKNUM=$(sed -n '$ =' "$file")
BASE=$(basename "$file")
PREFIX=$(echo ${BASE%%.[^.]*} | tr [a-z] [A-Z])
echo "${PREFIX}: '$input' added on line $TASKNUM."
}
}
_list() { _list() {
local FILE="$1" local FILE="$1"
## If the file starts with a "/" use absolute path. Otherwise, ## If the file starts with a "/" use absolute path. Otherwise,
@@ -479,10 +546,13 @@ _list() {
## Number the file, then run the filter command, ## Number the file, then run the filter command,
## then sort and mangle output some more ## then sort and mangle output some more
if [[ $TODOTXT_DISABLE_FILTER = 1 ]]; then
TODOTXT_FINAL_FILTER="cat"
fi
items=$( items=$(
sed = "$src" \ sed = "$src" \
| sed "N; s/^/ /; s/ *\(.\{$PADDING,\}\)\n/\1 /" \ | sed "N; s/^/ /; s/ *\(.\{$PADDING,\}\)\n/\1 /" \
| grep -v "^[0-9]\+ *$" | grep -v "^[ 0-9]\+ *$"
) )
if [ "${filter_command}" ]; then if [ "${filter_command}" ]; then
filtered_items=$(echo -ne "$items" | eval ${filter_command}) filtered_items=$(echo -ne "$items" | eval ${filter_command})
@@ -517,11 +587,13 @@ _list() {
echo -ne "$filtered_items${filtered_items:+\n}" echo -ne "$filtered_items${filtered_items:+\n}"
if [ $TODOTXT_VERBOSE -gt 0 ]; then if [ $TODOTXT_VERBOSE -gt 0 ]; then
BASE=$(basename "$FILE")
PREFIX=$(echo ${BASE%%.[^.]*} | tr [a-z] [A-Z])
NUMTASKS=$( echo -ne "$filtered_items" | sed -n '$ =' ) NUMTASKS=$( echo -ne "$filtered_items" | sed -n '$ =' )
TOTALTASKS=$( echo -ne "$items" | sed -n '$ =' ) TOTALTASKS=$( echo -ne "$items" | sed -n '$ =' )
echo "--" echo "--"
echo "TODO: ${NUMTASKS:-0} of ${TOTALTASKS:-0} tasks shown from $FILE" echo "${PREFIX}: ${NUMTASKS:-0} of ${TOTALTASKS:-0} tasks shown"
fi fi
if [ $TODOTXT_VERBOSE -gt 1 ] if [ $TODOTXT_VERBOSE -gt 1 ]
then then
@@ -561,14 +633,29 @@ case $action in
shift shift
input=$* input=$*
fi fi
_addto "$TODO_FILE" "$input"
cleanup;;
if [[ $TODOTXT_DATE_ON_ADD = 1 ]]; then "addm")
now=`date '+%Y-%m-%d'` if [[ -z "$2" && $TODOTXT_FORCE = 0 ]]; then
input="$now $input" echo -n "Add: "
read input
else
[ -z "$2" ] && die "usage: $TODO_SH addm \"TODO ITEM\""
shift
input=$*
fi fi
echo "$input" >> "$TODO_FILE"
TASKNUM=$(sed -n '$ =' "$TODO_FILE") # Set Internal Field Seperator as newline so we can
[ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: '$input' added on line $TASKNUM." # loop across multiple lines
SAVEIFS=$IFS
IFS=$'\n'
# Treat each line seperately
for line in $input ; do
_addto "$TODO_FILE" "$line"
done
IFS=$SAVEIFS
cleanup;; cleanup;;
"addto" ) "addto" )
@@ -580,9 +667,7 @@ case $action in
input=$* input=$*
if [ -f "$dest" ]; then if [ -f "$dest" ]; then
echo "$input" >> "$dest" _addto "$dest" "$input"
TASKNUM=$(sed -n '$ =' "$dest")
[ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: '$input' added to $dest on line $TASKNUM."
else else
echo "TODO: Destination file $dest does not exist." echo "TODO: Destination file $dest does not exist."
fi fi
@@ -602,9 +687,13 @@ case $action in
else else
input=$* input=$*
fi fi
cleaninput $input
if sed -i.bak $item" s|^.*|& $input|" "$TODO_FILE"; then if sed -i.bak $item" s|^.*|& $input|" "$TODO_FILE"; then
newtodo=$(sed "$item!d" "$TODO_FILE") [ $TODOTXT_VERBOSE -gt 0 ] && {
[ $TODOTXT_VERBOSE -gt 0 ] && echo "$item: $newtodo" newtodo=$(sed "$item!d" "$TODO_FILE")
echo "$item: $newtodo"
}
else else
echo "TODO: Error appending task $item." echo "TODO: Error appending task $item."
fi fi
@@ -665,9 +754,11 @@ case $action in
if [ "$?" -eq 0 ]; then if [ "$?" -eq 0 ]; then
#it's all good, continue #it's all good, continue
sed -i.bak -e $item"s/^(.) //" "$TODO_FILE" sed -i.bak -e $item"s/^(.) //" "$TODO_FILE"
NEWTODO=$(sed "$item!d" "$TODO_FILE") [ $TODOTXT_VERBOSE -gt 0 ] && {
[ $TODOTXT_VERBOSE -gt 0 ] && echo -e "`echo "$item: $NEWTODO"`" NEWTODO=$(sed "$item!d" "$TODO_FILE")
[ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: $item deprioritized." echo "`echo "$item: $NEWTODO"`"
echo "TODO: $item deprioritized."
}
cleanup cleanup
else else
die "$errmsg" die "$errmsg"
@@ -675,20 +766,33 @@ case $action in
"do" ) "do" )
errmsg="usage: $TODO_SH do ITEM#" errmsg="usage: $TODO_SH do ITEM#"
item=$2 # shift so we get arguments to the do request
[ -z "$item" ] && die "$errmsg" shift;
[[ "$item" = +([0-9]) ]] || die "$errmsg"
todo=$(sed "$item!d" "$TODO_FILE") # Split multiple do's, if comma seperated change to whitespace sepereated
[ -z "$todo" ] && die "$item: No such todo." # Loop the 'do' function for each item
for item in `echo $* | tr ',' ' '`; do
[ -z "$item" ] && die "$errmsg"
[[ "$item" = +([0-9]) ]] || die "$errmsg"
now=`date '+%Y-%m-%d'` todo=$(sed "$item!d" "$TODO_FILE")
# remove priority once item is done [ -z "$todo" ] && die "$item: No such todo."
sed -i.bak $item"s/^(.) //" "$TODO_FILE"
sed -i.bak $item"s|^|&x $now |" "$TODO_FILE" # Check if this item has already been done
newtodo=$(sed "$item!d" "$TODO_FILE") if [ `echo $todo | grep -c "^x "` -eq 0 ] ; then
[ $TODOTXT_VERBOSE -gt 0 ] && echo "$item: $newtodo" now=`date '+%Y-%m-%d'`
[ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: $item marked as done." # remove priority once item is done
sed -i.bak $item"s/^(.) //" "$TODO_FILE"
sed -i.bak $item"s|^|&x $now |" "$TODO_FILE"
[ $TODOTXT_VERBOSE -gt 0 ] && {
newtodo=$(sed "$item!d" "$TODO_FILE")
echo "$item: $newtodo"
echo "TODO: $item marked as done."
}
else
echo "$item is already marked done"
fi
done
if [ $TODOTXT_AUTO_ARCHIVE = 1 ]; then if [ $TODOTXT_AUTO_ARCHIVE = 1 ]; then
archive archive
@@ -696,7 +800,13 @@ case $action in
cleanup ;; cleanup ;;
"help" ) "help" )
help if [ -t 1 ] ; then # STDOUT is a TTY
if (exec which ${PAGER:-less} 2>/dev/null >/dev/null); then
# we have a working PAGER (or less as a default)
help | exec ${PAGER:-less}
fi
fi
help # just in case something failed above, we go ahead and just spew to STDOUT
;; ;;
"list" | "ls" ) "list" | "ls" )
@@ -818,12 +928,33 @@ case $action in
else else
input=$* input=$*
fi fi
cleaninput $input
if sed -i.bak $item" s|^.*|$input &|" "$TODO_FILE"; then # Test for then set priority
newtodo=$(sed "$item!d" "$TODO_FILE") if [ `sed "$item!d" "$TODO_FILE"|grep -c "^(\\w)"` -eq 1 ]; then
[ $TODOTXT_VERBOSE -gt 0 ] && echo "$item: $newtodo" priority=$(sed "$item!d" "$TODO_FILE" | awk -F '\\(|\\)' '{print $2}')
fi
# If priority isn't set prepend
if [ -z $priority ]; then
if sed -i.bak $item" s|^.*|$input &|" "$TODO_FILE"; then
[ $TODOTXT_VERBOSE -gt 0 ] && {
newtodo=$(sed "$item!d" "$TODO_FILE")
echo "$item: $newtodo"
}
else
echo "TODO: Error prepending task $item."
fi
# If priority is set, remove priority, prepend and add back priority
else else
echo "TODO: Error prepending task $item." if sed -i.bak -e "$item s/^(.) //" -e "$item s|^.*|\($priority\) $1 &|" "$TODO_FILE"; then
[ $TODOTXT_VERBOSE -gt 0 ] && {
newtodo=$(sed "$item!d" "$TODO_FILE")
echo "$item: $newtodo"
}
else
echo "TODO: Error prepending task $item."
fi
fi fi
cleanup;; cleanup;;
@@ -843,9 +974,11 @@ note: PRIORITY must be anywhere from A to Z."
if [ "$?" -eq 0 ]; then if [ "$?" -eq 0 ]; then
#it's all good, continue #it's all good, continue
sed -i.bak -e $item"s/^(.) //" -e $item"s/^/($newpri) /" "$TODO_FILE" sed -i.bak -e $item"s/^(.) //" -e $item"s/^/($newpri) /" "$TODO_FILE"
NEWTODO=$(sed "$item!d" "$TODO_FILE") [ $TODOTXT_VERBOSE -gt 0 ] && {
[ $TODOTXT_VERBOSE -gt 0 ] && echo -e "`echo "$item: $NEWTODO"`" NEWTODO=$(sed "$item!d" "$TODO_FILE")
[ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: $item prioritized ($newpri)." echo "`echo "$item: $NEWTODO"`"
echo "TODO: $item prioritized ($newpri)."
}
cleanup cleanup
else else
die "$errmsg" die "$errmsg"
@@ -861,18 +994,31 @@ note: PRIORITY must be anywhere from A to Z."
todo=$(sed "$item!d" "$TODO_FILE") todo=$(sed "$item!d" "$TODO_FILE")
[ -z "$todo" ] && die "$item: No such todo." [ -z "$todo" ] && die "$item: No such todo."
# Test for then set priority
if [ `sed "$item!d" "$TODO_FILE"|grep -c "^(\\w)"` -eq 1 ]; then
priority=$(sed "$item!d" "$TODO_FILE" | awk -F '\\(|\\)' '{print $2}')
fi
if [[ -z "$1" && $TODOTXT_FORCE = 0 ]]; then if [[ -z "$1" && $TODOTXT_FORCE = 0 ]]; then
echo -n "Replacement: " echo -n "Replacement: "
read input read input
else else
input=$* input=$*
fi fi
cleaninput $input
sed -i.bak $item" s|^.*|$input|" "$TODO_FILE" # If priority isn't set replace, if it is remove priority, replace then add priority again
[ $TODOTXT_VERBOSE -gt 0 ] && NEWTODO=$(head -$item "$TODO_FILE" | tail -1) if [ -z $priority ]; then
[ $TODOTXT_VERBOSE -gt 0 ] && echo "$item: $todo" sed -i.bak $item" s|^.*|$input|" "$TODO_FILE"
[ $TODOTXT_VERBOSE -gt 0 ] && echo "replaced with" else
[ $TODOTXT_VERBOSE -gt 0 ] && echo "$item: $NEWTODO" sed -i.bak -e "$item s/^(.) //" -e "$item s|^.*|\($priority\) $input|" "$TODO_FILE"
fi
[ $TODOTXT_VERBOSE -gt 0 ] && {
NEWTODO=$(head -$item "$TODO_FILE" | tail -1)
echo "$item: $todo"
echo "replaced with"
echo "$item: $NEWTODO"
}
cleanup;; cleanup;;
"report" ) "report" )