Compare commits

..

134 Commits

Author SHA1 Message Date
Florian Tham
3a369110d6 Prio-Tasks färben nicht mehr die ganze Zeile ein 2024-03-08 14:57:53 +01:00
Florian Tham
afdc68fc67 again: wie allg. Metadaten behandeln 2024-03-06 07:56:05 +01:00
Florian Tham
e6d80bac04 merge upstream/master 2024-02-29 15:07:09 +01:00
Edwin Kofler
fd753c6c2e style: Fix typo in pull request template (#420) 2023-08-16 14:09:15 -05:00
Ingo Karkat
c8fa5f1ebc Fix failing MacOS 11 tests and remove obsolete build platforms
Integrated via #415

Merge branch 'chrysle:fix-macos-11-tests'
2023-06-30 17:10:37 +02:00
Ingo Karkat
aa38153586 Housekeeping: Remove obsolete build platforms
GitHub runners for Ubuntu 18.04 and MacOS 10.15 are not available any longer.
2023-06-30 16:59:44 +02:00
chrysle
b10904bb20 Remove hacks 2023-06-30 15:11:44 +02:00
chrysle
ef5b71496d Fix macOS tests 2023-06-30 15:05:39 +02:00
Ali Karbassi
ea32af34e6 Updated GitHub Actions Environments (#372)
Rather than `*-latest`, I'm specifying specific environments.
2021-12-02 15:49:42 -06:00
Lawrence Liu
d0075e4d57 Different folder to copy ~/.todo.cfg for macOS on arm/x86 CPU (#369) 2021-11-19 07:48:16 -06:00
a1346054
2d70a0aadf Minor fixes identified through shellcheck and other tools (#350)
* fix whitespace

* fix spelling

* fix whitespace

* unify headers of tests

* fix some issues in tests, identified by shellcheck

* fix bash completions

bash completion files are not supposed to be executable

* fix some issues identified by shellcheck

Co-authored-by: Ali Karbassi <ali@karbassi.com>
2021-08-09 15:03:49 -05:00
Ingo Karkat
ee94a3fac5 Return from user prompt without requiring Enter (#354)
* Tests: Add coverage for del / move without -f, but with prompting

Supplying the user confirmation via "yes".

* Cosmetics: Align inconsistent spacing for before (y/n) prompt

* Refactoring: Extract confirm() function

The user confirmation query had been duplicated (once) in the code.

* Refactoring: confirm(): Leave early if forced

* Return from user prompt without requiring Enter

By just reading a single character (y for yes, anything else: no).



* Tests: Ensure that only a single "y" concludes the confirmation

By switching from "yes" (that endlessly prints newline-separated "y"s) to "printf y".

* t1800-del: Add coverage for negative confirmation

Negative means "anything but y", so "n", "x", and Enter all apply.

* Cosmetics: Add trailing space after (y/n) prompt

So that the user's typed answer is not recorded directly after it, but with separation: "Foo? (y/n) y" instead of "Foo? (y/n)y".

*Compatibility: "read -N 1" is only available in Bash 4.1+

Mac OS still ships with Bash 3.2 :-( Fall back to the original prompting that requires conclusion via Enter then.
Note: Even though the tests use "printf y", this still gets accepted, as there'll be EOF after that. In real use (when stdin from the terminal stays open), a concluding Enter is mandatory, though.

Closes #152
2021-08-06 15:05:11 -05:00
Keith
587833bb4e Default to user writable directory in config (#148)
When a user installs from a package manager (MacPorts, Homebrew, `yum`, etc.), the `todo.sh` script is installed into a restricted folder.  This means that the result of `$(basename "$0")` is a directory where the user cannot write without elevated permissions.  This generates additional noise when the user first runs `todo.sh -h`.  An alternative is to default to the user's personal directory which is known to exist and will be writable by the user.
2021-08-06 09:14:25 -05:00
Tim
eb7feaefb5 Fix problem with spaces in directory path (#276)
If the current directory had spaces in the directory path, this script would fail.
That has been fixed by appropriate use of quotes.

Co-authored-by: Tim Learmont <learmont@NocturnalAviation.com>
Co-authored-by: Ali Karbassi <ali@karbassi.com>
2021-08-03 18:11:27 -05:00
Wallysson
7501d37b45 use builtin "command -v" instead of which (#308) 2021-08-03 18:10:28 -05:00
Ingo Karkat
6ea2b5ae6d Mention all (also XDG) config file locations in help for -d (#343)
* Refactoring: Replace serial checks for `TODOTXT_CFG_FILE` and `TODO_ACTIONS_DIR` with loops

Two fallbacks (like for the actions dir) may still be fine, but we're now supporting so many config locations that a loop is much shorter, and the various locations are much easier to see.

For consistency, also apply this to the actions dir lookup, although it's less of a problem there.

* Refactoring: Apply the first default for `TODOTXT_CFG_FILE` also in the loop

There's no need to handle this separately; either an exported environment variable already exists, or it got assigned via `-d CONFIG_FILE`, or the `test -e` will fail on an empty (or bad non-existing) value, and we enter the fallback loop.

* Mention the actual config file locations in the help for `-d`

Extract the list of default locations into a `configFileLocations` array and join that into a string that then gets interpolated into the help output for `-d` (that so far only mentioned the first default location).

* Comments: Don't favor a single config location in the requirement

* Documentation: Mention `~/.todo/config` as just one of the defaults

As there are several others, now shown in the help for `-d`.

I don't want to duplicate the entire list here, as there's a high risk of those lists diverging.

Fixes #342
2021-08-03 18:06:10 -05:00
Paul Mansfield
353db49814 Allow multiple priorities on single run (#346)
Uses current priority logic and option tests just running multiple times until item and priority pairs are exhausted or stops on first error.

Tests for multiple priorities, multiple re-prioritization and a couple of errors.
2021-08-03 18:03:20 -05:00
Ingo Karkat
f884f73297 TESTSFIX: t0000-config.sh may unintentionally pick up existing user config in $XDG_CONFIG_HOME/todo/config (#349)
* TESTSFIX: t0000-config.sh may unintentionally pick up existing user config in `$XDG_CONFIG_HOME/todo/config`

This corner case was missed when the XDG alternative config location was introduced, likely because the variable isn't set by default on Ubuntu or Mac OS, and none of the developers had a config there.

HOME is already redirected to the current working directory; as `XDG_CONFIG_HOME` is just a config alternative that has a fallback to `$HOME/.config`, simply unset it.

Fixes #347

* TESTSFIX: User add-ons that override built-in actions may break tests

If `TODO_ACTIONS_DIR` is already defined, the defaulting in todo.sh are skipped. The user may have custom add-ons that override built-in actions; any incompatible behavior would negatively affect the tests then.

By setting the variable to the first default location, we avoid this interference.
2021-08-03 17:57:31 -05:00
Ali Karbassi
e4103a8e23 Add Ubuntu 18 to tests (#351) 2021-08-03 17:53:35 -05:00
Ingo Karkat
77c1f34609 Documentation: Clarify basic regexp syntax of TERM in todo.sh list (#335)
* Documentation: Clarify basic regexp syntax of TERM in todo.sh list

And give hints about escaping.
Issue raised by https://github.com/todotxt/todo.txt-cli/discussions/334

* Documentation: Correct quoting in todo.sh help list

Though the double quoting doesn't do harm when the single backslash is followed by the | character (\| is no valid escape sequence), it's technically more correct to use single quotes, and also is more in line with the quoting advice given directly below it.
2021-03-13 13:32:40 -06:00
Ali Karbassi
71b3991daf Gitter chat to Github Discussions 2020-12-11 13:07:11 -06:00
Tyler Szabo
6188785e48 Fix tests on Debian (#326)
Corrected an additional regex to match tags on mawk 1.3.3 in Debian
2020-12-04 15:32:53 -06:00
Daniel M
797604e2b6 Fixed tests on ubuntu #317 (#322)
Tests failed on Ubuntu due to regular expression - corrected regex and now it works.
2020-11-20 20:33:06 -06:00
Oleg Zaytsev
7bac9d861b s/GREY/GRAY/ in todo.cfg (#320)
`GRAY` is the spelling used in every other place in this repository.
2020-10-22 00:36:05 -05:00
Ali Karbassi
ae1f241887 Update zip file creation to use native zip command. (#319)
Fixes #318
2020-09-10 13:12:04 -05:00
Ali Karbassi
7f3ad0d361 Update changelog. Tag v2.12.0 2020-08-11 23:36:30 -05:00
Ali Karbassi
ce38bea819 Add note in README to copy config file (#316)
Fixes #252 (by adding a note to README)
2020-08-11 23:03:05 -05:00
Jonas Stehli
da45b0f637 Change Arch Linux AUR link (#310)
there is a second version that is much more popular, why not link that one?
2020-06-09 17:05:06 -05:00
Luilver
ddc560c6b9 Fix #306 (#307) 2020-05-25 10:41:09 -05:00
Ingo Karkat
bf1bf1ae84 ENH: Allow to customize what can be before / inside / after +project and @context (#271)
* ENH: Allow to customize what can be before / inside / after +project and @context

I noticed that todo.sh mistakenly picks up some random stuff as projects and contexts. The todo.txt specification is very lenient in what makes those (allowing any length of non-whitespace characters), but in practice, every user has its own idea of the set of used words. This change allows (expert) users to tweak the pattern (via TODOTXT_SIGIL_VALID_PATTERN), to be able to reduce the amount of "false positives" that listproj and listcon show.
Additionally, there's a (mainly unspecified) extension mechanism in the form of key:value, which often is used to implement custom "markers", like w:something to make a task blocked and waiting for "something". It would be nice to be able to refer to @contexts (and maybe also +projects), but the default syntax (which requires whitespace around those) doesn't allow it, and these context then don't show up in searches, which is unfortunate. The added TODOTXT_SIGIL_BEFORE_PATTERN and TODOTXT_SIGIL_AFTER_PATTERN allow to tweak the syntax to accommodate this.
The implementation just exchanges grep with a corresponding sed pipeline step, which shouldn't negatively affect the performance at all (as sed is one of the main commands used thoughout the script), but which allows for the additional matching flexibility.

* FIX: Compatibility: sed \? multi not supported on MacOS

Use the POSIX \{0,1\} instead.

* FIX: Compatibility: sed \| multi not supported on MacOS

Concatenate both alternatives as optional matches; this is only an approximation but satisfies the test case here. It would probably be better if the entire sed code used extended regular expression syntax (-E) instead of basic ones (-e), but that change would also affect all add-ons. As this is an optional customization feature, uses who really need this either also have to work around, or supply a GNU sed port on MacOS.

* FIX: Compatibility: sed \+ multi not supported on MacOS

Use the POSIX \{1,\} instead.

Co-authored-by: Ali Karbassi <ali@karbassi.com>
2020-03-30 18:13:29 -05:00
Ingo Karkat
177432ec94 ENH: Enable file completion for add-on actions via _todo_file{1,2,3}_actions (#270)
* Refactoring: Use regular expression match instead of case globbing for actions taking a SRC argument

Making it consistent with the test for MOVE_COMMAND_PATTERN, and allowing to extend the pattern with custom actions in the future.

* Refactoring: Move the anchoring and grouping out of MOVE_COMMAND_PATTERN

So that additional (custom) add-on actions can be configured in the future.

* ENH: Enable file completion for add-on actions via _todo_file{1,2,3}_actions

Allowing completion of todo files directly after the add-on action (1), with one (2) / two (3) arguments in between. This should handle most cases.

In order to configure the add-on completion, the corresponding configuration variable has to be defined in the user's shell (e.g. via ~/.bashrc):
_todo_file1_actions='myaction|anotheraction'
2020-03-30 17:44:50 -05:00
Ali Karbassi
abdbe5371c Clean up files (#302) 2020-03-29 21:26:56 -05:00
Ali Karbassi
1378c97d80 Allow setting of bash completion path (#301)
Fixes #242
2020-03-29 14:53:42 -05:00
85
3d308a6f79 Minimal config file / default filenames (todo.txt, done.txt, report.txt) (#289)
* Set default files name

* Add test for minimal config file
2020-03-29 14:33:16 -05:00
LeLobster
c6d290b5fb Fix the Makefile to work with the install instructions in the README (#259)
* Fix the Makefile to work with the install instructions in the README

* Put back DEST_DIR

* Add simple ifdef checks to see if the user has set custom dirs via the commandline

* Update README to match Makefile
2020-03-29 14:29:40 -05:00
Tiziano Zito
355166da67 Highlighting of dates, metadata and item numbers (#264)
* add highlighting of dates, item numbers, and metadata

* add test for highlighting of dates, item numbers, and metadata

Co-authored-by: Ali Karbassi <ali@karbassi.com>
2020-03-29 14:20:06 -05:00
Ingo Karkat
20317b6321 Refactoring: Extract the many complex sed arguments into sedTransformations array and move the comments closer (#273)
There's too much distance between the comments that describe the various transformations that are done on the referenced task, and the corresponding sed expressions.
By using a local Bash array, we can collect the arguments and have the comments close by.

Co-authored-by: Ali Karbassi <ali@karbassi.com>
2020-03-29 12:27:25 -05:00
Ingo Karkat
861ad5ec41 Fix/noeol (#295)
* Handle missing EOL in todo.txt

This can happen easily with certain editors (such as Mousepad) that do not automatically add a newline character at the end of a file.
In _addto(), ensure a trailing newline via sed (taken from https://unix.stackexchange.com/a/31955/18876).

Fixes #294

* Tests: Add basic coverage of move

* Handle missing EOL in todo.txt for move, too

This can happen easily with certain editors (such as Mousepad) that do not automatically add a newline character at the end of a file.

* Refactoring: Extract fixMissingEndOfLine()

* FIX: Compatibility: sed \+ multi not supported on MacOS

Use the POSIX \{1,\} instead.

Co-authored-by: Ali Karbassi <ali@karbassi.com>
2020-03-29 12:03:33 -05:00
Ali Karbassi
13b451b81d Add support for macOS catalina date (#300)
Co-authored-by: Benoit Sagols <benoit.sagols@gmail.com>
2020-03-29 10:27:43 -05:00
Ali Karbassi
34d31ef45a Fix macOS 10.15 date test (#299)
- In macOS 10.15, the `date` command adds a "-R" flag. This can be seen in the default error display. Since the flags have changed, the grep command to find which version of macOS date binary we have. Because of this change, we need to do our own check for macOS 10.15.

- Remove windows from the github actions as this tool is not for Windows, currently.
2020-03-27 21:32:29 -05:00
Ali Karbassi
8901db8bdd Add multiple environments (#298) 2020-03-27 20:13:02 -05:00
Ali Karbassi
c9540122e6 Create GitHub action to run tests (#296)
* Create GitHub Action
* Remove travis yml to move to github actions.
* Update CI badge in README
2020-03-27 19:44:45 -05:00
Florian Tham
19dde076cf remove accidentally commited swap file 2018-11-06 11:08:01 +01:00
Florian Tham
3bc3616651 optionally colorized date extensions (due, threshold and again) 2018-11-06 10:58:18 +01:00
kh80
d589fd0570 Add 'done' option as alias of 'do' (#169) 2018-04-11 13:34:19 -05:00
tpikonen
7a30199fe0 Cleanup (#247)
- Fixed: Reduce shellcheck warnings.
- Fixed: Remove trailing whitespace.
- Fixed: Double quote to prevent globbing and word splitting. [SC2086]
- Fixed: Invalid flags are not handled. [SC2220]
- Fixed: Cleaned up string replaces.
2018-04-04 19:33:09 -05:00
tpikonen
867ade5701 new: Add default priority variable TODOTXT_PRIORITY_ON_ADD. (#246)
Adds the config / env variable `TODOTXT_PRIORITY_ON_ADD`, which when set to one of the capital letters `A` to `Z` is given as a priority to a new task, if a priority is not given on command line.
2018-03-28 16:58:48 -05:00
Anton Ermolenko
14f5de1579 interpreter reference update to be portable (#160) 2018-03-28 16:09:07 -05:00
Guilherme Reis
7ec2a1263e Read the task's name and uses as default (#249)
Read the task's name and uses as default, so the user can read the previous task's name.

Thanks @guifeliper
2018-03-26 13:23:27 -05:00
Ali Karbassi
e40e76fb07 Release version 2.11.0 (#236)
Read CHANGELOG.md
2018-03-26 11:09:35 -05:00
AJ Jordan
8b35c5fdae Set the executable bit when preparing releases (#156) 2018-03-26 10:51:33 -05:00
Adam Goldsmith
8ec3bab53c Make Makefile more standard (#239) 2017-12-04 08:57:27 -06:00
R. Francis Smith
4a7626a8cb fixed typo within Contributing section (#240) 2017-11-20 14:42:31 -06:00
Ali Karbassi
9c390a84cb fix: Update url in code. (#237) 2017-10-23 14:20:37 -05:00
Ali Karbassi
643dafeafd Create PULL_REQUEST_TEMPLATE.md (#234) 2017-10-23 14:18:46 -05:00
Ali Karbassi
8d3ea7971b change: Moved USAGE out of README. (#238)
The usage was making the README extremely long and unruly. Let's move it
out to it's own file so it can be updated quickly as well.
2017-10-17 13:00:42 -05:00
Alberto Fanjul
64f9c8295d new: Configurable config dir (#223)
- Configurable config dir
- Describe Makefile options
2017-10-16 10:01:47 -05:00
Simon M
b7fb2ac2be fix: Make text input more user-friendly (#208)
The use of the default read command will not allow the user to use arrow keys and shortcuts to enter the data when doing a replace or entering any input, which can be frustrating. Besides, backslashed are interpreted and can be mangled.

- Using the `-e` option will trigger the use of the readline library: you can then, as expected in bash, use the arrow keys and all shortcuts to move around the line before pressing enter.
- Using the `-r` option will prevent the interpretation of the "" and insert them as typed, useful when pasting code:
2017-10-13 16:32:13 -05:00
Ali Karbassi
1d64ba59ca Create ISSUE_TEMPLATE.md (#235) 2017-10-11 10:19:09 -05:00
Ali Karbassi
4df0f15ad8 fix: Use git tags for version numbers. (#233) 2017-10-11 10:10:59 -05:00
Gutierri Barboza
a43d664fe9 README (#219)
- Updated badges, links, and install instructions.
- Added usage, flags, and commands.
2017-10-10 14:07:36 -05:00
Gutierri Barboza
953506dc6b Create Changelog (#218)
- Complete history from wiki page
- Matches keepachangelog standards via http://keepachangelog.com/en/1.0.0/
2017-10-10 13:04:55 -05:00
Ali Karbassi
cbca5d2ff6 Create CODE_OF_CONDUCT.md (#217) 2017-10-10 09:20:26 -05:00
Daniel St.Jacques
94e1c6e406 Updated add command to accept lowercase priority (#230)
- Updated add command to accept lowercase priority
- Added testcase for add with lowercase priority
2017-10-10 09:10:34 -05:00
Ali Karbassi
eeb5703728 Merge pull request #228 from cori/patch-1
Updates to Downloads
2017-10-01 21:29:57 -05:00
cori schlegel
a6cf0c0fc2 Updates to Downloads
Update Downloads links to point at the Releases page, because it seems like the files from @ginatrapani's project (which these linked to) didn't make it to the new org's files, so the links on the redirected page are no good.
2017-10-01 16:30:05 -05:00
Ali Karbassi
b52929b396 Merge branch 'karbassi-feature/completion-suppress-errormsgs'
* karbassi-feature/completion-suppress-errormsgs:
  Suppress todo.sh error messages when invoked during completion (#8)
2017-08-23 12:24:05 -05:00
Ali Karbassi
0e833e4e9d Merge branch 'master' into feature/completion-suppress-errormsgs 2017-08-23 12:23:06 -05:00
Ali Karbassi
52d47a4d80 Merge branch 'onovy-makefile-fix'
* onovy-makefile-fix:
  Don't ignore errors in tests.
  Clean tests and version file in Makefile.
2017-08-23 10:18:28 -05:00
Ali Karbassi
d61299ef9f Merge branch 'makefile-fix' of github.com:onovy/todo.txt-cli into onovy-makefile-fix
* 'makefile-fix' of github.com:onovy/todo.txt-cli:
  Don't ignore errors in tests.
  Clean tests and version file in Makefile.
2017-08-23 10:17:39 -05:00
Ingo Karkat
efea0faf78 Suppress todo.sh error messages when invoked during completion (#8)
Redirect any stderr output from todo.sh during completion to /dev/null, as it gets in the way. The error will be seen later after building and executing the command-line, anyway.

Signed-off-by: Ali Karbassi <ali@karbassi.com>
2017-08-23 10:10:50 -05:00
Ali Karbassi
8fed2da86f Merge pull request #154 from ad1217/master
add support for $XDG_CONFIG_HOME config file/actions location
2017-08-23 07:11:01 -05:00
Adam Goldsmith
34b6135415 add support for $XDG_CONFIG_HOME config file/actions location 2017-08-22 23:24:23 -04:00
Ali Karbassi
21f3a9da36 Merge pull request #215 from todotxt/feature/contributing
CONTRIBUTING.md rewrite
2017-08-19 21:21:55 -05:00
Ali Karbassi
6e1003b51e Draft of CONTRIBUTING.md updates.
Using https://github.com/nayafia/contributing-template/ as a template.
2017-08-18 21:06:56 -05:00
Ali Karbassi
3c2ad85b47 Merge pull request #197 from rajaravivarma-r/typo-fix
Typo fix.
2017-08-18 21:02:01 -05:00
RajaRaviVarma
095bdb380a Typo fix.
* 'from' was misspelled as 'fron', corrected it.
2016-12-06 13:32:10 +05:30
Gina Trapani
66634da336 Merge pull request #155 from ashleyblackmore/patch-1
Update todo.cfg
2016-02-01 16:29:08 -05:00
Gina Trapani
a510598998 Merge pull request #173 from jish/patch-1
Update links to use https
2016-02-01 16:26:11 -05:00
Josh Lubaway
98141a6e36 Update links to use https
If the links in the comment at the top support https, prefer https.
2015-12-31 09:48:31 -08:00
Ashley Blackmore
2c279b65b1 Update todo.cfg
The script doesn't seem to expand the tilde for a user's home directory, and instead needs an absolute path. I have added a comment to help new users avoid the same pitfall.
2015-03-09 21:21:35 +01:00
onovy
5bee9c88a4 Don't ignore errors in tests. 2014-11-29 17:25:09 +01:00
onovy
f4ea40d677 Clean tests and version file in Makefile. 2014-11-29 17:24:25 +01:00
Gina Trapani
837ce22937 Add new config vars enabled in 07b50a07e0 2013-12-06 00:38:32 -08:00
nthorne
7c92f46c25 Allow for placing addons in subfolders.
Addons can be placed in subfolders with the same name as the action,
in order to be able to e.g. clone git repos into the TODO_ACTIONS_DIR
rather than having to download addons and manage updates manually.

Closes #120
2013-12-05 23:47:16 -08:00
Matt Wozniski
07b50a07e0 Allow coloring contexts and projects independently
Because @contexts and +projects are metadata as much as they are text,
it can be nice to highlight them independently of the coloring of the line
that contains them.  This is tough to do correctly in
a TODOTXT_FINAL_FILTER because doing it at that layer requires
re-parsing the text of the line to find the appropriate PRI_$x color to
reset to after coloring the word, or trying to reverse engineer where
the color codes inserted by todo.sh end and the user's text begins (and
vice versa).

Closes #119
2013-12-05 23:23:25 -08:00
Gina Trapani
745f5d5179 Merge pull request #111 from mgarrido/global_opts
Allow the use of a global config file
2013-12-05 23:06:37 -08:00
Gina Trapani
236069c519 Update build status 2013-12-05 21:16:21 -08:00
Gina Trapani
e60c14ab2b Merge pull request #123 from joshmoore/24pr-travis-yml
Enable Travis-CI
2013-12-05 20:35:31 -08:00
jmoore
33eb234048 Add Build Status to README 2013-12-03 20:13:42 +01:00
jmoore
42e7a079f8 Add .travis.yml
`make dist && sudo make install` are used
to install to /usr/local. `make test` then
verifies the changes.
2013-12-03 20:10:28 +01:00
Gina Trapani
1f410e4066 Merge pull request #116 from inkarkat/enh-allow-null-files
Allow configuring null data files and then don't create them.
2013-11-19 14:08:01 -08:00
Gina Trapani
d8ceb46364 Merge pull request #117 from pdclark/master
Fix changelog link in readme
2013-11-08 13:14:49 -08:00
Paul Clark
0d139d2027 Fix changelog link in readme 2013-11-05 23:26:14 +00:00
Ingo Karkat
07821f9cff Simplify empty data file creation.
No need to use the external cp command; shell redirection will create an
empty file for us.
2013-11-05 13:05:38 +01:00
Ingo Karkat
2faf072cf7 ENH: Allow configuring null data files and then don't create them.
Request from exatto (http://article.gmane.org/gmane.comp.diary.todotxt/4699), who doesn't want to use done.txt and report.txt.

Also consider character devices (-c; /dev/null is one) in the file existence checks so that no empty file is then created.
2013-11-05 13:02:40 +01:00
Manuel J. Garrido
ce365df67c Allow the use of global config file
If not found elsewhere, look for the config file in /etc/todo/config.
`make install` installs a global config file, setting TODO_DIR=~/.todo.
todo.sh creates TODO_DIR if it doesn't exist.
2013-06-24 13:39:50 +02:00
Manuel J. Garrido
93d8e16d50 Install using 'install' instead of 'cp'. Install 'todo.sh' instead of 'todo' 2013-06-24 09:49:32 +02:00
Gina Trapani
111afe6958 Merge pull request #101 from Thann/grep_options_fix
ensure GREP_OPTIONS doesn't break listproj output
2013-06-15 20:55:22 -07:00
Gina Trapani
92f7b724e6 Merge pull request #90 from danohuiginn/master
Make install
2013-06-15 20:51:23 -07:00
Jon Knapp
629a301d43 Added test case for GREP_OPTIONS 2013-02-02 16:15:29 -08:00
Gina Trapani
4a7dd852a6 Merge pull request #99 from benjaminoakes/master
Add CONTRIBUTING for GitHub integration
2013-02-01 19:43:54 -08:00
Jon Knapp
ec9613e19e ensure GREP_OPTIONS doesn't break listproj output 2013-02-01 11:03:24 -08:00
Benjamin Oakes
79845c8eb1 Also include title 2013-01-27 17:02:58 -06:00
Benjamin Oakes
b853198c3a Add CONTRIBUTING based on #15
https://github.com/ginatrapani/todo.txt-cli/issues/15
2013-01-27 17:01:11 -06:00
Gina Trapani
e1d6b91fa3 Merge pull request #94 from inkarkat/fix-shorthelp-custom-config
Fix shorthelp custom config
2012-08-30 10:31:16 -07:00
Ingo Karkat
8ff79102a5 ENH: Handle -h, shorthelp and help when a Fatal Error happens.
The user may need the help to solve any fatal error that appears while todo.sh isn't properly set up. As the help actions do not depend on any setting that the fatal errors check, we can still invoke them.

Factor out dieWithHelp() and use that for printing the fatal errors.
2012-08-30 13:16:02 +02:00
Ingo Karkat
8d8ef812a2 FIX: Short help -h inaccessible when custom config is used.
When short-circuiting the option parsing, the OPTIND must be adapted, too, so that the getopts processing loop is quit correctly.
2012-08-30 12:38:54 +02:00
Ingo Karkat
50aea1e4f0 Tests: Add basic coverage of -h / shorthelp.
For a start, this is basically an adapted version of tests/t2100-help.sh.
2012-08-30 12:20:09 +02:00
Gina Trapani
da683366f4 Merge pull request #89 from inkarkat/individual-help-enhancement
Individual help enhancement
2012-05-12 09:59:44 -07:00
Gina Trapani
7b5c983bb6 Merge pull request #83 from inkarkat/testlib-parse-enh
Testlib parse enhancements
2012-05-11 09:58:23 -07:00
Gina Trapani
f67f630466 Merge pull request #82 from inkarkat/listcon-filters
Accept filters for listcon, too.
2012-05-11 09:41:56 -07:00
Gina Trapani
fe27b10765 Merge pull request #84 from inkarkat/config-backtick-check
Config backtick check
2012-05-11 09:23:45 -07:00
Gina Trapani
137140a542 Merge pull request #85 from inkarkat/replace-fixes
FIX: Replacement with priority and date doesn't replace existing date.
2012-05-10 20:55:15 -07:00
Gina Trapani
322c6b95d6 Merge pull request #87 from inkarkat/complete-bash31-fix
FIX: todo_completion problem with Bash 3.1
2012-05-10 16:58:40 -07:00
Gina Trapani
28e8a4cd8b Merge pull request #88 from inkarkat/allow-post-filter-override
Allow use of post_filter_command for listall and listpri, too.
2012-05-10 16:41:51 -07:00
Gina Trapani
7f1bdbf3d9 Merge pull request #91 from inkarkat/complete-tasks-date-fix
BUG: completion of task number didn't remove add date.
2012-05-10 16:19:32 -07:00
Ingo Karkat
a5481990fd completion: Add recommendation about where to put alias customization.
There was a discussion on the mailing list about upgrades and where to put it.
2012-05-08 11:10:22 +02:00
Ingo Karkat
38d75afeff BUG: completion of task number didn't remove add date.
Need to make match of preceding priority optional.
Also tighten patterns for priority and done marker by anchoring them to the front, as the leading task number has already been substituted away.
2012-05-08 10:55:00 +02:00
Dan O'Huiginn
6473802644 Make install command 2012-04-28 12:49:19 +01:00
Ingo Karkat
6a3ddad787 FIX: test-lib: Print differences when test_expect_output fails.
When the command-under-test fails with a non-zero exit code, neither the different exit code nor any output differences are printed. Also, there's a lot of duplication between test_expect_output and test_expect_code_and_output. So, let's fix both by delegating the first to the latter.
2012-04-27 21:58:07 +02:00
Ingo Karkat
736e69bd6c Allow use of post_filter_command for listall and listpri, too.
For ls / _list(), custom add-ons can use post_filter_command for additional filtering before the highlighting is applied. Let's allow that for listall and listpri, too, although they employ post_filter_command themselves.
2012-04-25 14:48:09 +02:00
mcguiremkm
d2c44e9ffe FIX: todo_completion problem with Bash 3.1
Regexp matching changed from 3.1 to 3.2. Make it work for Bash 3.1 by using an intermediate variable, as in 394c4c748a.
Cp. http://tech.groups.yahoo.com/group/todotxt/message/4211
2012-04-25 09:33:54 +02:00
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
Ingo Karkat
3b0309d9bc Replace backticks in config with $(...)
This applies e24777fa2c to todo.cfg, too, and adds a verification to the existing test.

Note: Because todo.cfg is preprocessed by test-lib, we use the original config from the working copy, not the copy inside the test fixture.
2012-04-15 10:37:41 +02:00
Ingo Karkat
b21d16878f Tests: Hard-code location of todo.sh.
As todo.sh is placed by test-lib at a fixed place, avoid the lookup through which.
2012-04-15 10:35:17 +02:00
Ingo Karkat
3e82f3ca56 Tests: Extract backtick_check(). 2012-04-15 10:33:51 +02:00
Ingo Karkat
e5e31b0f75 Refactoring: Extract listWordsWithSigil() from listcon and listproj. 2012-04-13 21:16:33 +02:00
Ingo Karkat
35f9c4276c test-lib: Allow expected output with empty lines.
An empty line is used to delimit test commands in test_todo_session. (This wasn't properly reflected in the usage comment, fixed that, too.) This prevents us from testing commands that include empty lines. (Currently, there is no such output in todo.sh, but custom add-ons may have this.)
Instead of forcing the test to filter out the empty lines, extend the syntax to allow empty lines in the expected output by escaping them with a single backslash. (When redirecting via <<EOF, the backslash itself must be escaped = doubled; better use <<'EOF'.)
2012-04-13 16:54:40 +02:00
Ingo Karkat
661dac0cfb test-lib: Avoid eating leading whitespace in expected output.
Currently, todo.sh produces no indented output, so this hasn't affected tests so far. I found this while testing one of my custom actions with the test-lib.
By unsetting IFS, the read command won't strip off leading and trailing whitespace while parsing the test session definition.
2012-04-13 16:47:04 +02:00
Ingo Karkat
d7056c5e1e FIX: Mention filter capability in long help for listproj.
This was forgotten in the original enhancement in b824479.
2012-04-13 10:51:43 +02:00
Ingo Karkat
92322e7064 Accept filters for listcon, too.
This has been implemented for listproj already, for consistency in use and implementation, the same should be available for listcon, too.
2012-04-13 10:47:56 +02:00
55 changed files with 2421 additions and 418 deletions

46
.github/CODE_OF_CONDUCT.md vendored Normal file
View File

@@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at TBD@TBD.tld. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

97
.github/CONTRIBUTING.md vendored Normal file
View File

@@ -0,0 +1,97 @@
# Contributing
:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:
It's people like you that make [todo.txt] such a great tool.
The following is a set of guidelines for contributing to [todo.txt] and its packages. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request.
Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests.
[todo.txt] is an open source project and we love to receive contributions from our community — you! There are many ways to contribute, from writing tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be incorporated into [todo.txt] itself.
Please, don't use the issue tracker for support questions. Check whether our [Gitter.im] channel can help with your issue. Stack Overflow is also worth considering.
# Ground Rules
## Responsibilities
- Be welcoming to newcomers and encourage diverse new contributors from all backgrounds. See our [Code of Conduct].
- Ensure cross-platform compatibility for every change that's accepted. Windows, Mac, Linux.
- Create issues for any major changes and enhancements that you wish to make. Discuss things transparently and get community feedback.
- Don't add any classes to the codebase unless absolutely needed. Err on the side of using functions.
- Keep feature versions as small as possible, preferably one new feature per version.
# Your First Contribution
Unsure where to begin contributing? You can start by looking through these beginner and help-wanted issues:
- Beginner issues - issues which should only require a few lines of code, and a test or two.
- Help wanted issues - issues which should be a bit more involved than beginner issues.
Both issue lists are sorted by total number of comments. While not perfect, number of comments is a reasonable proxy for impact a given change will have.
At this point, you're ready to make your changes! Feel free to ask for help; everyone is a beginner at first :smile_cat:
If a maintainer asks you to "rebase" your PR, they're saying that a lot of code has changed, and that you need to update your branch so it's easier to merge.
# Getting started
For something that is bigger than a one or two line fix:
1. Create your own fork of the code.
1. Do the changes in your fork.
1. If you like the change and think the project could use it:
- Be sure you have followed the code style for the project.
- Note the [Code of Conduct].
As a rule of thumb, changes are obvious fixes if they do not introduce any new functionality or creative thinking. As long as the change does not affect functionality, some likely examples include the following:
- Spelling / grammar fixes
- Typo correction, white space and formatting changes
- Comment clean up
- Bug fixes that change default return values or error codes stored in constants
- Adding logging messages or debugging output
- Changes to metadata files like .gitignore, build scripts, etc.
- Moving source files from one directory or package to another
# How to report a bug
## Security Vulnerability
If you find a security vulnerability, do NOT open an issue. Get ahold of the maintainers personally.
In order to determine whether you are dealing with a security issue, ask yourself these two questions:
- Can I access something that's not mine, or something I shouldn't have access to?
- Can I disable something for other people?
If the answer to either of those two questions are "yes", then you're probably dealing with a security issue. Note that even if you answer "no" to both questions, you may still be dealing with a security issue, so if you're unsure, just email us directly.
## Bug
When filing an issue, make sure to answer these five questions:
1. What version of shell are you using (`echo $0` or `$(echo $SHELL) --version)`)?
1. What operating system and processor architecture are you using?
1. What did you do?
1. What did you expect to see?
1. What did you see instead?
# How to suggest a feature or enhancement
The [todo.txt] philosophy is to provide a plain-text, software-agnostic way to keep track of your tasks.
If you find yourself wishing for a feature that doesn't exist, you are probably not alone. There are bound to be others out there with similar needs. Many of the features that todo.txt-cli has today have been added because our users saw the need. Open an issue on our issues list on GitHub which describes the feature you would like to see, why you need it, and how it should work.
# Code review process
The core team looks at Pull Requests on a regular basis. After feedback has been given we expect responses within two weeks. After two weeks we may close the pull request if it isn't showing any activity.
# Community
You can chat with the core team on https://gitter.im/todotxt/.
[todo.txt]: https://github.com/todotxt/
[Code of Conduct]: ./CODE_OF_CONDUCT.md
[Gitter.im]: https://gitter.im/todotxt/

22
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,22 @@
**Do you want to request a *feature* or report a *bug*?**
**What is the current behavior?**
**If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem.**
**What is the expected behavior?**
**Which versions todo.sh are you using?**
> Run `todo.sh -V`
**Which Operating System are you using?**
**Which version of bash are you using?**
> Run `bash --version`

9
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,9 @@
**Before submitting a pull request,** please make sure the following is done:
- [ ] Fork [the repository](https://github.com/todotxt/todo.txt-cli) and create your branch from `master`.
- [ ] If you've added code that should be tested, add tests!
- [ ] Ensure the test suite passes.
- [ ] Lint your code with [ShellCheck](https://www.shellcheck.net/).
- [ ] Include a human-readable description of what the pull request is trying to accomplish.
- [ ] Steps for the reviewer(s) on how they can manually QA the changes.
- [ ] Have a `fixes #XX` reference to the issue that this pull request fixes.

BIN
.github/example.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 KiB

20
.github/workflows/tests.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
test:
strategy:
matrix:
platform: [ubuntu-20.04, macos-11]
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v2
- run: make
- run: make dist
- run: make test

511
CHANGELOG.md Normal file
View File

@@ -0,0 +1,511 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [2.12.0] - 2020-08-11
### Added
- Added default priority variable `TODOTXT_PRIORITY_ON_ADD` ([#246])
- Added `done` option as alias of `do` ([#169])
- Added macOS 10.15.x support ([#300])
- Highlighting of dates, metadata and item numbers ([#264])
- Minimal config file / default filenames (todo.txt, done.txt, report.txt) ([#289])
- Enable file completion for add-on actions via `_todo_file{1,2,3}_actions` ([#270])
- Allow to customize what can be before / inside / after `+project` and `@context` ([#271])
### Changed
- Read the task's name and uses as default ([#249])
- Updated interpreter reference to use environment variable ([#160])
- Allow setting of bash completion path ([#301])
### Fixes
- Fixed no end-of-line bug. Supports todos with no end-of-line. ([#295])
## [2.11.0] - 2018-03-26
### Added
- Added support for `$XDG_CONFIG_HOME` config file/actions location
- Created [CODE_OF_CONDUCT.md](.github/CODE_OF_CONDUCT.md) ([#217])
- Created [CHANGELOG.md](/CHANGELOG.md) ([#218])
### Changed
- Updated `add` command to accept lowercase priority ([#230])
- Clean tests and version file in Makefile. Don't ignore errors in tests.
- Updated [README.md](/README.md) ([#219])
- Update Downloads links to point at the Releases page ([#228])
- Set the executable bit when preparing releases ([#156])
### Fixes
- Update links to use https
- Suppress todo.sh error messages when invoked during completion ([#8])
## [2.10.0] - 2013-12-06
### Added
- Enable term filtering for listcon.
- Add make install command.
- Enable use of global config file in `/etc/todo/config`. `make install` installs a global config file.
- Allow use of `post_filter_command` for `listall` and `listpri`.
- Print usage help for custom action and all passed actions.
- Allow configuring null data files (done.txt and report.txt) and don't create
them.
- Color contexts and projects without an add-on, just by setting vars in the
config file.
- Place add-ons in subfolders (for easier git clone).
### Changed
- Improve code commenting/documentation.
- Refactor code for speed/better organization.
- Improve test coverage and test library.
### Removed
- Removed add date from line completion, ie, `todo.sh ls 10[tab]`.
### Fixed
- Properly replace date when replacing task with priority and date.
- Handle `-h`, `shorthelp`, and `help` when a Fatal Error happens.
- Fix `todo_completion` problem with Bash 3.1.
## [2.9.0] - 2012-04-08
### Added
- Added tab auto-completion of projects and contexts from `todo.txt` and `done.txt`. Type `@<Tab>` or `+<Tab>` while entering a task.
- Added new listaddons command displays installed addons.
- List priorities within a range using listpri. For example, to see tasks prioritized A-B, use `todo.sh listpri A-B`
### Fixed
- Fixed various cosmetic issues, bugs, and added developer test library enhancements.
## [2.8.0] - 2011-09-13
### Added
- `listpri`/`lsp` now filters by term. For example, `todo.sh lsp A book` will only return tasks prioritized `A` with the word book in them.
- Added support for todo directory paths with spaces in them.
- Tasks with priority included and auto prepend date on (`-t`) get the date where expected.
- Smarter action completion messaging: `do`, `pri`, and `depri` all let you know if a task is already done, prioritized, or deprioritized.
- Made more parameters available to offer more control to custom actions (`-c`, `-A`, `-N`, `-T`)
### Changed
- Improved portability for Dropbox or USB key users. If not specified, todo.sh checks for a config file in its own directory; default todo.txt location is todo.sh's directory.
- Improved script performance thanks to optimized code
- Exposed `cleaninput()` for use in addons
- Improved testing framework:
- Better escaped input handling
- Abstracted make_action function to test custom action behavior
- Added tests for source code compliance
- Cleaner, simpler, modernized, optimized code
### Fixed
- Custom action output no longer prefaced by `TODO:` so it's easier to see when the core script vs. addon is performing an action
- `listpri` complains if specified priority is invalid
- Don't abort task listing when items contain certain escape sequences (`\c \033`)
- Condense whitespace ONLY whe task is quoted; automatically convert CRLF to space
- Don't delete `|` (pipe) from task input
- `-+` and `-@` no longer break task coloring if context or project appears at the end of the line
## [2.7.0] - 2010-08-03
### Added
- Added generalization of the _PRI_X_ color support to all priorities
- Added highlighting of done, but not yet archived tasks via _COLOR_DONE_
- Color map (BLACK, ...) now supports spaces in the color definitions, making it possible to override the default ANSI escape codes with e.g. Conky tags (`${color black}`)
### Changed
- Cleanup: help messages, consistent output messages
- Exporting `die()` function for use in custom commands
- `prepend` and `replace` actions keep prepended date, `append` considers sentence delimiters
- Tests: several regression tests added
## [2.6.0] - 2010-05-11
### Added
- Added a case for the fixed replace command.
### Changed
- Changed odd tabs to spaces.
- Faster help/usage document outputs.
- Consolidated `TODOTXT_VERBOSE` tests.
- Refactored various add functionality to one function.
- Updated `_list()` output to match updated `addto`.
### Fixed
- Quoting regexp to parse properly.
- Fixed erroneous hide/show comments.
- Correctly fixed regexp quoting issue for bash v3.1.x and v3.2.x.
- Old versions of bash do not have `=~`
- Fix line endings.
- Fixed bug for replace command.
## [2.5.0] - 2010-05-05
### Added
- Support use of `$HOME/.todo/` for all todo.sh configuration
- Added new multiple do capability to help message
- Added option to disable final filter
- Added a new variable `$TODO_FULL_SH`
- Added new action `addm`
- Added support PAGER pipe for help output
- Added some additional mappings, plus a project context
### Changed
- Added 'silent' to a bunch of calls
### Fixed
- Fixing prepend and priority issue.
- Replace with `priority` set
- Multiple `do` items
- `prepend` not correct on prioritized tasks
- Invalid date range. Changed regex `[ -~]` to `[ ~-]`.
- `do`: no safeguard to `do` twice. Tests item is not marked done before attempting to mark item as "done".
- Fixed `add` does not escape line breaks
- `append` and `replace` unexpected behavior if there's an `&` in task (even in quotes)
- Tasks whose `ID` begins with `0` ought to be ignored.
- Fixed auto-complete function name for contexts
## [2.4.0] - 2009-05-11
### Added
- Added support for `TODOTXT_FINAL_FILTER` to provide a final custom list filter.
- Added support for custom sorting (can set in `todo.cfg`)
- Added parameterize for `.todo.actions.d` directory
### Removed
- Removed annoying trailing space on `pri` tasks
- Don't set colors in default `todo.cfg`.
- Don't set sort command in default `todo.cfg`.
### Fixed
- `listcon` and `listproj` now work correctly on Mac OS X 10.5
- `pri` accepted priorities of more than a single letter
- Support commands combination for `TODOTXT_SORT_COMMAND`; e.g. piped commands can be used: `export TODOTXT_SORT_COMMAND=" env LC_COLLATE=C sort -f -k2 - | grep -m 10 ."`
- Replace now echoes old item AND new item, like it used to.
- `depri` no longer wipes out tasks with more than just the priority in parentheses
- Now throws an error if you try to prioritize with more than one letter, ie, `todo.sh pri AA` doesn't work any more.
## [2.3.0] - 2009-04-02
### Added
- Added hide priority, context, and projects options now enabled `-P`, `-@` and `-+`
- Enabled recursive call of todo.sh from add-ons
- Exported variables for use in add-ons
- Added `-vv` option for debugging output
- Added short usage statement (that fits on one screen) with `-h`
- Added Makefile dist infrastructure for versioned releases in Downloads area on GitHub
### Changed
- Separated `_list` function for reuse by various versions of list command to reduce duplicate code
- Set `ls` as the default action
## [2.2.0] - 2009-03-??
### Fixed
- For awhile here during the GitHub transition, we stripped the version number from todo.sh and updated it kind of willy-nilly, so we're back-versioning all unversioned copies v 2.2.
## [2.1.0] - 2009-02-23
### Added
- Added "pluggability" with `~/.todo.actions.d/` support (via [Tammy and Ed](http://tech.groups.yahoo.com/group/todotxt/message/1739))
- Added `-t` param, off by default. When specified, it automatically prepends the current date to new todo's on add
- Searches for more Unix-y `~/.todo.cfg` if `~/todo.cfg` doesn't exist (via [Ed](http://tech.groups.yahoo.com/group/todotxt/message/1767))
### Fixed
- Corrected "ambiguous redirect" bug with done file (via [Jeff](http://tech.groups.yahoo.com/group/todotxt/message/1764))
- Corrected usage and help message with new params
- Corrected config file miscomment about colors
## [2.0.1] - 2009-02-17
### Fixed
- Restored `-d` parameter functionality broken in 2.0 (d'oh, thanks Jason, you made the changelog! )
## [2.0.0] - 2009-02-17
### Added
- Added `addto [DEST] "Text to add"` will append text to any file in the todo directory, like `ideas.txt` or `maybelater.txt`.
- Added `mv # [DEST]` will move a task from `todo.txt` to another file `[DEST]` in the todo directory, like if you decide your `"Learn French"` task should go into your `maybelater.txt` file.
- `depri #` removes priority from a task.
- `rm # [TERM]` or `del # [TERM]` will delete just the `[TERM]` from the task on line # in todo.txt.
- `listfile [SRC] [TERM]` or `lf [SRC] [TERM]` will list the contents of any text file in the todo directory, and filter by keyword `[TERM]`.
- `listcon` (`lsc`) and `listproj` (`lsprj`) lists contexts and projects, respectively, that appear in todo.txt. (Requires `gawk`)
- On task deletion, line number preservation is on by default (known issue, leaves blank lines). Optional, can be turned off with `-n` option.
- Auto-archive on task completion is now on by default; can be turned off with `-a` parameter.
### Changed
- Separated config file into a non hidden dot file.
### Fixed
- Better error handling throughout for all commands.
- Archive now defrags the file (removes blank lines; see line preservation option.)
- Using `/bin/bash` instead of `/bin/sh`
## [1.7.3] - 2006-07-29
### Added
- Added short action aliases `add/a`, `list/ls`, `listpri/lsp`, `listall/lsa`, `prepend/prep`, `append/app`, `del/rm`
## [1.7.2] - 2006-07-28
### Added
- `listpri` automatically capitalizes lowercase priorities
- `listpri` now displays friendly error message, and the # of tasks returned in verbose mode
### Changed
- `do` action removes priority from task automatically
Update:
### Fixed
- Actions are now case-insensitive (ie, `todo.sh Add` will work)
## [1.7.1] - 2006-07-21
### Changed
- I'm a big dummy and didn't keep track of what I fixed here. Sorry!
## [1.7.0] - 2006-07-19
### Added
- Interactive `add`, `append`, `prepend`, and `replace` (tx, Ben!)
- Action `listall` displays tasks from both todo.txt and done.txt
- Option `-f` forces delete action and disables interactive input (for todobot.pl)
- Option `-h` displays full help message.
### Deprecated
- Option `-q` deprecated; Use `-v` to turn on verbose mode
### Changed
- A very short version of usage message displays by default instead of the long version.
- Comment in info about `.todo` file being required
### Fixed
- No colors display for done tasks (tx, Tanja!)
- Sort is now case-insensitive (tx, Lonnie!)
## [1.6.3] - 2006-07-06
### Added
- Line numbers now padded, up to 100 characters. (tx, Tanja!)
## [1.6.2] - 2006-07-05
### Fixed
- Windows config files with spaces now work (tx Ron)
## [1.6.1] - 2006-07-05
### Changed
- The default location of your `.todo` file is now `$HOME/.todo`
### Fixed
- No colors mode (`-p`) now works as expected
## [1.6.0] - 2006-07-04
### Added
- Action `prepend` adds text to an item at the beginning of the line.
- Configuration file is now separated from script into `.todo` file
- Specify a config file other than `.todo` using the `-d` option
- Option `-q` quiets todo.sh's chattiness.
- Option `-V` shows version and license information.
### Changed
- The option to turn off colors is now `-p` (no longer `-nc` as in 1.5.2)
## [1.5.2] - 2006-06-26
### Fixed
- Items that start with `x ` (an x with a space after) are archived now to avoid lines that start with a word like `xander` from being archived. (tx, Tannie!)
- Report now only archives items that start with `x ` as well.
## [1.5.1] - 2006-06-26
### Fixed
- Items with an `x` in them at all were being deleted on archive with 1.5; all fixed now.
## [1.5.0] - 2006-06-24
### Added
- Option to turn off colors (to avoid characters in piped text files or IM bot), ie `todo.sh -nc [COMMAND]`
- A date is added to a completed todo, ie `x 2006-06-24` (tx SETH)
- Action `remdup` removes exact duplicate lines from todo.txt (tx Tannie)
- Action `del` removes any blank lines from todo.txt (tx Tannie)
### Changed
- Using `sed -i` instead of copying tmp file (tx Tannie)
### Fixed
- Colors show in OS/X 10.4 (tx SETH & misha)
## [1.4.0] - 2006-06-17
### Added
- Tasks are color-coded by priority in Cygwin (Thanks, Abraham, Manuel and Luis!)
### Changed
- Switched endless `if-then` to a `case` statement, and tightened up `wc -l` regex. (Thanks, Sash!)
### Fixed
- If you `replace`/`do`/`append` to a non-existent task, your todo.txt is no longer overwritten and the error is handled gracefully. (Thanks, Scott!)
## [1.3.0] - 2006-05-29
### Added
- Displays the number of newly added todo (Thanks, Amy!)
- Confirms whether or not you really want to delete a todo
- Displays success messages and confirmations on `append`, `replace`, `do`, etc.
- Added licensing information in comments. GPL, baby!
### Changed
- Alphabetized command workflow in if/then construction
- Tightened up `sed` commands, removed unnecessary `grep`s and `cat`s (Thanks, Sash!)
- Stripped whitespace around number lines from wc results
### Removed
- Removed filenames from `report.txt` format, for easier graphing or Excel imports.
### Fixed
- Todos are now sorted alphabetically when listed by a term. (ie: `todo list flowers)
## [1.2.0] - 2006-05-15
### Added
- `list` is case insensitive. ie, `todo list Mac` will match lines with "mac" and "Mac"
### Changed
- `todo list` matches multiple [TERM]s. ie, `todo list mac offline` will match all lines that contain the words "mac" and "offline"
- `repri` and `pri` actions combined into `pri` action (Thanks Mike!)
- Quotes no longer required with `add` and `replace` (Thanks Karl!)
- Any priority added to a todo must be uppercase to preserve sort order, enforced now. ie `todo pri 1 a` will return a usage error.
### Fixed
- File "sanity checks" and cleanup function, test script and various fantastic stylistic improvements added. Extra big thanks to Karl!
## [1.1.0] - 2006-05-12
### Added
- Supports file paths with spaces (ie `C:\Documents and Settings\gina\todo.txt`)
## 1.0.0 - 2006-05-11
### Added
- Consolidated into one master script with usage notes and released.
[Unreleased]: https://github.com/todotxt/todo.txt-cli/compare/v2.12.0...HEAD
[2.12.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.11.0...v2.12.0
[2.11.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.10.0...v2.11.0
[2.10.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.9.0...v2.10.0
[2.9.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.8.0...v2.9.0
[2.8.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.7.0...v2.8.0
[2.7.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.6.0...v2.7.0
[2.6.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.5.0...v2.6.0
[2.5.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.4.0...v2.5.0
[2.4.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.3.0...v2.4.0
[2.3.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.2.0...v2.3.0
[2.2.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.1.0...v2.2.0
[2.1.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.0.1...v2.1.0
[2.0.1]: https://github.com/todotxt/todo.txt-cli/compare/v2.0.0...v2.0.1
[2.0.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.3...v2.0.0
[1.7.3]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.2...v1.7.3
[1.7.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.1...v1.7.2
[1.7.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.0...v1.7.1
[1.7.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.3...v1.7.0
[1.6.3]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.2...v1.6.3
[1.6.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.1...v1.6.2
[1.6.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.0...v1.6.1
[1.6.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.2...v1.6.0
[1.5.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.1...v1.5.2
[1.5.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.0...v1.5.1
[1.5.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.4.0...v1.5.0
[1.4.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.3.0...v1.4.0
[1.3.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.0.0...v1.1.0
[#8]: https://github.com/todotxt/todo.txt-cli/pull/8
[#156]: https://github.com/todotxt/todo.txt-cli/pull/156
[#160]: https://github.com/todotxt/todo.txt-cli/pull/160
[#169]: https://github.com/todotxt/todo.txt-cli/pull/169
[#217]: https://github.com/todotxt/todo.txt-cli/pull/217
[#218]: https://github.com/todotxt/todo.txt-cli/pull/218
[#219]: https://github.com/todotxt/todo.txt-cli/pull/219
[#228]: https://github.com/todotxt/todo.txt-cli/pull/228
[#230]: https://github.com/todotxt/todo.txt-cli/pull/230
[#246]: https://github.com/todotxt/todo.txt-cli/pull/246
[#249]: https://github.com/todotxt/todo.txt-cli/pull/249
[#264]: https://github.com/todotxt/todo.txt-cli/pull/264
[#270]: https://github.com/todotxt/todo.txt-cli/pull/270
[#271]: https://github.com/todotxt/todo.txt-cli/pull/271
[#289]: https://github.com/todotxt/todo.txt-cli/pull/289
[#295]: https://github.com/todotxt/todo.txt-cli/pull/295
[#300]: https://github.com/todotxt/todo.txt-cli/pull/300
[#301]: https://github.com/todotxt/todo.txt-cli/pull/301

View File

@@ -8,7 +8,7 @@ LF='
' '
if test -d .git -o -f .git && if test -d .git -o -f .git &&
VN=$(git describe --abbrev=4 HEAD 2>/dev/null) && VN=$(git describe --abbrev=0 --tags 2>/dev/null) &&
case "$VN" in case "$VN" in
*$LF*) (exit 1) ;; *$LF*) (exit 1) ;;
v[0-9]*) v[0-9]*)
@@ -34,5 +34,3 @@ test "$VN" = "$VC" || {
echo >&2 "VERSION=$VN" echo >&2 "VERSION=$VN"
echo "VERSION=$VN" >$VF echo "VERSION=$VN" >$VF
} }

View File

@@ -1,7 +1,7 @@
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
@@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
@@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school, You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary. if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>. <https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>. <https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -2,6 +2,37 @@
# Makefile for todo.txt # Makefile for todo.txt
# #
SHELL = /bin/sh
INSTALL = /usr/bin/install
INSTALL_PROGRAM = $(INSTALL)
INSTALL_DATA = $(INSTALL) -m 644
prefix = /usr/local
# ifdef check allows the user to pass custom dirs
# as per the README
# The directory to install todo.sh in.
ifdef INSTALL_DIR
bindir = $(INSTALL_DIR)
else
bindir = $(prefix)/bin
endif
# The directory to install the config file in.
ifdef CONFIG_DIR
sysconfdir = $(CONFIG_DIR)
else
sysconfdir = $(prefix)/etc
endif
ifdef BASH_COMPLETION
datarootdir = $(BASH_COMPLETION)
else
datarootdir = $(prefix)/share/bash_completion.d
endif
# Dynamically detect/generate version file as necessary # Dynamically detect/generate version file as necessary
# This file will define a variable called VERSION. # This file will define a variable called VERSION.
.PHONY: .FORCE-VERSION-FILE .PHONY: .FORCE-VERSION-FILE
@@ -20,15 +51,35 @@ dist: $(DISTFILES) todo.sh
mkdir -p $(DISTNAME) mkdir -p $(DISTNAME)
cp -f $(DISTFILES) $(DISTNAME)/ cp -f $(DISTFILES) $(DISTNAME)/
sed -e 's/@DEV_VERSION@/'$(VERSION)'/' todo.sh > $(DISTNAME)/todo.sh sed -e 's/@DEV_VERSION@/'$(VERSION)'/' todo.sh > $(DISTNAME)/todo.sh
tar cf $(DISTNAME).tar $(DISTNAME)/ chmod +x $(DISTNAME)/todo.sh
tar cf $(DISTNAME).tar $(DISTNAME)
gzip -f -9 $(DISTNAME).tar gzip -f -9 $(DISTNAME).tar
zip -9r $(DISTNAME).zip $(DISTNAME)/ zip -r -9 $(DISTNAME).zip $(DISTNAME)
rm -r $(DISTNAME) rm -r $(DISTNAME)
.PHONY: clean .PHONY: clean
clean: clean: test-pre-clean
rm -f $(DISTNAME).tar.gz $(DISTNAME).zip rm -f $(DISTNAME).tar.gz $(DISTNAME).zip
rm VERSION-FILE
install: installdirs
$(INSTALL_PROGRAM) todo.sh $(DESTDIR)$(bindir)/todo.sh
$(INSTALL_DATA) todo_completion $(DESTDIR)$(datarootdir)/todo
[ -e $(DESTDIR)$(sysconfdir)/todo/config ] || \
sed "s/^\(export[ \t]*TODO_DIR=\).*/\1~\/.todo/" todo.cfg > $(DESTDIR)$(sysconfdir)/todo/config
uninstall:
rm -f $(DESTDIR)$(bindir)/todo.sh
rm -f $(DESTDIR)$(datarootdir)/todo
rm -f $(DESTDIR)$(sysconfdir)/todo/config
rmdir $(DESTDIR)$(datarootdir)
rmdir $(DESTDIR)$(sysconfdir)/todo
installdirs:
mkdir -p $(DESTDIR)$(bindir) \
$(DESTDIR)$(sysconfdir)/todo \
$(DESTDIR)$(datarootdir)
# #
# Testing # Testing
@@ -42,7 +93,7 @@ test-pre-clean:
aggregate-results: $(TESTS) aggregate-results: $(TESTS)
$(TESTS): test-pre-clean $(TESTS): test-pre-clean
-cd tests && ./$(notdir $@) $(TEST_OPTIONS) cd tests && ./$(notdir $@) $(TEST_OPTIONS)
test: aggregate-results test: aggregate-results
tests/aggregate-results.sh tests/test-results/t*-* tests/aggregate-results.sh tests/test-results/t*-*
@@ -50,3 +101,4 @@ test: aggregate-results
# Force tests to get run every time # Force tests to get run every time
.PHONY: test test-pre-clean aggregate-results $(TESTS) .PHONY: test test-pre-clean aggregate-results $(TESTS)

107
README.md Normal file
View File

@@ -0,0 +1,107 @@
# [![todo.txt-cli](http://todotxt.org/images/todotxt_logo_2012.png)][website]
> A simple and extensible shell script for managing your todo.txt file.
![CI](https://github.com/todotxt/todo.txt-cli/workflows/CI/badge.svg)
[![GitHub issues](https://img.shields.io/github/issues/todotxt/todo.txt-cli.svg)](https://github.com/todotxt/todo.txt-cli/issues)
[![GitHub forks](https://img.shields.io/github/forks/todotxt/todo.txt-cli.svg)](https://github.com/todotxt/todo.txt-cli/network)
[![GitHub stars](https://img.shields.io/github/stars/todotxt/todo.txt-cli.svg)](https://github.com/todotxt/todo.txt-cli/stargazers)
[![GitHub license](https://img.shields.io/github/license/todotxt/todo.txt-cli.svg)](https://raw.githubusercontent.com/todotxt/todo.txt-cli/master/LICENSE)
[![Gitter](https://badges.gitter.im/join_chat.svg)](https://gitter.im/todotxt/todo.txt-cli)
![gif](./.github/example.gif)
*Read our [contributing guide][CONTRIBUTING] if you're looking to contribute (issues/PRs/etc).*
## Installation
### Download
Download the latest stable [release][release] for use on your desktop or server.
### OS X / macOS
```shell
brew install todo-txt
# For macOS on x86 CPU
cp -n /usr/local/opt/todo-txt/todo.cfg ~/.todo.cfg
# For macOS on arm CPU
cp -n /opt/homebrew/opt/todo-txt/todo.cfg ~/.todo.cfg
```
**Note**: The `-n` flag for `cp` makes sure you do not overwrite an existing file.
### Linux
#### From command line
```shell
make
make install
make test
```
*NOTE:* Makefile defaults to several default paths for installed files. Adjust to your system:
- `INSTALL_DIR`: PATH for executables (default /usr/local/bin)
- `CONFIG_DIR`: PATH for todo.txt config
- `BASH_COMPLETION`: PATH for autocompletion scripts (default to /etc/bash_completion.d)
```shell
make install CONFIG_DIR=/etc INSTALL_DIR=/usr/bin BASH_COMPLETION=/usr/share/bash-completion/completions
```
#### Arch Linux (AUR)
https://aur.archlinux.org/packages/todotxt/
## Usage
```shell
todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
```
For example, to add a todo item, you can do:
```shell
todo.sh add "THING I NEED TO DO +project @context"
```
Read about all the possible commands in the [USAGE][USAGE] file.
## Release History
See [CHANGELOG.md][CHANGELOG]
## Support
- [Github Discussions](https://github.com/todotxt/todo.txt-cli/discussions)
- [Stack Overflow](https://stackoverflow.com/questions/tagged/todotxt)
- [Twitter](https://twitter.com/todotxt)
## Code of Conduct
[Contributor Code of Conduct][CODE_OF_CONDUCT]. By participating in this project you agree to abide by its terms.
## Contributing
We welcome all contributions. First read our [Contributor Code of Conduct][CODE_OF_CONDUCT] and then get started [contributing][CONTRIBUTING].
## License
GNU General Public License v3.0 © [todo.txt org][github]
[release]: https://github.com/todotxt/todo.txt-cli/releases
[website]: http://todotxt.org/
[github]: https://github.com/todotxt
[USAGE]: ./USAGE.md
[CHANGELOG]: ./CHANGELOG.md
[CODE_OF_CONDUCT]: .github/CODE_OF_CONDUCT.md
[CONTRIBUTING]: .github/CONTRIBUTING.md

View File

@@ -1,27 +0,0 @@
h1. TODO.TXT Command Line Interface
A simple and extensible shell script for managing your todo.txt file.
h2. "Downloads":http://github.com/ginatrapani/todo.txt-cli/downloads
"Download the latest stable release":http://github.com/ginatrapani/todo.txt-cli/downloads for use on your desktop or server.
h2. "Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli
* "User Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli/user-documentation - Find out "how to install and use Todo.txt CLI":http://wiki.github.com/ginatrapani/todo.txt-cli/user-documentation, and get tips and tricks.
* "Developer Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli/developer-documentation - "Contribute to Todo.txt CLI":http://wiki.github.com/ginatrapani/todo.txt-cli/developer-documentation and build your own custom add-ons.
h2. "Mailing List":http://groups.yahoo.com/group/todotxt/
Get support from users and developers on the "mailing list":http://groups.yahoo.com/group/todotxt/.
h2. Quick Links
* Original anemic release by "Gina Trapani":http://ginatrapani.org on 5/11/2006.
* Raised to great heights by "brainy and dedicated volunteers":http://github.com/ginatrapani/todo.txt-cli/network.
* Licensed under the "GPL":http://www.gnu.org/copyleft/gpl.html
* "Add-on Directory":https://github.com/ginatrapani/todo.txt-cli/wiki/Todo.sh-Add-on-Directory
https://github.com/ginatrapani/todo.txt-cli/wiki/Creating-and-Installing-Add-ons
* "Changelog":http://wiki.github.com/ginatrapani/todo.txt-cli/todosh-changelog
* "Known Bugs":http://github.com/ginatrapani/todo.txt-cli/issues

266
USAGE.md Normal file
View File

@@ -0,0 +1,266 @@
# [todo.txt-cli](http://todotxt.org) Usage
```shell
todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
```
## Actions
### `add`
Adds THING I NEED TO DO to your todo.txt file on its own line.
Project and context notation optional.
Quotes optional.
```shell
todo.sh add "THING I NEED TO DO +project @context"
todo.sh a "THING I NEED TO DO +project @context"
```
### `addm`
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.
```shell
todo.sh addm "FIRST THING I NEED TO DO +project1 @context
SECOND THING I NEED TO DO +project2 @context"
```
### `addto`
Adds a line of text to any file located in the todo.txt directory.
For example, `addto inbox.txt "decide about vacation"`
```shell
todo.sh addto DEST "TEXT TO ADD"
```
### `append`
Adds TEXT TO APPEND to the end of the task on line ITEM#.
Quotes optional.
```shell
todo.sh append ITEM# "TEXT TO APPEND"
todo.sh app ITEM# "TEXT TO APPEND"
```
### `archive`
Moves all done tasks from todo.txt to done.txt and removes blank lines.
```shell
todo.sh archive
```
### `command`
Runs the remaining arguments using only todo.sh builtins.
Will not call any `.todo.actions.d` scripts.
```shell
todo.sh command [ACTIONS]
```
### `deduplicate`
Removes duplicate lines from todo.txt.
```shell
todo.sh deduplicate
```
### `del`
Deletes the task on line ITEM# in todo.txt. If TERM specified, deletes only TERM from the task.
```shell
todo.sh del ITEM# [TERM]
todo.sh rm ITEM# [TERM]
```
### `depri`
Deprioritizes (removes the priority) from the task(s) on line ITEM# in todo.txt.
```shell
todo.sh depri ITEM#[, ITEM#, ITEM#, ...]
todo.sh dp ITEM#[, ITEM#, ITEM#, ...]
```
### `do`
Marks task(s) on line ITEM# as done in todo.txt.
```shell
todo.sh do ITEM#[, ITEM#, ITEM#, ...]
```
### `help`
Display help about usage, options, built-in and add-on actions, or just the usage help for the passed ACTION(s).
```shell
todo.sh help [ACTION...]
```
### `list`
Displays all tasks that contain TERM(s) sorted by priority with line numbers. Each task must match all TERM(s) (logical AND); to display tasks that contain any TERM (logical OR), use `"TERM1\|TERM2\|..."` (with quotes), or `TERM1\\|TERM2` (unquoted). Hides all tasks that contain TERM(s) preceded by a minus sign (i.e. `-TERM`).
If no TERM specified, lists entire todo.txt.
```shell
todo.sh list [TERM...]
todo.sh ls [TERM...]
```
### `listall`
Displays all the lines in todo.txt AND done.txt that contain TERM(s) sorted by priority with line numbers. Hides all tasks that contain TERM(s) preceded by a minus sign (i.e. `-TERM`).
If no TERM specified, lists entire todo.txt AND done.txt concatenated and sorted.
```shell
todo.sh listall [TERM...]
todo.sh lsa [TERM...]
```
### `listaddons`
Lists all added and overridden actions in the actions directory.
```shell
todo.sh listaddons
```
### `listcon`
Lists all the task contexts that start with the @ sign in todo.txt.
If TERM specified, considers only tasks that contain TERM(s).
```shell
todo.sh listcon [TERM...]
todo.sh lsc [TERM...]
```
### `listfile`
Displays all the lines in SRC file located in the todo.txt directory, sorted by priority with line numbers. If TERM specified, lists all lines that contain TERM(s) in SRC file. Hides all tasks that contain TERM(s) preceded by a minus sign (i.e. `-TERM`).
Without any arguments, the names of all text files in the todo.txt directory are listed.
```shell
todo.sh listfile [SRC [TERM...]]
todo.sh lf [SRC [TERM...]]
```
### `listpri`
Displays all tasks prioritized PRIORITIES. PRIORITIES can be a single one (A) or a range (A-C). If no PRIORITIES specified, lists all prioritized tasks. If TERM specified, lists only prioritized tasks that contain TERM(s). Hides all tasks that contain TERM(s) preceded by a minus sign (i.e. `-TERM`).
```shell
todo.sh listpri [PRIORITIES] [TERM...]
todo.sh lsp [PRIORITIES] [TERM...]
```
### `listproj`
Lists all the projects (terms that start with a `+` sign) in todo.txt. If TERM specified, considers only tasks that contain TERM(s).
```shell
todo.sh listproj [TERM...]
todo.sh lsprj [TERM...]
```
### `move`
Moves a line from source text file (SRC) to destination text file (DEST). 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.
```shell
todo.sh move ITEM# DEST [SRC]
todo.sh mv ITEM# DEST [SRC]
```
### `prepend`
Adds TEXT TO PREPEND to the beginning of the task on line ITEM#. Quotes optional.
```shell
todo.sh prepend ITEM# "TEXT TO PREPEND"
todo.sh prep ITEM# "TEXT TO PREPEND"
```
### `pri`
Adds PRIORITY to task on line ITEM#. If the task is already prioritized, replaces current priority with new PRIORITY. PRIORITY must be a letter between A and Z.
```shell
todo.sh pri ITEM# PRIORITY
todo.sh p ITEM# PRIORITY
```
### `replace`
Replaces task on line ITEM# with UPDATED TODO.
```shell
todo.sh replace ITEM# "UPDATED TODO"
```
### `report`
Adds the number of open tasks and done tasks to report.txt.
```shell
todo.sh report
```
### `shorthelp`
List the one-line usage of all built-in and add-on actions.
```shell
todo.sh shorthelp
```
## Options
### `-@`
Hide context names in list output. Use twice to show context names (default).
### `-+`
Hide project names in list output. Use twice to show project names (default).
### `-c`
Color mode
### `-d CONFIG_FILE`
Use a configuration file other than one of the defaults (e.g. `~/.todo/config`)
### `-f`
Forces actions without confirmation or interactive input.
### `-h`
Display a short help message; same as action "shorthelp"
### `-p`
Plain mode turns off colors
### `-P`
Hide priority labels in list output. Use twice to show priority labels (default).
### `-a`
Don't auto-archive tasks automatically on completion
### `-A`
Auto-archive tasks automatically on completion
### `-n`
Don't preserve line numbers; automatically remove blank lines on task deletion.
### `-N`
Preserve line numbers
### `-t`
Prepend the current date to a task automatically when it's added.
### `-T`
Do not prepend the current date to a task automatically when it's added.
### `-v`
Verbose mode turns on confirmation messages
### `-vv`
Extra verbose mode prints some debugging information and additional help text
### `-V`
Displays version, license and credits
### `-x`
Disables `TODOTXT_FINAL_FILTER`

View File

@@ -42,27 +42,27 @@ You can pass --verbose (or -v), --debug (or -d), and --immediate
appropriately before running "make". appropriately before running "make".
--verbose:: --verbose::
This makes the test more verbose. Specifically, the This makes the test more verbose. Specifically, the
command being run and their output if any are also command being run and their output if any are also
output. output.
--debug:: --debug::
This may help the person who is developing a new test. This may help the person who is developing a new test.
It causes the command defined with test_debug to run. It causes the command defined with test_debug to run.
--immediate:: --immediate::
This causes the test to immediately exit upon the first This causes the test to immediately exit upon the first
failed test. failed test.
--long-tests:: --long-tests::
This causes additional long-running tests to be run (where This causes additional long-running tests to be run (where
available), for more exhaustive testing. available), for more exhaustive testing.
--tee:: --tee::
In addition to printing the test output to the terminal, In addition to printing the test output to the terminal,
write it to files named 't/test-results/$TEST_NAME.out'. write it to files named 't/test-results/$TEST_NAME.out'.
As the names depend on the tests' file names, it is safe to As the names depend on the tests' file names, it is safe to
run the tests with this option in parallel. run the tests with this option in parallel.
Skipping Tests Skipping Tests
-------------- --------------
@@ -97,15 +97,15 @@ Naming Tests
The test files are named as: The test files are named as:
tNNNN-commandname-details.sh tNNNN-commandname-details.sh
where N is a decimal digit. where N is a decimal digit.
First digit tells the family: 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.
@@ -128,15 +128,15 @@ The test script is written as a shell script. It should start
with the standard "#!/bin/bash" 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/bash #!/bin/bash
# #
# Copyright (c) 2005 Junio C Hamano # Copyright (c) 2005 Junio C Hamano
# #
test_description='xxx test (option --frotz) test_description='xxx test (option --frotz)
This test registers the following structure in the cache This test registers the following structure in the cache
and tries to run git-ls-files with option --frotz.' and tries to run git-ls-files with option --frotz.'
Source 'test-lib.sh' Source 'test-lib.sh'
@@ -145,7 +145,7 @@ Source 'test-lib.sh'
After assigning test_description, the test script should source After assigning test_description, the test script should source
test-lib.sh like this: test-lib.sh like this:
. ./test-lib.sh . ./test-lib.sh
This test harness library does the following things: This test harness library does the following things:
@@ -219,9 +219,9 @@ library for your script to use.
Example: Example:
test_expect_success \ test_expect_success \
'git-write-tree should be able to write an empty tree.' \ 'git-write-tree should be able to write an empty tree.' \
'tree=$(git-write-tree)' 'tree=$(git-write-tree)'
- test_expect_code <code> <message> <script> - test_expect_code <code> <message> <script>
@@ -266,7 +266,7 @@ and the dates and timestamps will be artificially fixed.
Then the session can be used to make a unit test thanks to Then the session can be used to make a unit test thanks to
test_todo_session, see the existing tests as examples. test_todo_session, see the existing tests as examples.
Be careful to replace all occurences of the full path to the test Be careful to replace all occurrences of the full path to the test
directory by $HOME as testshell.sh will explain you when you execute it directory by $HOME as testshell.sh will explain you when you execute it
otherwise the tests will work properly only on your own computer. otherwise the tests will work properly only on your own computer.

View File

@@ -16,3 +16,21 @@ echo "custom action $1"
EOF EOF
chmod +x ".todo.actions.d/$1" chmod +x ".todo.actions.d/$1"
} }
make_action_in_folder()
{
unset TODO_ACTIONS_DIR
[ -d .todo.actions.d ] || mkdir .todo.actions.d
mkdir ".todo.actions.d/$1"
cat > ".todo.actions.d/$1/$1" <<EOF
#!/bin/bash
[ "\$1" = "usage" ] && {
echo " $1 ITEM#[, ITEM#, ...] [TERM...]"
echo " This custom action does $1."
echo ""
exit
}
echo "custom action $1 in folder $1"
EOF
chmod +x ".todo.actions.d/$1/$1"
}

View File

@@ -15,7 +15,7 @@ case "$1" in
esac esac
if test -n "$color"; then if test -n "$color"; then
say_color () { say_color() {
( (
export TERM export TERM
case "$1" in case "$1" in
@@ -67,15 +67,15 @@ do
'') '')
continue ;; continue ;;
fixed) fixed)
fixed=$(($fixed + $value)) ;; fixed=$((fixed + $value)) ;;
success) success)
success=$(($success + $value)) ;; success=$((success + $value)) ;;
failed) failed)
failed=$(($failed + $value)) ;; failed=$((failed + $value)) ;;
broken) broken)
broken=$(($broken + $value)) ;; broken=$((broken + $value)) ;;
total) total)
total=$(($total + $value)) ;; total=$((total + $value)) ;;
esac esac
done <"$file" done <"$file"
done done

View File

@@ -8,6 +8,10 @@ to find it somewhere else.
' '
. ./test-lib.sh . ./test-lib.sh
# Override default global config file
export TODOTXT_GLOBAL_CFG_FILE=global.cfg
# 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/config" > expect echo "Fatal Error: Cannot read configuration file $HOME/.todo/config" > expect
@@ -16,12 +20,12 @@ test_expect_success 'no config file' '
' '
# All the below tests will output the usage message. # All the below tests will output the usage message.
cat > expect << EOF cat > expect <<EOF
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description] Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Try 'todo.sh -h' for more information. Try 'todo.sh -h' for more information.
EOF EOF
cat > test.cfg << EOF cat > test.cfg <<EOF
export TODO_DIR=. export TODO_DIR=.
export TODO_FILE="\$TODO_DIR/todo.txt" export TODO_FILE="\$TODO_DIR/todo.txt"
export DONE_FILE="\$TODO_DIR/done.txt" export DONE_FILE="\$TODO_DIR/done.txt"
@@ -55,6 +59,14 @@ test_expect_success 'config file (default location 3)' '
rm -f .todo.cfg rm -f .todo.cfg
' '
rm -f used_config
test_expect_success 'config file (global config file)' '
cp test.cfg "$TODOTXT_GLOBAL_CFG_FILE"
todo.sh > output;
test_cmp expect output && test -f used_config &&
rm -f "$TODOTXT_GLOBAL_CFG_FILE"
'
rm -f used_config rm -f used_config
test_expect_success 'config file (command line)' ' test_expect_success 'config file (command line)' '
todo.sh -d test.cfg > output; todo.sh -d test.cfg > output;
@@ -67,4 +79,18 @@ test_expect_success 'config file (env variable)' '
test_cmp expect output && test -f used_config test_cmp expect output && test -f used_config
' '
cat > minimal.cfg <<EOF
export TODO_DIR=.
touch used_config
EOF
rm -f used_config
test_expect_success 'config file (minimal)' '
mkdir .todo
cp minimal.cfg .todo/config
todo.sh > output;
test_cmp expect output && test -f used_config &&
rm -rf .todo
'
test_done test_done

View File

@@ -59,7 +59,6 @@ test_expect_success 'null list filter' '
todo.sh listall filter > output && test_cmp expect output todo.sh listall filter > output && test_cmp expect output
' '
# #
# lsc|listcon # lsc|listcon
# #

View File

@@ -7,11 +7,11 @@ This test just makes sure that todo.sh can locate custom actions.
. ./test-lib.sh . ./test-lib.sh
# All the below tests will output the custom action message # All the below tests will output the custom action message
cat > expect << EOF cat > expect <<EOF
TODO: foo TODO: foo
EOF EOF
cat > foo << EOF cat > foo <<EOF
echo "TODO: foo" echo "TODO: foo"
EOF EOF
chmod +x foo chmod +x foo

View File

@@ -9,8 +9,15 @@ On failure, it will print each offending line number and line.
' '
. ./test-lib.sh . ./test-lib.sh
backtick_check()
{
sed -n -e 's/\(^\|[ \t]\)#.*//' -e '/`/{' -e '=;p' -e '}' "$@"
}
test_todo_session 'no old-style backtick command substitution' <<EOF test_todo_session 'no old-style backtick command substitution' <<EOF
>>> sed -n -e 's/\(^\|[ \t]\)#.*//' -e '/\`/{' -e '=;p' -e '}' "$(which todo.sh)" >>> backtick_check bin/todo.sh
>>> backtick_check ../../todo.cfg
EOF EOF
test_done test_done

View File

@@ -110,4 +110,17 @@ TODO: 1 added.
-- --
TODO: 1 of 1 tasks shown TODO: 1 of 1 tasks shown
EOF EOF
echo -n 'this is a first task without newline' > todo.txt
test_todo_session 'add to file without EOL' <<EOF
>>> todo.sh add "a second task"
2 a second task
TODO: 2 added.
>>> todo.sh list
2 a second task
1 this is a first task without newline
--
TODO: 2 of 2 tasks shown
EOF

View File

@@ -37,6 +37,22 @@ TODO: 2 of 2 tasks shown
TODO: 2 deleted. TODO: 2 deleted.
EOF EOF
test_todo_session 'cmd line first day with lowercase priority' <<EOF
>>> todo.sh -pt add '(b) notice the daisies'
2 (B) 2009-02-13 notice the daisies
TODO: 2 added.
>>> todo.sh -p list
2 (B) 2009-02-13 notice the daisies
1 2009-02-13 notice the daisies
--
TODO: 2 of 2 tasks shown
>>> todo.sh -npf del 2
2 (B) 2009-02-13 notice the daisies
TODO: 2 deleted.
EOF
test_tick test_tick
test_todo_session 'cmd line second day' <<EOF test_todo_session 'cmd line second day' <<EOF

33
tests/t1040-add-priority.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
test_description='test the priority on add feature'
. ./test-lib.sh
## Normal use case
echo "export TODOTXT_PRIORITY_ON_ADD=A" >> todo.cfg
test_todo_session 'config file priority' <<EOF
>>> todo.sh add take out the trash
1 (A) take out the trash
TODO: 1 added.
>>> todo.sh -p list
1 (A) take out the trash
--
TODO: 1 of 1 tasks shown
EOF
## Wrong value in config var
echo "export TODOTXT_PRIORITY_ON_ADD=1" >> todo.cfg
test_todo_session 'config file wrong priority' <<EOF
>>> todo.sh add fail to take out the trash
=== 1
TODOTXT_PRIORITY_ON_ADD should be a capital letter from A to Z (it is now "1").
>>> todo.sh -p list
=== 1
TODOTXT_PRIORITY_ON_ADD should be a capital letter from A to Z (it is now "1").
EOF
test_done

View File

@@ -45,7 +45,7 @@ grow some corn
thrash some hay thrash some hay
chase the chickens chase the chickens
EOF 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
TODO: No task 10. TODO: No task 10.
@@ -82,7 +82,7 @@ TODO: Replaced task with:
EOF EOF
echo 'jump on hay' > todo.txt echo 'jump on hay' > todo.txt
test_todo_session 'replace with &' << EOF test_todo_session 'replace with &' <<EOF
>>> todo.sh replace 1 "thrash the hay & thrash the wheat" >>> todo.sh replace 1 "thrash the hay & thrash the wheat"
1 jump on hay 1 jump on hay
TODO: Replaced task with: TODO: Replaced task with:
@@ -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

@@ -6,7 +6,7 @@ test_description='basic priority functionality
test_todo_session 'priority usage' <<EOF test_todo_session 'priority usage' <<EOF
>>> todo.sh pri B B >>> todo.sh pri B B
usage: todo.sh pri ITEM# PRIORITY usage: todo.sh pri ITEM# PRIORITY[, ITEM# PRIORITY, ...]
note: PRIORITY must be anywhere from A to Z. note: PRIORITY must be anywhere from A to Z.
=== 1 === 1
EOF EOF
@@ -100,4 +100,39 @@ TODO: 2 already prioritized (A).
-- --
TODO: 3 of 3 tasks shown TODO: 3 of 3 tasks shown
EOF EOF
cat > todo.txt <<EOF
smell the uppercase Roses +flowers @outside
notice the sunflowers
stop
EOF
test_todo_session 'multiple priority' <<EOF
>>> todo.sh pri 1 A 2 B
1 (A) smell the uppercase Roses +flowers @outside
TODO: 1 prioritized (A).
2 (B) notice the sunflowers
TODO: 2 prioritized (B).
EOF
test_todo_session 'multiple reprioritize' <<EOF
>>> todo.sh pri 1 Z 2 X
1 (Z) smell the uppercase Roses +flowers @outside
TODO: 1 re-prioritized from (A) to (Z).
2 (X) notice the sunflowers
TODO: 2 re-prioritized from (B) to (X).
EOF
test_todo_session 'multiple prioritize error' <<EOF
>>> todo.sh pri 1 B 4 B
=== 1
1 (B) smell the uppercase Roses +flowers @outside
TODO: 1 re-prioritized from (Z) to (B).
TODO: No task 4.
>>> todo.sh pri 1 C 4 B 3 A
=== 1
1 (C) smell the uppercase Roses +flowers @outside
TODO: 1 re-prioritized from (B) to (C).
TODO: No task 4.
EOF
test_done test_done

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='list functionality test_description='list functionality
@@ -162,7 +161,6 @@ TODO: 1 of 5 tasks shown
TODO: 1 of 5 tasks shown TODO: 1 of 5 tasks shown
EOF EOF
# #
# check the x command line option # check the x command line option
# #

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='listcon functionality test_description='listcon functionality
@@ -55,6 +54,57 @@ test_todo_session 'listcon e-mail address test' <<EOF
@con02 @con02
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 'listcon with project' <<EOF
>>> todo.sh listcon +landscape
@garden
EOF
cat > todo.txt <<EOF
(B) +math (@school or @home) integrate @x and @y
(C) say thanks @GinaTrapani w:@OtherContributors
stop
EOF
test_todo_session 'listcon with default configuration' <<EOF
>>> todo.sh listcon
@GinaTrapani
@home)
@x
@y
EOF
test_todo_session 'listcon limiting to multi-character sequences' <<EOF
>>> TODOTXT_SIGIL_VALID_PATTERN='.\{2,\}' todo.sh listcon
@GinaTrapani
@home)
EOF
test_todo_session 'listcon allowing w: marker before contexts' <<EOF
>>> TODOTXT_SIGIL_BEFORE_PATTERN='\(w:\)\{0,1\}' todo.sh listcon
@GinaTrapani
@OtherContributors
@home)
@x
@y
EOF
test_todo_session 'listcon allowing parentheses around contexts' <<EOF
>>> TODOTXT_SIGIL_BEFORE_PATTERN='(\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN=')\{0,1\}' todo.sh listcon
@GinaTrapani
@home
@school
@x
@y
EOF
test_todo_session 'listcon with all customizations combined' <<EOF
>>> TODOTXT_SIGIL_VALID_PATTERN='.\{2,\}' TODOTXT_SIGIL_BEFORE_PATTERN='\(w:\)\{0,1\}\((\)\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN=')\{0,1\}' todo.sh listcon
@GinaTrapani
@OtherContributors
@home
@school
EOF
cat > todo.txt <<EOF cat > todo.txt <<EOF
@con01 -- Some context 1 task @con01 -- Some context 1 task
EOF EOF

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='listproj functionality test_description='listproj functionality
@@ -75,6 +74,33 @@ test_todo_session 'listproj with context' <<EOF
+sunflowers +sunflowers
EOF EOF
cat > todo.txt <<EOF
(B) give a +1 to this project
(C) notice the sunflowers +sunflowers [+gardening] [+landscape]
stop
EOF
test_todo_session 'listproj with default configuration' <<EOF
>>> todo.sh listproj
+1
+sunflowers
EOF
test_todo_session 'listproj limiting to alphabetic characters' <<EOF
>>> TODOTXT_SIGIL_VALID_PATTERN='[a-zA-Z]\{1,\}' todo.sh listproj
+sunflowers
EOF
test_todo_session 'listproj allowing brackets around projects' <<EOF
>>> TODOTXT_SIGIL_BEFORE_PATTERN='\[\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN='\]\{0,1\}' todo.sh listproj
+1
+gardening
+landscape
+sunflowers
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_CUSTOM=todo-custom.cfg TEST_TODO_CUSTOM=todo-custom.cfg
cat todo.cfg > "$TEST_TODO_CUSTOM" cat todo.cfg > "$TEST_TODO_CUSTOM"
cat >> "$TEST_TODO_CUSTOM" <<'EOF' cat >> "$TEST_TODO_CUSTOM" <<'EOF'
@@ -90,7 +116,6 @@ test_todo_session 'listproj with context special cases' <<EOF
+sunflowers +sunflowers
EOF EOF
cat > todo.txt <<EOF cat > todo.txt <<EOF
+prj01 -- Some project 1 task +prj01 -- Some project 1 task
EOF EOF
@@ -114,4 +139,9 @@ test_todo_session 'listproj from combined open + done tasks' <<'EOF'
+prj01 +prj01
EOF EOF
test_todo_session 'listproj with GREP_OPTIONS disruption' <<'EOF'
>>> GREP_OPTIONS=-n todo.sh listproj
+prj01
EOF
test_done test_done

View File

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

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='list with escape sequences test_description='list with escape sequences

View File

@@ -0,0 +1,90 @@
#!/bin/bash
test_description='highlighting projects and contexts
This test checks the highlighting (with colors) of projects and contexts.
'
. ./test-lib.sh
# Prioritized tasks with projects and contexts
cat > todo.txt <<EOF
(A) prioritized @con01 context
(B) prioritized +prj02 project
(C) prioritized context at EOL @con03
(D) prioritized project at EOL +prj04
+prj05 non-prioritized project at BOL
@con06 non-prioritized context at BOL
multiple @con_ @texts and +pro_ +jects
non-contexts: seti@home @ @* @(foo)
non-projects: lost+found + +! +(bar)
EOF
# config file specifying COLOR_PROJECT and COLOR_CONTEXT
#
TEST_TODO_LABEL_COLORS=todo-colors.cfg
cat todo.cfg > "$TEST_TODO_LABEL_COLORS"
echo "export COLOR_CONTEXT='\\\\033[1m'" >>"$TEST_TODO_LABEL_COLORS"
echo "export COLOR_PROJECT='\\\\033[2m'" >>"$TEST_TODO_LABEL_COLORS"
test_todo_session 'highlighting for contexts and projects' <<'EOF'
>>> todo.sh -d "$TEST_TODO_LABEL_COLORS" ls
1 (A) prioritized @con01 context
2 (B) prioritized +prj02 project
3 (C) prioritized context at EOL @con03
4 (D) prioritized project at EOL +prj04
5 +prj05 non-prioritized project at BOL
6 @con06 non-prioritized context at BOL
7 multiple @con_ @texts and +pro_ +jects
8 non-contexts: seti@home @ @* @(foo)
9 non-projects: lost+found + +! +(bar)
--
TODO: 9 of 9 tasks shown
EOF
test_todo_session 'suppressing highlighting for contexts and projects' <<'EOF'
>>> todo.sh -p -d "$TEST_TODO_LABEL_COLORS" ls
1 (A) prioritized @con01 context
2 (B) prioritized +prj02 project
3 (C) prioritized context at EOL @con03
4 (D) prioritized project at EOL +prj04
5 +prj05 non-prioritized project at BOL
6 @con06 non-prioritized context at BOL
7 multiple @con_ @texts and +pro_ +jects
8 non-contexts: seti@home @ @* @(foo)
9 non-projects: lost+found + +! +(bar)
--
TODO: 9 of 9 tasks shown
EOF
test_todo_session 'suppressing display of contexts' <<'EOF'
>>> todo.sh -@ -d "$TEST_TODO_LABEL_COLORS" ls
1 (A) prioritized context
2 (B) prioritized +prj02 project
3 (C) prioritized context at EOL
4 (D) prioritized project at EOL +prj04
5 +prj05 non-prioritized project at BOL
6 non-prioritized context at BOL
7 multiple and +pro_ +jects
8 non-contexts: seti@home @
9 non-projects: lost+found + +! +(bar)
--
TODO: 9 of 9 tasks shown
EOF
test_todo_session 'suppressing display of projects' <<'EOF'
>>> todo.sh -+ -d "$TEST_TODO_LABEL_COLORS" ls
1 (A) prioritized @con01 context
2 (B) prioritized project
3 (C) prioritized context at EOL @con03
4 (D) prioritized project at EOL
5 non-prioritized project at BOL
6 @con06 non-prioritized context at BOL
7 multiple @con_ @texts and
8 non-contexts: seti@home @ @* @(foo)
9 non-projects: lost+found +
--
TODO: 9 of 9 tasks shown
EOF
test_done

View File

@@ -0,0 +1,43 @@
#!/bin/bash
test_description='highlighting date, item numbers and metadata
This test checks the highlighting (with colors) of dates, item numbers and metadata
'
. ./test-lib.sh
# Tasks with dates and metadata
cat > todo.txt <<EOF
2018-11-11 task with date
task with metadata due:2018-12-31
task without date and without metadata
EOF
# config file specifying COLOR_PROJECT and COLOR_CONTEXT
#
TEST_TODO_LABEL_COLORS=todo-colors.cfg
cat todo.cfg > "$TEST_TODO_LABEL_COLORS"
echo "export COLOR_DATE='\\\\033[0;31m'" >>"$TEST_TODO_LABEL_COLORS"
echo "export COLOR_META='\\\\033[0;32m'" >>"$TEST_TODO_LABEL_COLORS"
echo "export COLOR_NUMBER='\\\\033[0;34m'" >>"$TEST_TODO_LABEL_COLORS"
test_todo_session 'highlighting for date, item numbers and metadata' <<'EOF'
>>> todo.sh -d "$TEST_TODO_LABEL_COLORS" ls
1 2018-11-11 task with date
2 task with metadata due:2018-12-31
3 task without date and without metadata
--
TODO: 3 of 3 tasks shown
EOF
test_todo_session 'suppressing highlighting for date, item numbers and metadata' <<'EOF'
>>> todo.sh -p -d "$TEST_TODO_LABEL_COLORS" ls
1 2018-11-11 task with date
2 task with metadata due:2018-12-31
3 task without date and without metadata
--
TODO: 3 of 3 tasks shown
EOF
test_done

View File

@@ -83,4 +83,5 @@ TODO: 3 marked as done.
>>> todo.sh -a do 3 >>> todo.sh -a do 3
TODO: 3 is already marked done. TODO: 3 is already marked done.
EOF EOF
test_done test_done

View File

@@ -17,7 +17,7 @@ test_todo_session 'append usage' <<EOF
usage: todo.sh append ITEM# "TEXT TO APPEND" usage: todo.sh append ITEM# "TEXT TO APPEND"
EOF EOF
test_todo_session 'append error' << EOF test_todo_session 'append error' <<EOF
>>> todo.sh append 10 "hej!" >>> todo.sh append 10 "hej!"
=== 1 === 1
TODO: No task 10. TODO: No task 10.

View File

@@ -4,6 +4,8 @@ test_description='basic del functionality
' '
. ./test-lib.sh . ./test-lib.sh
SPACE=' '
test_todo_session 'del usage' <<EOF test_todo_session 'del usage' <<EOF
>>> todo.sh del B >>> todo.sh del B
usage: todo.sh del ITEM# [TERM] usage: todo.sh del ITEM# [TERM]
@@ -44,6 +46,50 @@ TODO: 1 deleted.
TODO: 2 of 2 tasks shown TODO: 2 of 2 tasks shown
EOF EOF
cat > todo.txt <<EOF
(B) smell the uppercase Roses +flowers @outside
(A) notice the sunflowers
stop
EOF
test_todo_session 'del with confirmation' <<EOF
>>> todo.sh -p list
2 (A) notice the sunflowers
1 (B) smell the uppercase Roses +flowers @outside
3 stop
--
TODO: 3 of 3 tasks shown
>>> printf n | todo.sh del 1
Delete '(B) smell the uppercase Roses +flowers @outside'? (y/n)$SPACE
TODO: No tasks were deleted.
>>> todo.sh -p list
2 (A) notice the sunflowers
1 (B) smell the uppercase Roses +flowers @outside
3 stop
--
TODO: 3 of 3 tasks shown
>>> printf x | todo.sh del 1
Delete '(B) smell the uppercase Roses +flowers @outside'? (y/n)$SPACE
TODO: No tasks were deleted.
>>> echo | todo.sh del 1
Delete '(B) smell the uppercase Roses +flowers @outside'? (y/n)$SPACE
TODO: No tasks were deleted.
>>> printf y | todo.sh del 1
Delete '(B) smell the uppercase Roses +flowers @outside'? (y/n)$SPACE
1 (B) smell the uppercase Roses +flowers @outside
TODO: 1 deleted.
>>> todo.sh -p list
2 (A) notice the sunflowers
3 stop
--
TODO: 2 of 2 tasks shown
EOF
cat > todo.txt <<EOF cat > todo.txt <<EOF
(B) smell the uppercase Roses +flowers @outside (B) smell the uppercase Roses +flowers @outside
(A) notice the sunflowers (A) notice the sunflowers

102
tests/t1850-move.sh Executable file
View File

@@ -0,0 +1,102 @@
#!/bin/bash
test_description='basic move functionality
'
. ./test-lib.sh
SPACE=' '
cat > todo.txt <<EOF
(B) smell the uppercase Roses +flowers @outside
(A) notice the sunflowers
EOF
cat > done.txt <<EOF
x 2009-02-13 make the coffee +wakeup
x 2009-02-13 smell the coffee +wakeup
EOF
test_todo_session 'basic move with implicit source' <<EOF
>>> todo.sh -f move 1 done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
1 (B) smell the uppercase Roses +flowers @outside
TODO: 1 moved from 'todo.txt' to 'done.txt'.
>>> todo.sh -p ls
2 (A) notice the sunflowers
--
TODO: 1 of 1 tasks shown
>>> todo.sh -p listfile done.txt
3 (B) smell the uppercase Roses +flowers @outside
1 x 2009-02-13 make the coffee +wakeup
2 x 2009-02-13 smell the coffee +wakeup
--
DONE: 3 of 3 tasks shown
EOF
cat > todo.txt <<EOF
(B) smell the uppercase Roses +flowers @outside
(A) notice the sunflowers
EOF
cat > done.txt <<EOF
x 2009-02-13 make the coffee +wakeup
x 2009-02-13 smell the coffee +wakeup
EOF
test_todo_session 'basic move with confirmation' <<EOF
>>> printf y | todo.sh move 1 done.txt 2>&1 | sed -e "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g" -e 's#from .\{1,\}/\([^/]\{1,\}\) to .\{1,\}/\([^/]\{1,\}\)?#from \1 to \2?#g'
Move '(B) smell the uppercase Roses +flowers @outside' from todo.txt to done.txt? (y/n)$SPACE
1 (B) smell the uppercase Roses +flowers @outside
TODO: 1 moved from 'todo.txt' to 'done.txt'.
>>> todo.sh -p ls
2 (A) notice the sunflowers
--
TODO: 1 of 1 tasks shown
>>> todo.sh -p listfile done.txt
3 (B) smell the uppercase Roses +flowers @outside
1 x 2009-02-13 make the coffee +wakeup
2 x 2009-02-13 smell the coffee +wakeup
--
DONE: 3 of 3 tasks shown
EOF
test_todo_session 'basic move with passed source' <<EOF
>>> todo.sh -f move 2 todo.txt done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
2 x 2009-02-13 smell the coffee +wakeup
TODO: 2 moved from 'done.txt' to 'todo.txt'.
>>> todo.sh -p ls
2 (A) notice the sunflowers
3 x 2009-02-13 smell the coffee +wakeup
--
TODO: 2 of 2 tasks shown
>>> todo.sh -p listfile done.txt
3 (B) smell the uppercase Roses +flowers @outside
1 x 2009-02-13 make the coffee +wakeup
--
DONE: 2 of 2 tasks shown
EOF
echo -n 'this is a first task without newline' > todo.txt
cat > done.txt <<EOF
x 2009-02-13 make the coffee +wakeup
x 2009-02-13 smell the coffee +wakeup
EOF
test_todo_session 'move to destination without EOL' <<EOF
>>> todo.sh -f move 2 todo.txt done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
2 x 2009-02-13 smell the coffee +wakeup
TODO: 2 moved from 'done.txt' to 'todo.txt'.
>>> todo.sh -p ls
1 this is a first task without newline
2 x 2009-02-13 smell the coffee +wakeup
--
TODO: 2 of 2 tasks shown
>>> todo.sh -p listfile done.txt
1 x 2009-02-13 make the coffee +wakeup
--
DONE: 1 of 1 tasks shown
EOF
test_done

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='help functionality test_description='help functionality

80
tests/t2120-shorthelp.sh Executable file
View File

@@ -0,0 +1,80 @@
#!/bin/bash
test_description='shorthelp functionality
This test covers the output of the -h option and the shorthelp action.
'
. ./actions-test-lib.sh
. ./test-lib.sh
# Note: To avoid having to adapt the test whenever the actions change, only
# check for the section headers.
test_todo_session '-h output' <<EOF
>>> todo.sh -h | sed '/^ [A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Actions:
Actions can be added and overridden using scripts in the actions
See "help" for more details.
EOF
test_todo_session 'shorthelp output' <<EOF
>>> todo.sh shorthelp | sed '/^ [A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Actions:
Actions can be added and overridden using scripts in the actions
See "help" for more details.
EOF
make_action "foo"
test_todo_session 'shorthelp output with custom action' <<EOF
>>> todo.sh -v shorthelp | sed '/^ [A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Actions:
Actions can be added and overridden using scripts in the actions
Add-on Actions:
See "help" for more details.
EOF
# Verify that custom configuration is actually processed (when the -d option
# precedes the -h option) by specifying a different actions directory and moving
# our custom action there. The help output should mention the "Add-On Actions".
set -o pipefail # So that the sed filter doesn't swallow todo.sh's exit code.
mv todo.cfg custom.cfg
mv .todo.actions.d custom.actions
echo 'export TODO_ACTIONS_DIR=$HOME/custom.actions' >> custom.cfg
# Avoid the use of global config file, if it exists
export TODOTXT_GLOBAL_CFG_FILE=global.cfg
test_todo_session '-h and fatal error without config' <<EOF
>>> todo.sh -h | sed '/^ \\{0,2\\}[A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Actions:
Actions can be added and overridden using scripts in the actions
See "help" for more details.
Fatal Error: Cannot read configuration file $HOME/.todo/config
=== 1
EOF
# Config option comes too late; "Add-on Actions" is *not* mentioned here.
test_todo_session '-h and fatal error with trailing custom config' <<EOF
>>> todo.sh -h -d custom.cfg | sed '/^ \\{0,2\\}[A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Actions:
Actions can be added and overridden using scripts in the actions
See "help" for more details.
Fatal Error: Cannot read configuration file $HOME/.todo/config
=== 1
EOF
# Config option processed; "Add-on Actions" is mentioned here.
test_todo_session '-h output with preceding custom config' <<EOF
>>> todo.sh -d custom.cfg -h | sed '/^ \\{0,2\\}[A-Z]/!d'
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Actions:
Actions can be added and overridden using scripts in the actions
Add-on Actions:
See "help" for more details.
EOF
test_done

View File

@@ -0,0 +1,48 @@
#!/bin/bash
test_description='todo.sh configuration with a sole todo.txt data file.
This test covers turning off done.txt and report.txt, and
checks that no such empty files are created.
'
. ./test-lib.sh
cat > test.cfg <<EOF
export TODO_DIR=.
export TODO_FILE="\$TODO_DIR/todo.txt"
export DONE_FILE=/dev/null
export REPORT_FILE=/dev/null
export TMP_FILE="\$TODO_DIR/todo.tmp"
touch used_config
EOF
test_todo_session 'invoke todo.sh' <<EOF
>>> todo.sh -d test.cfg add notice the daisies
1 notice the daisies
TODO: 1 added.
EOF
test_expect_success 'the todo file has been created' '[ -e todo.txt ]'
test_expect_success 'no done file has been created' '[ ! -e done.txt ]'
test_expect_success 'no report file has been created' '[ ! -e report.txt ]'
test_todo_session 'perform archive' <<EOF
>>> todo.sh -A -d test.cfg do 1
1 x 2009-02-13 notice the daisies
TODO: 1 marked as done.
x 2009-02-13 notice the daisies
TODO: ./todo.txt archived.
EOF
test_expect_success 'no done file has been created by the archiving' '[ ! -e done.txt ]'
test_todo_session 'perform report' <<EOF
>>> todo.sh -d test.cfg report
TODO: ./todo.txt archived.
2009-02-13T04:40:00 0 0
TODO: Report file updated.
EOF
test_expect_success 'no report file has been created by the reporting' '[ ! -e report.txt ]'
test_done

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash completion functionality test_description='Bash completion functionality

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash context completion functionality test_description='Bash context completion functionality

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash project completion functionality test_description='Bash project completion functionality

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash task number completion functionality test_description='Bash task number completion functionality
@@ -14,6 +13,7 @@ notice the sunflowers +sunflowers @outside @garden +shared +landscape
(C) 2012-02-28 @outside mow the lawn (C) 2012-02-28 @outside mow the lawn
x 2012-02-21 +herbs @oriental buy spices x 2012-02-21 +herbs @oriental buy spices
x 2012-02-28 2012-02-21 +slack @home watch tv x 2012-02-28 2012-02-21 +slack @home watch tv
2012-02-28 +herbs buy cinnamon @grocer
EOF EOF
test_todo_completion 'simple task' 'todo.sh list 1' '"1 # simple task"' test_todo_completion 'simple task' 'todo.sh list 1' '"1 # simple task"'
test_todo_completion 'remove projects and contents from task' 'todo.sh list 2' '"2 # notice the sunflowers"' test_todo_completion 'remove projects and contents from task' 'todo.sh list 2' '"2 # notice the sunflowers"'
@@ -21,5 +21,6 @@ test_todo_completion 'keep priority' 'todo.sh list 3' '"3 # (B) smell the flower
test_todo_completion 'keep priority and remove timestamp' 'todo.sh list 4' '"4 # (C) mow the lawn"' test_todo_completion 'keep priority and remove timestamp' 'todo.sh list 4' '"4 # (C) mow the lawn"'
test_todo_completion 'keep done marker and remove done date' 'todo.sh list 5' '"5 # x buy spices"' test_todo_completion 'keep done marker and remove done date' 'todo.sh list 5' '"5 # x buy spices"'
test_todo_completion 'keep done marker and remove timestamp and done date' 'todo.sh list 6' '"6 # x watch tv"' test_todo_completion 'keep done marker and remove timestamp and done date' 'todo.sh list 6' '"6 # x watch tv"'
test_todo_completion 'remove add date' 'todo.sh list 7' '"7 # buy cinnamon"'
test_done test_done

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash todo file completion functionality test_description='Bash todo file completion functionality

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash add-on action completion functionality test_description='Bash add-on action completion functionality
@@ -11,6 +10,8 @@ readonly ACTIONS='add a addto addm append app archive command del rm depri dp do
readonly OPTIONS='-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x' readonly OPTIONS='-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x'
readonly ADDONS='bar baz foobar' readonly ADDONS='bar baz foobar'
readonly CONTAINED='xeno zoolander'
makeCustomActions() makeCustomActions()
{ {
set -e set -e
@@ -31,12 +32,28 @@ makeCustomActions()
chmod -x "$datafile" chmod -x "$datafile"
[ -x "$datafile" ] && rm "$datafile" # Some file systems may always make files executable; then, skip this check. [ -x "$datafile" ] && rm "$datafile" # Some file systems may always make files executable; then, skip this check.
# Add an executable file in a folder with the same name as the file,
# in order to ensure completion
for contained in $CONTAINED
do
mkdir "${1}/$contained"
> "${1}/$contained/$contained"
chmod u+x "${1}/$contained/$contained"
done
set +e set +e
} }
removeCustomActions() removeCustomActions()
{ {
set -e set -e
rmdir "${1}/subdir" rmdir "${1}/subdir"
for contained in $CONTAINED
do
rm "${1}/$contained/$contained"
rmdir "${1}/$contained"
done
rm "${1:?}/"* rm "${1:?}/"*
rmdir "$1" rmdir "$1"
set +e set +e
@@ -46,8 +63,8 @@ removeCustomActions()
# Test resolution of the default TODO_ACTIONS_DIR. # Test resolution of the default TODO_ACTIONS_DIR.
# #
makeCustomActions "$HOME/.todo.actions.d" makeCustomActions "$HOME/.todo.actions.d"
test_todo_completion 'all arguments' 'todo.sh ' "$ACTIONS $ADDONS $OPTIONS" test_todo_completion 'all arguments' 'todo.sh ' "$ACTIONS $ADDONS $CONTAINED $OPTIONS"
test_todo_completion 'all arguments after option' 'todo.sh -a ' "$ACTIONS $ADDONS $OPTIONS" test_todo_completion 'all arguments after option' 'todo.sh -a ' "$ACTIONS $ADDONS $CONTAINED $OPTIONS"
test_todo_completion 'all arguments beginning with b' 'todo.sh b' 'bar baz' test_todo_completion 'all arguments beginning with b' 'todo.sh b' 'bar baz'
test_todo_completion 'all arguments beginning with f after options' 'todo.sh -a -v f' 'foobar' test_todo_completion 'all arguments beginning with f after options' 'todo.sh -a -v f' 'foobar'
test_todo_completion 'nothing after addon action' 'todo.sh foobar ' '' test_todo_completion 'nothing after addon action' 'todo.sh foobar ' ''
@@ -56,9 +73,9 @@ removeCustomActions "$HOME/.todo.actions.d"
# #
# Test resolution of an alternative TODO_ACTIONS_DIR. # Test resolution of an alternative TODO_ACTIONS_DIR.
# #
mkdir "$HOME/.todo" mkdir "$HOME/.todo"
makeCustomActions "$HOME/.todo/actions" makeCustomActions "$HOME/.todo/actions"
test_todo_completion 'all arguments with actions from .todo/actions/' 'todo.sh ' "$ACTIONS $ADDONS $OPTIONS" test_todo_completion 'all arguments with actions from .todo/actions/' 'todo.sh ' "$ACTIONS $ADDONS $CONTAINED $OPTIONS"
removeCustomActions "$HOME/.todo/actions" removeCustomActions "$HOME/.todo/actions"
# #
@@ -68,7 +85,7 @@ makeCustomActions "$HOME/addons"
cat >> todo.cfg <<'EOF' cat >> todo.cfg <<'EOF'
export TODO_ACTIONS_DIR="$HOME/addons" export TODO_ACTIONS_DIR="$HOME/addons"
EOF EOF
test_todo_completion 'all arguments with actions from addons/' 'todo.sh ' "$ACTIONS $ADDONS $OPTIONS" test_todo_completion 'all arguments with actions from addons/' 'todo.sh ' "$ACTIONS $ADDONS $CONTAINED $OPTIONS"
removeCustomActions "$HOME/addons" removeCustomActions "$HOME/addons"
test_done test_done

View File

@@ -0,0 +1,27 @@
#!/bin/bash
test_description='Bash add-on action file completion functionality
This test checks todo_completion of files for add-on actions that have file argument(s) configured
'
. ./test-lib.sh
readonly FILES='done.txt report.txt todo.txt'
test_todo_completion 'nothing after unconfigured bar' 'todo.sh bar ' ''
_todo_file1_actions='foo|bar'
test_todo_completion 'all files after configured bar' 'todo.sh bar ' "$FILES"
test_todo_completion 'nothing after configured bar ITEM#' 'todo.sh bar 1 ' ''
_todo_file2_actions='baz'
test_todo_completion 'nothing after configured baz' 'todo.sh baz ' ''
test_todo_completion 'all files after configured baz ITEM#' 'todo.sh baz 1 ' "$FILES"
test_todo_completion 'nothing after configured baz ITEM# MORE' 'todo.sh baz 1 more ' ''
_todo_file3_actions='biz'
test_todo_completion 'nothing after configured biz' 'todo.sh biz ' ''
test_todo_completion 'nothing after configured biz ITEM#' 'todo.sh biz 1 ' ''
test_todo_completion 'all files after configured biz ITEM# MORE' 'todo.sh biz 1 more ' "$FILES"
test_todo_completion 'nothing after configured biz ITEM# EVEN MORE' 'todo.sh biz 1 even more ' ''
test_done

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash completion with different path functionality test_description='Bash completion with different path functionality
@@ -28,8 +27,6 @@ _todo2()
test_todo_custom_completion _todo2 'all todo2 contexts' 'todo2 list @' '@garden @outdoor @outside' test_todo_custom_completion _todo2 'all todo2 contexts' 'todo2 list @' '@garden @outdoor @outside'
# Remove the test environment's bin directory from the PATH, so that our test # Remove the test environment's bin directory from the PATH, so that our test
# executable must be launched with an explicit path. # executable must be launched with an explicit path.
PATH=${PATH##"${PWD}/bin:"} PATH=${PATH##"${PWD}/bin:"}

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash completion with different aliases functionality test_description='Bash completion with different aliases functionality
@@ -46,7 +45,6 @@ test_todo_session 'todo 1 and 2 contexts' <<EOF
@oriental @oriental
EOF EOF
# Define a second completion function that injects the different configuration # Define a second completion function that injects the different configuration
# file. In real use, this would be installed via # file. In real use, this would be installed via
# complete -F _todo2 todo2 # complete -F _todo2 todo2

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
#
test_description='Bash help completion functionality test_description='Bash help completion functionality

View File

@@ -41,4 +41,44 @@ ls
quux quux
EOF EOF
make_action_in_folder "chuck"
# Add a bit of cruft in the action folders in order to ensure that we only
# care about the executables with the same name as the folder in which they
# reside.
touch .todo.actions.d/chuck/mc_hammer # can't touch this
chmod u+x .todo.actions.d/chuck/mc_hammer # better run, better run run
touch .todo.actions.d/chuck/README
make_action_in_folder "norris"
test_todo_session 'custom actions in subfolders' <<EOF
>>> test -f .todo.actions.d/chuck/README
=== 0
>>> test -x .todo.actions.d/chuck/mc_hammer
=== 0
>>> todo.sh listaddons
bar
chuck
ls
norris
quux
EOF
# nthorne: shamelessly stolen from above..
chmod -x .todo.actions.d/norris/norris
# 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/norris/norris ]; then
SKIP_TESTS="${SKIP_TESTS}${SKIP_TESTS+ }t8010.8"
fi
test_todo_session 'nonexecutable action in subfolder' <<EOF
>>> todo.sh listaddons
bar
chuck
ls
quux
EOF
test_done test_done

View File

@@ -172,12 +172,12 @@ test_set_editor () {
# the text_expect_* functions instead. # the text_expect_* functions instead.
test_ok_ () { test_ok_ () {
test_success=$(($test_success + 1)) test_success=$((test_success + 1))
say_color "" " ok $test_count: $@" say_color "" " ok $test_count: $@"
} }
test_failure_ () { test_failure_ () {
test_failure=$(($test_failure + 1)) test_failure=$((test_failure + 1))
say_color error "FAIL $test_count: $1" say_color error "FAIL $test_count: $1"
shift shift
echo "$@" echo "$@"
@@ -185,12 +185,12 @@ test_failure_ () {
} }
test_known_broken_ok_ () { test_known_broken_ok_ () {
test_fixed=$(($test_fixed+1)) test_fixed=$((test_fixed + 1))
say_color "" " FIXED $test_count: $@" say_color "" " FIXED $test_count: $@"
} }
test_known_broken_failure_ () { test_known_broken_failure_ () {
test_broken=$(($test_broken+1)) test_broken=$((test_broken + 1))
say_color skip " still broken $test_count: $@" say_color skip " still broken $test_count: $@"
} }
@@ -206,7 +206,7 @@ test_run_ () {
} }
test_skip () { test_skip () {
test_count=$(($test_count+1)) test_count=$((test_count + 1))
to_skip= to_skip=
for skp in $SKIP_TESTS for skp in $SKIP_TESTS
do do
@@ -264,25 +264,7 @@ test_expect_success () {
test_expect_output () { test_expect_output () {
test "$#" = 2 || test "$#" = 2 ||
error "bug in the test script: not 2 parameters to test-expect-output" error "bug in the test script: not 2 parameters to test-expect-output"
if ! test_skip "$@" test_expect_code_and_output 0 "$@"
then
say >&3 "expecting success and output: $2"
test_run_ "$2"
if [ "$?" = 0 -a "$eval_ret" = 0 ]
then
cmp_output=$(test_cmp expect output)
if [ "$?" = 0 ]
then
test_ok_ "$1"
else
test_failure_ "$@" "
$cmp_output"
fi
else
test_failure_ "$@"
fi
fi
echo >&3 ""
} }
test_expect_code_and_output () { test_expect_code_and_output () {
@@ -290,7 +272,11 @@ test_expect_code_and_output () {
error "bug in the test script: not 3 parameters to test-expect-code-and-output" error "bug in the test script: not 3 parameters to test-expect-code-and-output"
if ! test_skip "$@" if ! test_skip "$@"
then then
say >&3 "expecting exit code $1 and output: $3" if [ "$1" = 0 ]; then
say >&3 "expecting success and output: $3"
else
say >&3 "expecting exit code $1 and output: $3"
fi
test_run_ "$3" test_run_ "$3"
if [ "$?" = 0 -a "$eval_ret" = "$1" ] if [ "$?" = 0 -a "$eval_ret" = "$1" ]
then then
@@ -378,7 +364,7 @@ test_external_without_stderr () {
test_ok_ "$descr" test_ok_ "$descr"
else else
if [ "$verbose" = t ]; then if [ "$verbose" = t ]; then
output=`echo; echo Stderr is:; cat "$stderr"` output=$(echo; echo Stderr is:; cat "$stderr")
else else
output= output=
fi fi
@@ -428,12 +414,12 @@ test_done () {
mkdir -p "$test_results_dir" mkdir -p "$test_results_dir"
test_results_path="$test_results_dir/${0%.sh}-$$" test_results_path="$test_results_dir/${0%.sh}-$$"
echo "total $test_count" >> $test_results_path echo "total $test_count" >> "$test_results_path"
echo "success $test_success" >> $test_results_path echo "success $test_success" >> "$test_results_path"
echo "fixed $test_fixed" >> $test_results_path echo "fixed $test_fixed" >> "$test_results_path"
echo "broken $test_broken" >> $test_results_path echo "broken $test_broken" >> "$test_results_path"
echo "failed $test_failure" >> $test_results_path echo "failed $test_failure" >> "$test_results_path"
echo "" >> $test_results_path echo "" >> "$test_results_path"
if test "$test_fixed" != 0 if test "$test_fixed" != 0
then then
@@ -442,7 +428,7 @@ test_done () {
if test "$test_broken" != 0 if test "$test_broken" != 0
then then
say_color error "still have $test_broken known breakage(s)" say_color error "still have $test_broken known breakage(s)"
msg="remaining $(($test_count-$test_broken)) test(s)" msg="remaining $((test_count - test_broken)) test(s)"
else else
msg="$test_count test(s)" msg="$test_count test(s)"
fi fi
@@ -485,12 +471,12 @@ rm -fr "$test" || {
test_init_todo () { test_init_todo () {
test "$#" = 1 || test "$#" = 1 ||
error "bug in the test script: not 1 parameter to test_init_todo" error "bug in the test script: not 1 parameter to test_init_todo"
owd=`pwd` owd=$(pwd)
root="$1" root="$1"
mkdir -p "$root" mkdir -p "$root"
cd "$root" || error "Cannot setup todo dir in $root" cd "$root" || error "Cannot setup todo dir in $root"
# Initialize the configuration file. Carefully quoted. # Initialize the configuration file. Carefully quoted.
sed -e 's|TODO_DIR=.*$|TODO_DIR="'"$TEST_DIRECTORY/$test"'"|' $TEST_DIRECTORY/../todo.cfg > todo.cfg sed -e 's|TODO_DIR=.*$|TODO_DIR="'"$TEST_DIRECTORY/$test"'"|' "$TEST_DIRECTORY/../todo.cfg" > todo.cfg
# Install latest todo.sh # Install latest todo.sh
mkdir bin mkdir bin
@@ -513,8 +499,8 @@ test_init_todo () {
#date --version #date --version
#date: illegal option -- - #date: illegal option -- -
#usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... #usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
#[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] # [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
elif date --version 2>&1 | grep -q -e "-jnu"; then elif date --version 2>&1 | grep -q -e "-jnR\?u"; then
DATE_STYLE=Mac10.5 DATE_STYLE=Mac10.5
# on Mac OS X 10.4: # on Mac OS X 10.4:
#date --version #date --version
@@ -562,18 +548,20 @@ test_init_todo () {
# Usage: test_tick [increment] # Usage: test_tick [increment]
test_tick () { test_tick () {
TODO_TEST_TIME=$(($TODO_TEST_TIME + ${1:-86400})) TODO_TEST_TIME=$((TODO_TEST_TIME + ${1:-86400}))
} }
# Generate and run a series of tests based on a transcript. # Generate and run a series of tests based on a transcript.
# Usage: test_todo_session "description" <<EOF # Usage: test_todo_session "description" <<'EOF'
# >>> command # >>> command
# output1 # output1
# output2 # output2
#
# >>> command # >>> command
# === exit status # === exit status
# output3 # output3 with empty line (must be escaped here)
# output4 # \
# output5
# EOF # EOF
test_todo_session () { test_todo_session () {
test "$#" = 1 || test "$#" = 1 ||
@@ -582,7 +570,7 @@ test_todo_session () {
cmd="" cmd=""
status=0 status=0
> expect > expect
while read -r line while IFS= read -r line
do do
case $line in case $line in
">>> "*) ">>> "*)
@@ -593,26 +581,29 @@ test_todo_session () {
status=${line#=== } status=${line#=== }
;; ;;
"") "")
if [ ! -z "$cmd" ]; then if [ -n "$cmd" ]; then
if [ $status = 0 ]; then if [ "$status" = 0 ]; then
test_expect_output "$1 $subnum" "$cmd" test_expect_output "$1 $subnum" "$cmd"
else else
test_expect_code_and_output "$status" "$1 $subnum" "$cmd" test_expect_code_and_output "$status" "$1 $subnum" "$cmd"
fi fi
subnum=$(($subnum + 1)) subnum=$((subnum + 1))
cmd="" cmd=""
status=0 status=0
> expect > expect
fi fi
;; ;;
\\)
echo "" >> expect
;;
*) *)
echo "$line" >> expect echo "$line" >> expect
;; ;;
esac esac
done done
if [ ! -z "$cmd" ]; then if [ -n "$cmd" ]; then
if [ $status = 0 ]; then if [ "$status" = 0 ]; then
test_expect_output "$1 $subnum" "$cmd" test_expect_output "$1 $subnum" "$cmd"
else else
test_expect_code_and_output "$status" "$1 $subnum" "$cmd" test_expect_code_and_output "$status" "$1 $subnum" "$cmd"
@@ -654,7 +645,7 @@ test_todo_custom_completion () {
SAVEIFS=$IFS SAVEIFS=$IFS
IFS=' ' set -- $2 IFS=' ' set -- $2
COMP_WORDS=("$@") COMP_WORDS=("$@")
COMP_CWORD=$(($# - $offset)) COMP_CWORD=$(($# - offset))
IFS=' ' eval "set -- $expected" IFS=' ' eval "set -- $expected"
EXPECT=("$@") EXPECT=("$@")
@@ -702,6 +693,13 @@ cd -P "$test" || exit 1
# but use something specified by the framework. # but use something specified by the framework.
HOME=$(pwd) HOME=$(pwd)
export HOME export HOME
# Unset XDG_CONFIG_HOME as that is used as a config alternative.
unset XDG_CONFIG_HOME
# User add-ons may override built-in commands; these could have incompatible
# behavior that makes the tests fail. Avoid picking up user add-ons by
# explicitly configuring the first default location (which with the redirected
# HOME lies within the test directory and usually does not exist).
export TODO_ACTIONS_DIR="$HOME/.todo/actions"
this_test=${0##*/} this_test=${0##*/}
this_test=${this_test%%-*} this_test=${this_test%%-*}

View File

@@ -1,8 +1,8 @@
# === EDIT FILE LOCATIONS BELOW === # === EDIT FILE LOCATIONS BELOW ===
# Your todo.txt directory # Your todo.txt directory (this should be an absolute path)
#export TODO_DIR="/Users/gina/Documents/todo" #export TODO_DIR="/Users/gina/Documents/todo"
export TODO_DIR=`dirname "$0"` export TODO_DIR=${HOME:-$USERPROFILE}
# Your todo/done/report.txt locations # Your todo/done/report.txt locations
export TODO_FILE="$TODO_DIR/todo.txt" export TODO_FILE="$TODO_DIR/todo.txt"
@@ -62,6 +62,22 @@ export REPORT_FILE="$TODO_DIR/report.txt"
# #
# export COLOR_DONE=$LIGHT_GREY # export COLOR_DONE=$LIGHT_GREY
# There is highlighting for projects, contexts, dates, and item numbers.
#
# export COLOR_PROJECT=$RED
# export COLOR_CONTEXT=$RED
# export COLOR_DATE=$BLUE
# export COLOR_NUMBER=$LIGHT_GREY
# There is highlighting for metadata key:value pairs e.g.
# DUE:2006-08-01 or note:MYNOTE
#
# export COLOR_META=$CYAN
# ... and for date extensions (due:yyyy-mm-dd, t:yyyy-mm-dd and again:X)
#
# export COLOR_DATEEXT=$LIGHT_BLUE
# === BEHAVIOR === # === BEHAVIOR ===
## customize list output ## customize list output

552
todo.sh

File diff suppressed because it is too large Load Diff

121
todo_completion Normal file → Executable file
View File

@@ -1,5 +1,7 @@
#!/bin/bash source-this-script # bash completion for todo.txt-cli
[ "$BASH_VERSION" ] || return
# Check for bash
[ -z "$BASH_VERSION" ] && return
_todo() _todo()
{ {
@@ -14,67 +16,75 @@ _todo()
rm depri dp do help list ls listaddons listall lsa listcon \ rm depri dp do help list ls listaddons listall lsa listcon \
lsc listfile lf listpri lsp listproj lsprj move \ lsc listfile lf listpri lsp listproj lsprj move \
mv prepend prep pri p replace report shorthelp" mv prepend prep pri p replace report shorthelp"
local -r MOVE_COMMAND_PATTERN='move|mv'
local _todo_sh=${_todo_sh:-todo.sh} local _todo_sh=${_todo_sh:-todo.sh}
local completions local completions
if [ $COMP_CWORD -eq 1 ]; then if [ "$COMP_CWORD" -eq 1 ]; then
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS" completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null) $OPTS"
elif [[ $COMP_CWORD -gt 2 && ( \ elif [[ $COMP_CWORD -gt 2 && ( \
"${COMP_WORDS[COMP_CWORD-2]}" =~ ^(move|mv)$ || \ "${COMP_WORDS[COMP_CWORD-2]}" =~ ^($MOVE_COMMAND_PATTERN${_todo_file2_actions:+|${_todo_file2_actions}})$ || \
"${COMP_WORDS[COMP_CWORD-3]}" =~ ^(move|mv)$ ) ]]; then "${COMP_WORDS[COMP_CWORD-3]}" =~ ^($MOVE_COMMAND_PATTERN${_todo_file3_actions:+|${_todo_file3_actions}})$ ) ]]; then
# "move ITEM# DEST [SRC]" has file arguments on positions 2 and 3. # "move ITEM# DEST [SRC]" has file arguments on positions 2 and 3.
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile 2>/dev/null)
else else
case "$prev" in case "$prev" in
command) command)
completions=$COMMANDS;; completions=$COMMANDS;;
help) help)
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons)";; completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null)";;
addto|listfile|lf) -*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null) $OPTS";;
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile);; *) if [[ "$prev" =~ ^(addto|listfile|lf${_todo_file1_actions:+|${_todo_file1_actions}})$ ]]; then
-*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS";; completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile 2>/dev/null)
*) case "$cur" in else
+*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj) case "$cur" in
COMPREPLY=( $( compgen -W "$completions" -- $cur )) +*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj 2>/dev/null)
[ ${#COMPREPLY[@]} -gt 0 ] && return 0 COMPREPLY=( $( compgen -W "$completions" -- $cur ))
# Fall back to projects extracted from done tasks. [ ${#COMPREPLY[@]} -gt 0 ] && return 0
completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listproj) # Fall back to projects extracted from done tasks.
;; completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listproj 2>/dev/null)
@*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listcon) ;;
COMPREPLY=( $( compgen -W "$completions" -- $cur )) @*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listcon 2>/dev/null)
[ ${#COMPREPLY[@]} -gt 0 ] && return 0 COMPREPLY=( $( compgen -W "$completions" -- $cur ))
# Fall back to contexts extracted from done tasks. [ ${#COMPREPLY[@]} -gt 0 ] && return 0
completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listcon) # Fall back to contexts extracted from done tasks.
;; completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listcon 2>/dev/null)
*) if [[ "$cur" =~ ^[0-9]+$ ]]; then ;;
# Remove the (padded) task number; we prepend the *) if [[ "$cur" =~ ^[0-9]+$ ]]; then
# user-provided $cur instead. declare -a sedTransformations=(
# Remove the timestamp prepended by the -t option, # Remove the (padded) task number; we prepend the
# and the done date (for done tasks); there's no # user-provided $cur instead.
# todo.txt option for that yet. -e 's/^ *[0-9]\{1,\} //'
# But keep priority and "x"; they're short and may # Remove the timestamp prepended by the -t option,
# provide useful context. # but keep any priority (as it's short and may
# Remove any trailing whitespace; the Bash # provide useful context).
# completion inserts a trailing space itself. -e 's/^\((.) \)\{0,1\}[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/'
# Finally, limit the output to a single line just as # Remove the done date and (if there) the timestamp.
# a safety check of the ls action output. # Keep the "x" (as it's short and may provide useful
local todo=$( \ # context)
eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' | \ -e 's/^\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/'
sed -e 's/^ *[0-9]\{1,\} //' -e 's/\((.) \)[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/' \ # Remove any trailing whitespace; the Bash
-e 's/\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/' \ # completion inserts a trailing space itself.
-e 's/[[:space:]]*$//' \ -e 's/[[:space:]]*$//'
-e '1q' \ # Finally, limit the output to a single line just as
) # a safety check of the ls action output.
# Append task text as a shell comment. This -e '1q'
# completion can be a safety check before a )
# destructive todo.txt operation. local todo=$( \
[ "$todo" ] && COMPREPLY[0]="$cur # $todo" eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' 2>/dev/null | \
return 0 sed "${sedTransformations[@]}" \
else )
return 0 # Append task text as a shell comment. This
fi # completion can be a safety check before a
;; # destructive todo.txt operation.
esac [ "$todo" ] && COMPREPLY[0]="$cur # $todo"
return 0
else
return 0
fi
;;
esac
fi
;; ;;
esac esac
fi fi
@@ -87,6 +97,9 @@ complete -F _todo todo.sh
# If you define an alias (e.g. "t") to todo.sh, you need to explicitly enable # If you define an alias (e.g. "t") to todo.sh, you need to explicitly enable
# completion for it, too: # completion for it, too:
#complete -F _todo t #complete -F _todo t
# It is recommended to put this line next to your alias definition in your
# ~/.bashrc (or wherever else you're defining your alias). If you simply
# uncomment it here, you will need to redo this on every todo.txt update!
# If you have renamed the todo.sh executable, or if it is not accessible through # If you have renamed the todo.sh executable, or if it is not accessible through
# PATH, you need to add and use a wrapper completion function, like this: # PATH, you need to add and use a wrapper completion function, like this:
@@ -99,7 +112,7 @@ complete -F _todo todo.sh
# If you use aliases to use different configuration(s), you need to add and use # If you use aliases to use different configuration(s), you need to add and use
# a wrapper completion function for each configuration if you want to complete # a wrapper completion function for each configuration if you want to complete
# fron the actual configured task locations: # from the actual configured task locations:
#alias todo2='todo.sh -d "$HOME/todo2.cfg"' #alias todo2='todo.sh -d "$HOME/todo2.cfg"'
#_todo2() #_todo2()
#{ #{