Compare commits
131 Commits
cygwin
...
19dde076cf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19dde076cf | ||
|
|
3bc3616651 | ||
|
|
d589fd0570 | ||
|
|
7a30199fe0 | ||
|
|
867ade5701 | ||
|
|
14f5de1579 | ||
|
|
7ec2a1263e | ||
|
|
e40e76fb07 | ||
|
|
8b35c5fdae | ||
|
|
8ec3bab53c | ||
|
|
4a7626a8cb | ||
|
|
9c390a84cb | ||
|
|
643dafeafd | ||
|
|
8d3ea7971b | ||
|
|
64f9c8295d | ||
|
|
b7fb2ac2be | ||
|
|
1d64ba59ca | ||
|
|
4df0f15ad8 | ||
|
|
a43d664fe9 | ||
|
|
953506dc6b | ||
|
|
cbca5d2ff6 | ||
|
|
94e1c6e406 | ||
|
|
eeb5703728 | ||
|
|
a6cf0c0fc2 | ||
|
|
b52929b396 | ||
|
|
0e833e4e9d | ||
|
|
52d47a4d80 | ||
|
|
d61299ef9f | ||
|
|
efea0faf78 | ||
|
|
8fed2da86f | ||
|
|
34b6135415 | ||
|
|
21f3a9da36 | ||
|
|
6e1003b51e | ||
|
|
3c2ad85b47 | ||
|
|
095bdb380a | ||
|
|
66634da336 | ||
|
|
a510598998 | ||
|
|
98141a6e36 | ||
|
|
2c279b65b1 | ||
|
|
5bee9c88a4 | ||
|
|
f4ea40d677 | ||
|
|
837ce22937 | ||
|
|
7c92f46c25 | ||
|
|
07b50a07e0 | ||
|
|
745f5d5179 | ||
|
|
236069c519 | ||
|
|
e60c14ab2b | ||
|
|
33eb234048 | ||
|
|
42e7a079f8 | ||
|
|
1f410e4066 | ||
|
|
d8ceb46364 | ||
|
|
0d139d2027 | ||
|
|
07821f9cff | ||
|
|
2faf072cf7 | ||
|
|
ce365df67c | ||
|
|
93d8e16d50 | ||
|
|
111afe6958 | ||
|
|
92f7b724e6 | ||
|
|
629a301d43 | ||
|
|
4a7dd852a6 | ||
|
|
ec9613e19e | ||
|
|
79845c8eb1 | ||
|
|
b853198c3a | ||
|
|
e1d6b91fa3 | ||
|
|
8ff79102a5 | ||
|
|
8d8ef812a2 | ||
|
|
50aea1e4f0 | ||
|
|
da683366f4 | ||
|
|
e48ad81ecc | ||
|
|
7b5c983bb6 | ||
|
|
f67f630466 | ||
|
|
fe27b10765 | ||
|
|
c0c93c8c0c | ||
|
|
137140a542 | ||
|
|
322c6b95d6 | ||
|
|
28e8a4cd8b | ||
|
|
7f1bdbf3d9 | ||
|
|
a5481990fd | ||
|
|
38d75afeff | ||
|
|
6473802644 | ||
|
|
6a3ddad787 | ||
|
|
7acb521190 | ||
|
|
f2b9734047 | ||
|
|
97035d3425 | ||
|
|
99e5e57a75 | ||
|
|
42424d5881 | ||
|
|
7ab90476f7 | ||
|
|
fac5533b96 | ||
|
|
736e69bd6c | ||
|
|
d2c44e9ffe | ||
|
|
f45bbd1a1d | ||
|
|
e0b93e48fb | ||
|
|
24d0fb003a | ||
|
|
3b0309d9bc | ||
|
|
b21d16878f | ||
|
|
3e82f3ca56 | ||
|
|
e5e31b0f75 | ||
|
|
35f9c4276c | ||
|
|
661dac0cfb | ||
|
|
d7056c5e1e | ||
|
|
92322e7064 | ||
|
|
ebe6a403c8 | ||
|
|
a6fed991e5 | ||
|
|
94f770926b | ||
|
|
322f3075d2 | ||
|
|
bc81db2f2b | ||
|
|
6259cdb6da | ||
|
|
f76b6d5210 | ||
|
|
c1ad7f3560 | ||
|
|
a777b266ed | ||
|
|
ebce735d04 | ||
|
|
e5a308eb03 | ||
|
|
e600a2162b | ||
|
|
3d0a4d0b30 | ||
|
|
79f428779c | ||
|
|
c1dcd0ed78 | ||
|
|
c9d1993dc8 | ||
|
|
451dbdda6b | ||
|
|
060e81aa05 | ||
|
|
296bad334d | ||
|
|
3b90d09b27 | ||
|
|
46afb7f46a | ||
|
|
9e13dfd290 | ||
|
|
fbee428e75 | ||
|
|
3b960a2e3c | ||
|
|
ad1ca6c2c9 | ||
|
|
36e018fd86 | ||
|
|
be0a0265d1 | ||
|
|
cf7f7531be | ||
|
|
28ec5a06f2 | ||
|
|
dfec12e2a4 |
BIN
.github/example.gif
vendored
Normal file
BIN
.github/example.gif
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 657 KiB |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,6 @@
|
|||||||
VERSION-FILE
|
VERSION-FILE
|
||||||
tests/test-results
|
tests/test-results
|
||||||
tests/trash\ directory.*
|
tests/trash\ directory.*
|
||||||
|
done.txt
|
||||||
|
report.txt
|
||||||
|
todo.txt
|
||||||
|
|||||||
6
.travis.yml
Normal file
6
.travis.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Note: "shell" would be more appropriate
|
||||||
|
language: python
|
||||||
|
|
||||||
|
install: make dist && sudo make install
|
||||||
|
|
||||||
|
script: make test
|
||||||
410
CHANGELOG.md
Normal file
410
CHANGELOG.md
Normal file
@@ -0,0 +1,410 @@
|
|||||||
|
# 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.11.0] - 2018-03-26
|
||||||
|
### Added
|
||||||
|
- Added support for `$XDG_CONFIG_HOME` config file/actions location
|
||||||
|
- Created [CODE_OF_CONDUCT.md](/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/useage 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 insenstive. 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.11.0...HEAD
|
||||||
|
[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
|
||||||
|
|
||||||
|
[#230]: https://github.com/todotxt/todo.txt-cli/pull/230
|
||||||
|
[#228]: https://github.com/todotxt/todo.txt-cli/pull/228
|
||||||
|
[#219]: https://github.com/todotxt/todo.txt-cli/pull/219
|
||||||
|
[#218]: https://github.com/todotxt/todo.txt-cli/pull/218
|
||||||
|
[#217]: https://github.com/todotxt/todo.txt-cli/pull/217
|
||||||
|
[#156]: https://github.com/todotxt/todo.txt-cli/pull/156
|
||||||
|
[#8]: https://github.com/todotxt/todo.txt-cli/pull/8
|
||||||
46
CODE_OF_CONDUCT.md
Normal file
46
CODE_OF_CONDUCT.md
Normal 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
CONTRIBUTING.md
Normal file
97
CONTRIBUTING.md
Normal 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/
|
||||||
@@ -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]*)
|
||||||
|
|||||||
22
ISSUE_TEMPLATE.md
Normal file
22
ISSUE_TEMPLATE.md
Normal 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`
|
||||||
|
|
||||||
8
LICENSE
8
LICENSE
@@ -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>.
|
||||||
40
Makefile
40
Makefile
@@ -2,6 +2,22 @@
|
|||||||
# 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
|
||||||
|
|
||||||
|
# The directory to install todo.sh in.
|
||||||
|
bindir = $(prefix)/bin
|
||||||
|
|
||||||
|
# The directory to install the config file in.
|
||||||
|
sysconfdir = $(prefix)/etc
|
||||||
|
|
||||||
|
datarootdir = $(prefix)/share
|
||||||
|
|
||||||
# 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 +36,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
|
||||||
|
chmod +x $(DISTNAME)/todo.sh
|
||||||
tar cf $(DISTNAME).tar $(DISTNAME)/
|
tar cf $(DISTNAME).tar $(DISTNAME)/
|
||||||
gzip -f -9 $(DISTNAME).tar
|
gzip -f -9 $(DISTNAME).tar
|
||||||
zip -9r $(DISTNAME).zip $(DISTNAME)/
|
zip -9r $(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)/bash_completion.d/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)/bash_completion.d/todo
|
||||||
|
rm -f $(DESTDIR)$(sysconfdir)/todo/config
|
||||||
|
|
||||||
|
rmdir $(DESTDIR)$(datarootdir)/bash_completion.d
|
||||||
|
rmdir $(DESTDIR)$(sysconfdir)/todo
|
||||||
|
|
||||||
|
installdirs:
|
||||||
|
mkdir -p $(DESTDIR)$(bindir) \
|
||||||
|
$(DESTDIR)$(sysconfdir)/todo \
|
||||||
|
$(DESTDIR)$(datarootdir)/bash_completion.d
|
||||||
|
|
||||||
#
|
#
|
||||||
# Testing
|
# Testing
|
||||||
@@ -42,7 +78,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*-*
|
||||||
|
|||||||
9
PULL_REQUEST_TEMPLATE.md
Normal file
9
PULL_REQUEST_TEMPLATE.md
Normal 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.
|
||||||
|
- [ ] Format 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.
|
||||||
99
README.md
Normal file
99
README.md
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
# [][website]
|
||||||
|
|
||||||
|
> A simple and extensible shell script for managing your todo.txt file.
|
||||||
|
|
||||||
|
[](https://travis-ci.org/todotxt/todo.txt-cli)
|
||||||
|
[](https://github.com/todotxt/todo.txt-cli/issues)
|
||||||
|
[](https://github.com/todotxt/todo.txt-cli/network)
|
||||||
|
[](https://github.com/todotxt/todo.txt-cli/stargazers)
|
||||||
|
[](https://raw.githubusercontent.com/todotxt/todo.txt-cli/master/LICENSE)
|
||||||
|
[](https://gitter.im/todotxt/todo.txt-cli)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
*Read our [contributing guide](CONTRIBUTING.md) 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
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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_DIR=/usr/share/bash-completion/completions
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Arch Linux (AUR)
|
||||||
|
|
||||||
|
https://aur.archlinux.org/packages/todotxt-git/
|
||||||
|
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
|
- [Stack Overflow](https://stackoverflow.com/questions/tagged/todotxt)
|
||||||
|
- [Gitter chat](https://gitter.im/todotxt/todo.txt-cli)
|
||||||
|
- [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 contributations. 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]: ./CODE_OF_CONDUCT.md
|
||||||
|
[CONTRIBUTING]: ./CONTRIBUTING.md
|
||||||
@@ -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
266
USAGE.md
Normal 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 the default `~/.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`
|
||||||
29
tests/README
29
tests/README
@@ -125,10 +125,10 @@ Writing Tests
|
|||||||
-------------
|
-------------
|
||||||
|
|
||||||
The test script is written as a shell script. It should start
|
The test script is written as a shell script. It should start
|
||||||
with the standard "#!/bin/sh" with copyright notices, and an
|
with the standard "#!/bin/bash" with copyright notices, and an
|
||||||
assignment to variable 'test_description', like this:
|
assignment to variable 'test_description', like this:
|
||||||
|
|
||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2005 Junio C Hamano
|
# Copyright (c) 2005 Junio C Hamano
|
||||||
#
|
#
|
||||||
@@ -186,6 +186,24 @@ library for your script to use.
|
|||||||
expected output. (See below for how to generate transcripts
|
expected output. (See below for how to generate transcripts
|
||||||
easily.)
|
easily.)
|
||||||
|
|
||||||
|
- test_todo_completion <message> <cmdline> <completions>
|
||||||
|
|
||||||
|
This takes three strings as parameter. Based on <cmdline>,
|
||||||
|
the todo_completion script is triggered in the current test
|
||||||
|
environment and completions are compared with <completions>,
|
||||||
|
which should be a space-separated list. If any completion
|
||||||
|
contains whitespace, quote it; the entire <completions>
|
||||||
|
argument is eval()'ed.
|
||||||
|
Include a trailing space in <cmdline> when you want to check
|
||||||
|
new argument completion; otherwise, completion is triggered
|
||||||
|
with the context of the last argument. <message> should state
|
||||||
|
what it is testing.
|
||||||
|
|
||||||
|
- test_todo_custom_completion <completefunc> <message> <cmdline> <completions>
|
||||||
|
|
||||||
|
Same as above, but in addition allows to specify a custom
|
||||||
|
completion function.
|
||||||
|
|
||||||
- test_tick [interval]
|
- test_tick [interval]
|
||||||
|
|
||||||
The test harness has an internal view of time which is
|
The test harness has an internal view of time which is
|
||||||
@@ -205,6 +223,13 @@ library for your script to use.
|
|||||||
'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>
|
||||||
|
|
||||||
|
This takes an exit status and two strings as parameter, and
|
||||||
|
evaluates the <script>. If it yields <code>, test is
|
||||||
|
considered successful. <message> should state what it is
|
||||||
|
testing.
|
||||||
|
|
||||||
- test_expect_failure <message> <script>
|
- test_expect_failure <message> <script>
|
||||||
|
|
||||||
This is NOT the opposite of test_expect_success, but is used
|
This is NOT the opposite of test_expect_success, but is used
|
||||||
|
|||||||
36
tests/actions-test-lib.sh
Normal file
36
tests/actions-test-lib.sh
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
make_action()
|
||||||
|
{
|
||||||
|
unset TODO_ACTIONS_DIR
|
||||||
|
[ -d .todo.actions.d ] || mkdir .todo.actions.d
|
||||||
|
cat > ".todo.actions.d/$1" <<EOF
|
||||||
|
#!/bin/bash
|
||||||
|
[ "\$1" = "usage" ] && {
|
||||||
|
echo " $1 ITEM#[, ITEM#, ...] [TERM...]"
|
||||||
|
echo " This custom action does $1."
|
||||||
|
echo ""
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
echo "custom action $1"
|
||||||
|
EOF
|
||||||
|
chmod +x ".todo.actions.d/$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='todo.sh configuration file location
|
test_description='todo.sh configuration file location
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='todo.sh basic null functionality test.
|
test_description='todo.sh basic null functionality test.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='todo.sh actions.d
|
test_description='todo.sh actions.d
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='no old-style backtick command substitution
|
test_description='no old-style backtick command substitution
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic add and list functionality
|
test_description='basic add and list functionality
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='test the date on add feature
|
test_description='test the date on add feature
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic addto and list functionality
|
test_description='basic addto and list functionality
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='test the date on addto feature
|
test_description='test the date on addto feature
|
||||||
|
|
||||||
|
|||||||
33
tests/t1040-add-priority.sh
Executable file
33
tests/t1040-add-priority.sh
Executable 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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic replace functionality
|
test_description='basic replace functionality
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic priority functionality
|
test_description='basic priority functionality
|
||||||
'
|
'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='list priority functionality
|
test_description='list priority functionality
|
||||||
'
|
'
|
||||||
@@ -61,6 +61,42 @@ TODO: 0 of 5 tasks shown
|
|||||||
TODO: 0 of 5 tasks shown
|
TODO: 0 of 5 tasks shown
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
(B) smell the uppercase Roses +flowers @outside
|
||||||
|
(X) clean the house from A-Z
|
||||||
|
(C) notice the sunflowers
|
||||||
|
(X) listen to music
|
||||||
|
buy more records from artists A-Z
|
||||||
|
EOF
|
||||||
|
test_todo_session 'listpri filtering priority ranges' <<EOF
|
||||||
|
>>> todo.sh -p listpri a-c
|
||||||
|
1 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
3 (C) notice the sunflowers
|
||||||
|
--
|
||||||
|
TODO: 2 of 5 tasks shown
|
||||||
|
|
||||||
|
>>> todo.sh -p listpri c-Z
|
||||||
|
3 (C) notice the sunflowers
|
||||||
|
2 (X) clean the house from A-Z
|
||||||
|
4 (X) listen to music
|
||||||
|
--
|
||||||
|
TODO: 3 of 5 tasks shown
|
||||||
|
|
||||||
|
>>> todo.sh -p listpri A-
|
||||||
|
2 (X) clean the house from A-Z
|
||||||
|
--
|
||||||
|
TODO: 1 of 5 tasks shown
|
||||||
|
|
||||||
|
>>> todo.sh -p listpri A-C A-Z
|
||||||
|
--
|
||||||
|
TODO: 0 of 5 tasks shown
|
||||||
|
|
||||||
|
>>> todo.sh -p listpri X A-Z
|
||||||
|
2 (X) clean the house from A-Z
|
||||||
|
--
|
||||||
|
TODO: 1 of 5 tasks shown
|
||||||
|
EOF
|
||||||
|
|
||||||
cat > todo.txt <<EOF
|
cat > todo.txt <<EOF
|
||||||
(B) ccc xxx this line should be third.
|
(B) ccc xxx this line should be third.
|
||||||
ccc xxx this line should be third.
|
ccc xxx this line should be third.
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
test_description='list project functionality
|
|
||||||
'
|
|
||||||
. ./test-lib.sh
|
|
||||||
|
|
||||||
cat > todo.txt <<EOF
|
|
||||||
(B) smell the uppercase Roses +roses @outside +shared
|
|
||||||
(C) notice the sunflowers +sunflowers @garden +shared +landscape
|
|
||||||
stop
|
|
||||||
EOF
|
|
||||||
test_todo_session 'basic listproj' <<EOF
|
|
||||||
>>> todo.sh listproj
|
|
||||||
+landscape
|
|
||||||
+roses
|
|
||||||
+shared
|
|
||||||
+sunflowers
|
|
||||||
EOF
|
|
||||||
|
|
||||||
test_todo_session 'listproj with context' <<EOF
|
|
||||||
>>> todo.sh listproj @garden
|
|
||||||
+landscape
|
|
||||||
+shared
|
|
||||||
+sunflowers
|
|
||||||
EOF
|
|
||||||
|
|
||||||
TEST_TODO_CUSTOM=todo-custom.cfg
|
|
||||||
cat todo.cfg > "$TEST_TODO_CUSTOM"
|
|
||||||
cat >> "$TEST_TODO_CUSTOM" <<'EOF'
|
|
||||||
export DEFAULT='</color>'
|
|
||||||
export PRI_B='<color type=green>'
|
|
||||||
export PRI_C='<color type=blue>'
|
|
||||||
export TODOTXT_FINAL_FILTER='grep -i roses'
|
|
||||||
EOF
|
|
||||||
test_todo_session 'listproj with context special cases' <<EOF
|
|
||||||
>>> todo.sh -+ -d "$TEST_TODO_CUSTOM" listproj @garden
|
|
||||||
+landscape
|
|
||||||
+shared
|
|
||||||
+sunflowers
|
|
||||||
EOF
|
|
||||||
|
|
||||||
test_done
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
|
|
||||||
test_description='list functionality
|
test_description='list functionality
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
|
|
||||||
test_description='listcon functionality
|
test_description='listcon functionality
|
||||||
@@ -55,4 +55,33 @@ 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
|
||||||
|
@con01 -- Some context 1 task
|
||||||
|
EOF
|
||||||
|
cat > done.txt <<EOF
|
||||||
|
x 2012-02-21 @done01 -- Some context 1 done task
|
||||||
|
x 2012-02-21 @done02 -- Some context 2 done task
|
||||||
|
EOF
|
||||||
|
test_todo_session 'listcon from done tasks' <<'EOF'
|
||||||
|
>>> TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh listcon
|
||||||
|
@done01
|
||||||
|
@done02
|
||||||
|
EOF
|
||||||
|
test_todo_session 'listcon from combined open + done tasks' <<'EOF'
|
||||||
|
>>> TODOTXT_SOURCEVAR='("$TODO_FILE" "$DONE_FILE")' todo.sh listcon
|
||||||
|
@con01
|
||||||
|
@done01
|
||||||
|
@done02
|
||||||
|
EOF
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
|
|
||||||
test_description='listproj functionality
|
test_description='listproj functionality
|
||||||
@@ -55,4 +55,68 @@ test_todo_session 'listproj embedded + test' <<EOF
|
|||||||
+prj02
|
+prj02
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
(B) smell the uppercase Roses +roses @outside +shared
|
||||||
|
(C) notice the sunflowers +sunflowers @garden +shared +landscape
|
||||||
|
stop
|
||||||
|
EOF
|
||||||
|
test_todo_session 'basic listproj' <<EOF
|
||||||
|
>>> todo.sh listproj
|
||||||
|
+landscape
|
||||||
|
+roses
|
||||||
|
+shared
|
||||||
|
+sunflowers
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'listproj with context' <<EOF
|
||||||
|
>>> todo.sh listproj @garden
|
||||||
|
+landscape
|
||||||
|
+shared
|
||||||
|
+sunflowers
|
||||||
|
EOF
|
||||||
|
|
||||||
|
TEST_TODO_CUSTOM=todo-custom.cfg
|
||||||
|
cat todo.cfg > "$TEST_TODO_CUSTOM"
|
||||||
|
cat >> "$TEST_TODO_CUSTOM" <<'EOF'
|
||||||
|
export DEFAULT='</color>'
|
||||||
|
export PRI_B='<color type=green>'
|
||||||
|
export PRI_C='<color type=blue>'
|
||||||
|
export TODOTXT_FINAL_FILTER='grep -i roses'
|
||||||
|
EOF
|
||||||
|
test_todo_session 'listproj with context special cases' <<EOF
|
||||||
|
>>> todo.sh -+ -d "$TEST_TODO_CUSTOM" listproj @garden
|
||||||
|
+landscape
|
||||||
|
+shared
|
||||||
|
+sunflowers
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
+prj01 -- Some project 1 task
|
||||||
|
EOF
|
||||||
|
cat > done.txt <<EOF
|
||||||
|
x 2012-02-21 +done01 -- Special project 1 done task
|
||||||
|
x 2012-02-21 +done02 -- Some project 2 done task
|
||||||
|
EOF
|
||||||
|
test_todo_session 'listproj from done tasks' <<'EOF'
|
||||||
|
>>> TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh listproj
|
||||||
|
+done01
|
||||||
|
+done02
|
||||||
|
EOF
|
||||||
|
test_todo_session 'listproj from done tasks with filtering' <<'EOF'
|
||||||
|
>>> TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh listproj Special
|
||||||
|
+done01
|
||||||
|
EOF
|
||||||
|
test_todo_session 'listproj from combined open + done tasks' <<'EOF'
|
||||||
|
>>> TODOTXT_SOURCEVAR='("$TODO_FILE" "$DONE_FILE")' todo.sh listproj
|
||||||
|
+done01
|
||||||
|
+done02
|
||||||
|
+prj01
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'listproj with GREP_OPTIONS disruption' <<'EOF'
|
||||||
|
>>> GREP_OPTIONS=-n todo.sh listproj
|
||||||
|
+prj01
|
||||||
|
EOF
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
|
|
||||||
test_description='list highlighting
|
test_description='list highlighting
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='listall functionality
|
test_description='listall functionality
|
||||||
'
|
'
|
||||||
|
|||||||
91
tests/t1360-ls-project-context-highlighting.sh
Executable file
91
tests/t1360-ls-project-context-highlighting.sh
Executable file
@@ -0,0 +1,91 @@
|
|||||||
|
#!/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;33m1 (A) prioritized [1m@con01[0m[1;33m context[0m
|
||||||
|
[0;32m2 (B) prioritized [2m+prj02[0m[0;32m project[0m
|
||||||
|
[1;34m3 (C) prioritized context at EOL [1m@con03[0m[1;34m[0m
|
||||||
|
[1;37m4 (D) prioritized project at EOL [2m+prj04[0m[1;37m[0m
|
||||||
|
5 [2m+prj05[0m non-prioritized project at BOL
|
||||||
|
6 [1m@con06[0m non-prioritized context at BOL
|
||||||
|
7 multiple [1m@con_[0m [1m@texts[0m and [2m+pro_[0m [2m+jects[0m
|
||||||
|
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;33m1 (A) prioritized context[0m
|
||||||
|
[0;32m2 (B) prioritized [2m+prj02[0m[0;32m project[0m
|
||||||
|
[1;34m3 (C) prioritized context at EOL[0m
|
||||||
|
[1;37m4 (D) prioritized project at EOL [2m+prj04[0m[1;37m[0m
|
||||||
|
5 [2m+prj05[0m non-prioritized project at BOL
|
||||||
|
6 non-prioritized context at BOL
|
||||||
|
7 multiple and [2m+pro_[0m [2m+jects[0m
|
||||||
|
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;33m1 (A) prioritized [1m@con01[0m[1;33m context[0m
|
||||||
|
[0;32m2 (B) prioritized project[0m
|
||||||
|
[1;34m3 (C) prioritized context at EOL [1m@con03[0m[1;34m[0m
|
||||||
|
[1;37m4 (D) prioritized project at EOL[0m
|
||||||
|
5 non-prioritized project at BOL
|
||||||
|
6 [1m@con06[0m non-prioritized context at BOL
|
||||||
|
7 multiple [1m@con_[0m [1m@texts[0m and
|
||||||
|
8 non-contexts: seti@home @ @* @(foo)
|
||||||
|
9 non-projects: lost+found +
|
||||||
|
--
|
||||||
|
TODO: 9 of 9 tasks shown
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic prepend functionality
|
test_description='basic prepend functionality
|
||||||
'
|
'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='do functionality
|
test_description='do functionality
|
||||||
'
|
'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic append functionality
|
test_description='basic append functionality
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic depriority functionality
|
test_description='basic depriority functionality
|
||||||
'
|
'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic del functionality
|
test_description='basic del functionality
|
||||||
'
|
'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='archive functionality
|
test_description='archive functionality
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='deduplicate functionality
|
test_description='deduplicate functionality
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='report functionality
|
test_description='report functionality
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='Multi-line functionality'
|
test_description='Multi-line functionality'
|
||||||
|
|
||||||
@@ -8,18 +8,18 @@ test_description='Multi-line functionality'
|
|||||||
# Create the expected file
|
# Create the expected file
|
||||||
echo "1 smell the cheese
|
echo "1 smell the cheese
|
||||||
TODO: Replaced task with:
|
TODO: Replaced task with:
|
||||||
1 eat apples eat oranges drink milk">$HOME/expect.multi
|
1 eat apples eat oranges drink milk">"$HOME/expect.multi"
|
||||||
|
|
||||||
test_expect_success 'multiline squash item replace' '
|
test_expect_success 'multiline squash item replace' '
|
||||||
(
|
(
|
||||||
# Prepare single line todo file
|
# Prepare single line todo file
|
||||||
cat /dev/null > $HOME/todo.txt
|
cat /dev/null > "$HOME/todo.txt"
|
||||||
"$HOME/bin/todo.sh" add smell the cheese
|
"$HOME/bin/todo.sh" add smell the cheese
|
||||||
|
|
||||||
# Run replace
|
# Run replace
|
||||||
"$HOME/bin/todo.sh" replace 1 "eat apples
|
"$HOME/bin/todo.sh" replace 1 "eat apples
|
||||||
eat oranges
|
eat oranges
|
||||||
drink milk" > $HOME/output.multi
|
drink milk" > "$HOME/output.multi"
|
||||||
|
|
||||||
# Test output against expected
|
# Test output against expected
|
||||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
@@ -34,18 +34,18 @@ fi
|
|||||||
## Add test
|
## Add test
|
||||||
# Create the expected file
|
# Create the expected file
|
||||||
echo "2 eat apples eat oranges drink milk
|
echo "2 eat apples eat oranges drink milk
|
||||||
TODO: 2 added.">$HOME/expect.multi
|
TODO: 2 added.">"$HOME/expect.multi"
|
||||||
|
|
||||||
test_expect_success 'multiline squash item add' '
|
test_expect_success 'multiline squash item add' '
|
||||||
(
|
(
|
||||||
# Prepare single line todo file
|
# Prepare single line todo file
|
||||||
cat /dev/null > $HOME/todo.txt
|
cat /dev/null > "$HOME/todo.txt"
|
||||||
"$HOME/bin/todo.sh" add smell the cheese
|
"$HOME/bin/todo.sh" add smell the cheese
|
||||||
|
|
||||||
# Run add
|
# Run add
|
||||||
"$HOME/bin/todo.sh" add "eat apples
|
"$HOME/bin/todo.sh" add "eat apples
|
||||||
eat oranges
|
eat oranges
|
||||||
drink milk" > $HOME/output.multi
|
drink milk" > "$HOME/output.multi"
|
||||||
|
|
||||||
# Test output against expected
|
# Test output against expected
|
||||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
@@ -59,18 +59,18 @@ fi
|
|||||||
|
|
||||||
## Append test
|
## Append test
|
||||||
# Create the expected file
|
# Create the expected file
|
||||||
echo "1 smell the cheese eat apples eat oranges drink milk">$HOME/expect.multi
|
echo "1 smell the cheese eat apples eat oranges drink milk">"$HOME/expect.multi"
|
||||||
|
|
||||||
test_expect_success 'multiline squash item append' '
|
test_expect_success 'multiline squash item append' '
|
||||||
(
|
(
|
||||||
# Prepare single line todo file
|
# Prepare single line todo file
|
||||||
cat /dev/null > $HOME/todo.txt
|
cat /dev/null > "$HOME/todo.txt"
|
||||||
"$HOME/bin/todo.sh" add smell the cheese
|
"$HOME/bin/todo.sh" add smell the cheese
|
||||||
|
|
||||||
# Run append
|
# Run append
|
||||||
"$HOME/bin/todo.sh" append 1 "eat apples
|
"$HOME/bin/todo.sh" append 1 "eat apples
|
||||||
eat oranges
|
eat oranges
|
||||||
drink milk" > $HOME/output.multi
|
drink milk" > "$HOME/output.multi"
|
||||||
|
|
||||||
# Test output against expected
|
# Test output against expected
|
||||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
@@ -84,18 +84,18 @@ fi
|
|||||||
|
|
||||||
## Prepend test
|
## Prepend test
|
||||||
# Create the expected file
|
# Create the expected file
|
||||||
echo "1 eat apples eat oranges drink milk smell the cheese">$HOME/expect.multi
|
echo "1 eat apples eat oranges drink milk smell the cheese">"$HOME/expect.multi"
|
||||||
|
|
||||||
test_expect_success 'multiline squash item prepend' '
|
test_expect_success 'multiline squash item prepend' '
|
||||||
(
|
(
|
||||||
# Prepare single line todo file
|
# Prepare single line todo file
|
||||||
cat /dev/null > $HOME/todo.txt
|
cat /dev/null > "$HOME/todo.txt"
|
||||||
"$HOME/bin/todo.sh" add smell the cheese
|
"$HOME/bin/todo.sh" add smell the cheese
|
||||||
|
|
||||||
# Run prepend
|
# Run prepend
|
||||||
"$HOME/bin/todo.sh" prepend 1 "eat apples
|
"$HOME/bin/todo.sh" prepend 1 "eat apples
|
||||||
eat oranges
|
eat oranges
|
||||||
drink milk" > $HOME/output.multi
|
drink milk" > "$HOME/output.multi"
|
||||||
|
|
||||||
# Test output against expected
|
# Test output against expected
|
||||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
@@ -110,18 +110,18 @@ fi
|
|||||||
## Multiple line addition
|
## Multiple line addition
|
||||||
# Create the expected file
|
# Create the expected file
|
||||||
echo "2 eat apples
|
echo "2 eat apples
|
||||||
TODO: 2 added." > $HOME/expect.multi
|
TODO: 2 added." > "$HOME/expect.multi"
|
||||||
echo "3 eat oranges
|
echo "3 eat oranges
|
||||||
TODO: 3 added." >>$HOME/expect.multi
|
TODO: 3 added." >>"$HOME/expect.multi"
|
||||||
echo "4 drink milk
|
echo "4 drink milk
|
||||||
TODO: 4 added." >> $HOME/expect.multi
|
TODO: 4 added." >>"$HOME/expect.multi"
|
||||||
|
|
||||||
test_expect_success 'actual multiline add' '
|
test_expect_success 'actual multiline add' '
|
||||||
(
|
(
|
||||||
# Run addm
|
# Run addm
|
||||||
"$HOME/bin/todo.sh" addm "eat apples
|
"$HOME/bin/todo.sh" addm "eat apples
|
||||||
eat oranges
|
eat oranges
|
||||||
drink milk" > $HOME/output.multi
|
drink milk" > "$HOME/output.multi"
|
||||||
|
|
||||||
# Test output against expected
|
# Test output against expected
|
||||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
|
|||||||
44
tests/t2100-help.sh
Executable file
44
tests/t2100-help.sh
Executable file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='help functionality
|
||||||
|
|
||||||
|
This test covers the help output.
|
||||||
|
'
|
||||||
|
. ./actions-test-lib.sh
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
# Note: To avoid having to adapt the test whenever the help documentation
|
||||||
|
# slightly changes, only check for the section headers.
|
||||||
|
test_todo_session 'help output' <<EOF
|
||||||
|
>>> todo.sh help | sed '/^ [A-Z]/!d'
|
||||||
|
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||||
|
Options:
|
||||||
|
Built-in Actions:
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'verbose help output' <<EOF
|
||||||
|
>>> todo.sh -v help | sed '/^ [A-Z]/!d'
|
||||||
|
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||||
|
Options:
|
||||||
|
Built-in Actions:
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'very verbose help output' <<EOF
|
||||||
|
>>> todo.sh -vv help | sed '/^ [A-Z]/!d'
|
||||||
|
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||||
|
Options:
|
||||||
|
Environment variables:
|
||||||
|
Built-in Actions:
|
||||||
|
EOF
|
||||||
|
|
||||||
|
make_action "foo"
|
||||||
|
test_todo_session 'help output with custom action' <<EOF
|
||||||
|
>>> todo.sh -v help | sed '/^ [A-Z]/!d'
|
||||||
|
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||||
|
Options:
|
||||||
|
Built-in Actions:
|
||||||
|
Add-on Actions:
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
66
tests/t2110-help-action.sh
Executable file
66
tests/t2110-help-action.sh
Executable file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
test_description='built-in actions help functionality
|
||||||
|
|
||||||
|
This test checks listing the usage help of a built-in action.
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_todo_session 'nonexisting action help' <<'EOF'
|
||||||
|
>>> todo.sh help doesnotexist
|
||||||
|
TODO: No action "doesnotexist" exists.
|
||||||
|
=== 1
|
||||||
|
|
||||||
|
>>> todo.sh help hel
|
||||||
|
TODO: No action "hel" exists.
|
||||||
|
=== 1
|
||||||
|
|
||||||
|
>>> todo.sh help h
|
||||||
|
TODO: No action "h" exists.
|
||||||
|
=== 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'single action help' <<'EOF'
|
||||||
|
>>> todo.sh help shorthelp
|
||||||
|
shorthelp
|
||||||
|
List the one-line usage of all built-in and add-on actions.
|
||||||
|
\
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'multiple actions help' <<'EOF'
|
||||||
|
>>> todo.sh help shorthelp append
|
||||||
|
shorthelp
|
||||||
|
List the one-line usage of all built-in and add-on actions.
|
||||||
|
\
|
||||||
|
append ITEM# "TEXT TO APPEND"
|
||||||
|
app ITEM# "TEXT TO APPEND"
|
||||||
|
Adds TEXT TO APPEND to the end of the task on line ITEM#.
|
||||||
|
Quotes optional.
|
||||||
|
\
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'short and long form of action help' <<'EOF'
|
||||||
|
>>> todo.sh help append
|
||||||
|
append ITEM# "TEXT TO APPEND"
|
||||||
|
app ITEM# "TEXT TO APPEND"
|
||||||
|
Adds TEXT TO APPEND to the end of the task on line ITEM#.
|
||||||
|
Quotes optional.
|
||||||
|
\
|
||||||
|
|
||||||
|
>>> todo.sh help app
|
||||||
|
app ITEM# "TEXT TO APPEND"
|
||||||
|
Adds TEXT TO APPEND to the end of the task on line ITEM#.
|
||||||
|
Quotes optional.
|
||||||
|
\
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'mixed existing and nonexisting action help' <<'EOF'
|
||||||
|
>>> todo.sh help shorthelp doesnotexist list
|
||||||
|
shorthelp
|
||||||
|
List the one-line usage of all built-in and add-on actions.
|
||||||
|
\
|
||||||
|
TODO: No action "doesnotexist" exists.
|
||||||
|
=== 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
82
tests/t2120-shorthelp.sh
Executable file
82
tests/t2120-shorthelp.sh
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
#!/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
|
||||||
49
tests/t2200-no-done-report-files.sh
Executable file
49
tests/t2200-no-done-report-files.sh
Executable file
@@ -0,0 +1,49 @@
|
|||||||
|
#!/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
|
||||||
22
tests/t6000-completion.sh
Executable file
22
tests/t6000-completion.sh
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash completion functionality
|
||||||
|
|
||||||
|
This test checks basic todo_completion of actions and options
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
readonly ACTIONS='add a addto addm append app archive command del rm depri dp do help list ls listaddons listall lsa listcon lsc listfile lf listpri lsp listproj lsprj move mv prepend prep pri p replace report shorthelp'
|
||||||
|
readonly OPTIONS='-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x'
|
||||||
|
|
||||||
|
test_todo_completion 'all arguments' 'todo.sh ' "$ACTIONS $OPTIONS"
|
||||||
|
test_todo_completion 'arguments beginning with a' 'todo.sh a' 'add a addto addm append app archive'
|
||||||
|
test_todo_completion 'all options' 'todo.sh -' "$OPTIONS"
|
||||||
|
test_todo_completion 'all actions after command action' 'todo.sh command ' "$ACTIONS"
|
||||||
|
test_todo_completion 'all arguments after option' 'todo.sh -a ' "$ACTIONS $OPTIONS"
|
||||||
|
test_todo_completion 'all arguments after options' 'todo.sh -a -p ' "$ACTIONS $OPTIONS"
|
||||||
|
test_todo_completion 'all options after options' 'todo.sh -a -p -' "$OPTIONS"
|
||||||
|
test_todo_completion 'nothing after action' 'todo.sh archive ' ''
|
||||||
|
|
||||||
|
test_done
|
||||||
27
tests/t6010-completion-contexts.sh
Executable file
27
tests/t6010-completion-contexts.sh
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash context completion functionality
|
||||||
|
|
||||||
|
This test checks todo_completion of contexts
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
(B) smell the +roses @outside @outdoor +shared
|
||||||
|
notice the sunflowers +sunflowers @outside @garden +shared +landscape
|
||||||
|
stop
|
||||||
|
EOF
|
||||||
|
cat > done.txt <<EOF
|
||||||
|
x 2012-02-21 +herbs @oriental buy spices
|
||||||
|
x 2012-02-21 +slack @home watch tv
|
||||||
|
EOF
|
||||||
|
test_todo_completion 'all contexts' 'todo.sh list @' '@garden @outdoor @outside'
|
||||||
|
test_todo_completion 'contexts beginning with o' 'todo.sh list @o' '@outdoor @outside'
|
||||||
|
test_todo_completion 'contexts beginning with outs' 'todo.sh list @outs' '@outside'
|
||||||
|
test_todo_completion 'contexts beginning with x' 'todo.sh list @x' ''
|
||||||
|
|
||||||
|
test_todo_completion 'contexts from done tasks beginning with h' 'todo.sh list @h' '@home'
|
||||||
|
test_todo_completion 'contexts from done tasks beginning with or' 'todo.sh list @or' '@oriental'
|
||||||
|
|
||||||
|
test_done
|
||||||
27
tests/t6020-completion-projects.sh
Executable file
27
tests/t6020-completion-projects.sh
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash project completion functionality
|
||||||
|
|
||||||
|
This test checks todo_completion of projects
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
(B) smell the +roses @outside @outdoor +shared
|
||||||
|
notice the sunflowers +sunflowers @outside @garden +shared +landscape
|
||||||
|
stop
|
||||||
|
EOF
|
||||||
|
cat > done.txt <<EOF
|
||||||
|
x 2012-02-21 +herbs @oriental buy spices
|
||||||
|
x 2012-02-21 +slack @home watch tv
|
||||||
|
EOF
|
||||||
|
test_todo_completion 'all projects' 'todo.sh list +' '+landscape +roses +shared +sunflowers'
|
||||||
|
test_todo_completion 'projects beginning with s' 'todo.sh list +s' '+shared +sunflowers'
|
||||||
|
test_todo_completion 'projects beginning with ro' 'todo.sh list +ro' '+roses'
|
||||||
|
test_todo_completion 'projects beginning with x' 'todo.sh list +x' ''
|
||||||
|
|
||||||
|
test_todo_completion 'projects from done tasks beginning with h' 'todo.sh list +h' '+herbs'
|
||||||
|
test_todo_completion 'projects from done tasks beginning with sl' 'todo.sh list +sl' '+slack'
|
||||||
|
|
||||||
|
test_done
|
||||||
27
tests/t6030-completion-tasks.sh
Executable file
27
tests/t6030-completion-tasks.sh
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash task number completion functionality
|
||||||
|
|
||||||
|
This test checks todo_completion of a task number into the abbreviated task text.
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
simple task
|
||||||
|
notice the sunflowers +sunflowers @outside @garden +shared +landscape
|
||||||
|
(B) smell the +roses flower @outside @outdoor +shared
|
||||||
|
(C) 2012-02-28 @outside mow the lawn
|
||||||
|
x 2012-02-21 +herbs @oriental buy spices
|
||||||
|
x 2012-02-28 2012-02-21 +slack @home watch tv
|
||||||
|
2012-02-28 +herbs buy cinnamon @grocer
|
||||||
|
EOF
|
||||||
|
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 '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 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 'remove add date' 'todo.sh list 7' '"7 # buy cinnamon"'
|
||||||
|
|
||||||
|
test_done
|
||||||
21
tests/t6040-completion-files.sh
Executable file
21
tests/t6040-completion-files.sh
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash todo file completion functionality
|
||||||
|
|
||||||
|
This test checks todo_completion of files in TODO_DIR.
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
> dummy.txt
|
||||||
|
readonly FILES='done.txt dummy.txt report.txt todo.txt'
|
||||||
|
test_todo_completion 'all files after addto' 'todo.sh addto ' "$FILES"
|
||||||
|
test_todo_completion 'files beginning with d after addto' 'todo.sh addto d' 'done.txt dummy.txt'
|
||||||
|
test_todo_completion 'all files after listfile' 'todo.sh listfile ' "$FILES"
|
||||||
|
test_todo_completion 'all files after lf' 'todo.sh -v lf ' "$FILES"
|
||||||
|
test_todo_completion 'nothing after move' 'todo.sh move ' ''
|
||||||
|
test_todo_completion 'all files after move ITEM#' 'todo.sh move 1 ' "$FILES"
|
||||||
|
test_todo_completion 'all files after mv ITEM#' 'todo.sh mv 1 ' "$FILES"
|
||||||
|
test_todo_completion 'all files after move ITEM# DEST' 'todo.sh move 1 todo.sh ' "$FILES"
|
||||||
|
|
||||||
|
test_done
|
||||||
92
tests/t6050-completion-addons.sh
Executable file
92
tests/t6050-completion-addons.sh
Executable file
@@ -0,0 +1,92 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash add-on action completion functionality
|
||||||
|
|
||||||
|
This test checks todo_completion of custom actions in .todo.actions.d
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
readonly ACTIONS='add a addto addm append app archive command del rm depri dp do help list ls listaddons listall lsa listcon lsc listfile lf listpri lsp listproj lsprj move mv prepend prep pri p replace report shorthelp'
|
||||||
|
readonly OPTIONS='-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x'
|
||||||
|
|
||||||
|
readonly ADDONS='bar baz foobar'
|
||||||
|
|
||||||
|
readonly CONTAINED='xeno zoolander'
|
||||||
|
makeCustomActions()
|
||||||
|
{
|
||||||
|
set -e
|
||||||
|
mkdir "${1:?}"
|
||||||
|
for addon in $ADDONS
|
||||||
|
do
|
||||||
|
addonFile="${1}/$addon"
|
||||||
|
> "$addonFile"
|
||||||
|
chmod +x "$addonFile"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Also create a subdirectory, to test that it is skipped.
|
||||||
|
mkdir "${1}/subdir"
|
||||||
|
|
||||||
|
# Also create a non-executable file, to test that it is skipped.
|
||||||
|
datafile="${1:?}/datafile"
|
||||||
|
> "$datafile"
|
||||||
|
chmod -x "$datafile"
|
||||||
|
[ -x "$datafile" ] && rm "$datafile" # Some file systems may always make files executable; then, skip this check.
|
||||||
|
|
||||||
|
# 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
|
||||||
|
}
|
||||||
|
removeCustomActions()
|
||||||
|
{
|
||||||
|
set -e
|
||||||
|
rmdir "${1}/subdir"
|
||||||
|
|
||||||
|
for contained in $CONTAINED
|
||||||
|
do
|
||||||
|
rm "${1}/$contained/$contained"
|
||||||
|
rmdir "${1}/$contained"
|
||||||
|
done
|
||||||
|
|
||||||
|
rm "${1:?}/"*
|
||||||
|
rmdir "$1"
|
||||||
|
set +e
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test resolution of the default TODO_ACTIONS_DIR.
|
||||||
|
#
|
||||||
|
makeCustomActions "$HOME/.todo.actions.d"
|
||||||
|
test_todo_completion 'all arguments' 'todo.sh ' "$ACTIONS $ADDONS $CONTAINED $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 f after options' 'todo.sh -a -v f' 'foobar'
|
||||||
|
test_todo_completion 'nothing after addon action' 'todo.sh foobar ' ''
|
||||||
|
removeCustomActions "$HOME/.todo.actions.d"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test resolution of an alternative TODO_ACTIONS_DIR.
|
||||||
|
#
|
||||||
|
mkdir "$HOME/.todo"
|
||||||
|
makeCustomActions "$HOME/.todo/actions"
|
||||||
|
test_todo_completion 'all arguments with actions from .todo/actions/' 'todo.sh ' "$ACTIONS $ADDONS $CONTAINED $OPTIONS"
|
||||||
|
removeCustomActions "$HOME/.todo/actions"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test resolution of a configured TODO_ACTIONS_DIR.
|
||||||
|
#
|
||||||
|
makeCustomActions "$HOME/addons"
|
||||||
|
cat >> todo.cfg <<'EOF'
|
||||||
|
export TODO_ACTIONS_DIR="$HOME/addons"
|
||||||
|
EOF
|
||||||
|
test_todo_completion 'all arguments with actions from addons/' 'todo.sh ' "$ACTIONS $ADDONS $CONTAINED $OPTIONS"
|
||||||
|
removeCustomActions "$HOME/addons"
|
||||||
|
|
||||||
|
test_done
|
||||||
45
tests/t6080-completion-path.sh
Executable file
45
tests/t6080-completion-path.sh
Executable file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash completion with different path functionality
|
||||||
|
|
||||||
|
This test checks that todo_completion can use a different path to todo.sh when
|
||||||
|
it is not accessible through PATH.
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
(B) smell the +roses @outside @outdoor +shared
|
||||||
|
notice the sunflowers +sunflowers @outside @garden +shared +landscape
|
||||||
|
stop
|
||||||
|
EOF
|
||||||
|
|
||||||
|
mv bin/todo.sh bin/todo2.sh
|
||||||
|
test_expect_success 'todo2.sh executable' 'todo2.sh list'
|
||||||
|
|
||||||
|
# Define a second completion function that injects the different executable. In
|
||||||
|
# real use, this would be installed via
|
||||||
|
# complete -F _todo2 todo2.sh
|
||||||
|
_todo2()
|
||||||
|
{
|
||||||
|
local _todo_sh='todo2.sh'
|
||||||
|
_todo "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
# executable must be launched with an explicit path.
|
||||||
|
PATH=${PATH##"${PWD}/bin:"}
|
||||||
|
test_expect_code 127 'todo2.sh executable not in PATH' 'todo2.sh'
|
||||||
|
|
||||||
|
_todo2path()
|
||||||
|
{
|
||||||
|
local _todo_sh='./bin/todo2.sh'
|
||||||
|
_todo "$@"
|
||||||
|
}
|
||||||
|
test_todo_custom_completion _todo2path 'all todo2 contexts' 'todo2 list @' '@garden @outdoor @outside'
|
||||||
|
|
||||||
|
test_done
|
||||||
62
tests/t6090-completion-aliases.sh
Executable file
62
tests/t6090-completion-aliases.sh
Executable file
@@ -0,0 +1,62 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash completion with different aliases functionality
|
||||||
|
|
||||||
|
This test checks that todo_completion can use a different configuration
|
||||||
|
when another todo.sh alias is defined that uses that configuration.
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
(B) smell the +roses @outside @outdoor +shared
|
||||||
|
notice the sunflowers +sunflowers @outside @garden +shared +landscape
|
||||||
|
stop
|
||||||
|
EOF
|
||||||
|
cat > todo2.txt <<EOF
|
||||||
|
+herbs @oriental buy spices
|
||||||
|
+slack @home watch tv
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cp todo.cfg todo2.cfg
|
||||||
|
cat >> todo2.cfg <<'EOF'
|
||||||
|
export TODO_FILE="$TODO_DIR/todo2.txt"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Note: We cannot use aliases within the test framework, but functions are
|
||||||
|
# equivalent and work fine.
|
||||||
|
todo1()
|
||||||
|
{
|
||||||
|
todo.sh "$@"
|
||||||
|
}
|
||||||
|
todo2()
|
||||||
|
{
|
||||||
|
todo.sh -d "$HOME/todo2.cfg" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure that the test fixture works as planned.
|
||||||
|
test_todo_session 'todo 1 and 2 contexts' <<EOF
|
||||||
|
>>> todo1 listcon
|
||||||
|
@garden
|
||||||
|
@outdoor
|
||||||
|
@outside
|
||||||
|
|
||||||
|
>>> todo2 listcon
|
||||||
|
@home
|
||||||
|
@oriental
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
# Define a second completion function that injects the different configuration
|
||||||
|
# file. In real use, this would be installed via
|
||||||
|
# complete -F _todo2 todo2
|
||||||
|
_todo2()
|
||||||
|
{
|
||||||
|
local _todo_sh='todo.sh -d "$HOME/todo2.cfg"'
|
||||||
|
_todo "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_todo_completion 'all todo1 contexts' 'todo1 list @' '@garden @outdoor @outside'
|
||||||
|
test_todo_custom_completion _todo2 'all todo2 contexts' 'todo2 list @' '@home @oriental'
|
||||||
|
|
||||||
|
test_done
|
||||||
20
tests/t6100-completion-help.sh
Executable file
20
tests/t6100-completion-help.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='Bash help completion functionality
|
||||||
|
|
||||||
|
This test checks todo_completion of actions for usage help.
|
||||||
|
'
|
||||||
|
. ./actions-test-lib.sh
|
||||||
|
. ./test-lib.sh
|
||||||
|
make_action "zany"
|
||||||
|
make_action "aardvark"
|
||||||
|
|
||||||
|
readonly ACTIONS='add a addto addm append app archive command del rm depri dp do help list ls listaddons listall lsa listcon lsc listfile lf listpri lsp listproj lsprj move mv prepend prep pri p replace report shorthelp'
|
||||||
|
readonly ADDONS='aardvark zany'
|
||||||
|
|
||||||
|
test_todo_completion 'all actions after help' 'todo.sh help ' "$ACTIONS $ADDONS"
|
||||||
|
test_todo_completion 'all actions after command help' 'todo.sh command help ' "$ACTIONS $ADDONS"
|
||||||
|
test_todo_completion 'actions beginning with a' 'todo.sh help a' 'add a addto addm append app archive aardvark'
|
||||||
|
|
||||||
|
test_done
|
||||||
@@ -1,22 +1,12 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='custom actions functionality
|
test_description='custom actions functionality
|
||||||
|
|
||||||
This test covers the contract between todo.sh and custom actions.
|
This test covers the contract between todo.sh and custom actions.
|
||||||
'
|
'
|
||||||
|
. ./actions-test-lib.sh
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
unset TODO_ACTIONS_DIR
|
|
||||||
mkdir .todo.actions.d
|
|
||||||
make_action()
|
|
||||||
{
|
|
||||||
cat > ".todo.actions.d/$1" <<- EOF
|
|
||||||
#!/bin/bash
|
|
||||||
echo "custom action $1"
|
|
||||||
EOF
|
|
||||||
chmod +x ".todo.actions.d/$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
make_action "foo"
|
make_action "foo"
|
||||||
test_todo_session 'executable action' <<EOF
|
test_todo_session 'executable action' <<EOF
|
||||||
>>> todo.sh foo
|
>>> todo.sh foo
|
||||||
|
|||||||
84
tests/t8010-listaddons.sh
Executable file
84
tests/t8010-listaddons.sh
Executable file
@@ -0,0 +1,84 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
test_description='listaddons functionality
|
||||||
|
|
||||||
|
This test checks listing of custom actions.
|
||||||
|
'
|
||||||
|
. ./actions-test-lib.sh
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_todo_session 'no custom actions' <<EOF
|
||||||
|
>>> todo.sh listaddons
|
||||||
|
EOF
|
||||||
|
|
||||||
|
make_action "foo"
|
||||||
|
test_todo_session 'one custom action' <<EOF
|
||||||
|
>>> todo.sh listaddons
|
||||||
|
foo
|
||||||
|
EOF
|
||||||
|
|
||||||
|
make_action "bar"
|
||||||
|
make_action "ls"
|
||||||
|
make_action "quux"
|
||||||
|
test_todo_session 'multiple custom actions' <<EOF
|
||||||
|
>>> todo.sh listaddons
|
||||||
|
bar
|
||||||
|
foo
|
||||||
|
ls
|
||||||
|
quux
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod -x .todo.actions.d/foo
|
||||||
|
# On Cygwin, clearing the executable flag may have no effect, as the Windows ACL
|
||||||
|
# may still grant execution rights. In this case, we skip the test.
|
||||||
|
if [ -x .todo.actions.d/foo ]; then
|
||||||
|
SKIP_TESTS="${SKIP_TESTS}${SKIP_TESTS+ }t8010.4"
|
||||||
|
fi
|
||||||
|
test_todo_session 'nonexecutable action' <<EOF
|
||||||
|
>>> todo.sh listaddons
|
||||||
|
bar
|
||||||
|
ls
|
||||||
|
quux
|
||||||
|
EOF
|
||||||
|
|
||||||
|
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
|
||||||
76
tests/t8020-actions-help.sh
Executable file
76
tests/t8020-actions-help.sh
Executable file
@@ -0,0 +1,76 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
test_description='custom actions help functionality
|
||||||
|
|
||||||
|
This test checks listing the usage help of a custom action.
|
||||||
|
'
|
||||||
|
. ./actions-test-lib.sh
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_todo_session 'custom action help with no custom action directory' <<'EOF'
|
||||||
|
>>> todo.sh help foo
|
||||||
|
TODO: No action "foo" exists.
|
||||||
|
=== 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
make_action "foo"
|
||||||
|
make_action "bar"
|
||||||
|
make_action "ls"
|
||||||
|
make_action "quux"
|
||||||
|
|
||||||
|
test_todo_session 'custom action help' <<'EOF'
|
||||||
|
>>> todo.sh help foo
|
||||||
|
foo ITEM#[, ITEM#, ...] [TERM...]
|
||||||
|
This custom action does foo.
|
||||||
|
\
|
||||||
|
|
||||||
|
>>> todo.sh help bar
|
||||||
|
bar ITEM#[, ITEM#, ...] [TERM...]
|
||||||
|
This custom action does bar.
|
||||||
|
\
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'multiple custom actions help' <<'EOF'
|
||||||
|
>>> todo.sh help foo bar
|
||||||
|
foo ITEM#[, ITEM#, ...] [TERM...]
|
||||||
|
This custom action does foo.
|
||||||
|
\
|
||||||
|
bar ITEM#[, ITEM#, ...] [TERM...]
|
||||||
|
This custom action does bar.
|
||||||
|
\
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'nonexisting action help' <<'EOF'
|
||||||
|
>>> todo.sh help doesnotexist
|
||||||
|
TODO: No action "doesnotexist" exists.
|
||||||
|
=== 1
|
||||||
|
|
||||||
|
>>> todo.sh help foo doesnotexist bar
|
||||||
|
foo ITEM#[, ITEM#, ...] [TERM...]
|
||||||
|
This custom action does foo.
|
||||||
|
\
|
||||||
|
TODO: No action "doesnotexist" exists.
|
||||||
|
=== 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'mixed built-in and custom actions help' <<'EOF'
|
||||||
|
>>> todo.sh help foo shorthelp bar
|
||||||
|
foo ITEM#[, ITEM#, ...] [TERM...]
|
||||||
|
This custom action does foo.
|
||||||
|
\
|
||||||
|
shorthelp
|
||||||
|
List the one-line usage of all built-in and add-on actions.
|
||||||
|
\
|
||||||
|
bar ITEM#[, ITEM#, ...] [TERM...]
|
||||||
|
This custom action does bar.
|
||||||
|
\
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'custom override of built-in action help' <<'EOF'
|
||||||
|
>>> todo.sh help ls
|
||||||
|
ls ITEM#[, ITEM#, ...] [TERM...]
|
||||||
|
This custom action does ls.
|
||||||
|
\
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='basic tests imported from previous framework
|
test_description='basic tests imported from previous framework
|
||||||
'
|
'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2005 Junio C Hamano
|
# Copyright (c) 2005 Junio C Hamano
|
||||||
#
|
#
|
||||||
@@ -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
|
||||||
|
if [ "$1" = 0 ]; then
|
||||||
|
say >&3 "expecting success and output: $3"
|
||||||
|
else
|
||||||
say >&3 "expecting exit code $1 and output: $3"
|
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
|
||||||
@@ -305,7 +291,7 @@ $cmp_output"
|
|||||||
else
|
else
|
||||||
cmp_output=$(test_cmp expect output)
|
cmp_output=$(test_cmp expect output)
|
||||||
test_failure_ "$2" "$3" "
|
test_failure_ "$2" "$3" "
|
||||||
* expected exit code $1, actual ${eval_ret}${cmp_output:+
|
expected exit code $1, actual ${eval_ret}${cmp_output:+
|
||||||
}${cmp_output}"
|
}${cmp_output}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -324,7 +310,7 @@ test_expect_code () {
|
|||||||
test_ok_ "$2"
|
test_ok_ "$2"
|
||||||
else
|
else
|
||||||
test_failure_ "$2" "$3" "
|
test_failure_ "$2" "$3" "
|
||||||
* expected exit code $1, actual ${eval_ret}"
|
expected exit code $1, actual ${eval_ret}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
echo >&3 ""
|
echo >&3 ""
|
||||||
@@ -566,14 +552,16 @@ test_tick () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Generate and run a series of tests based on a transcript.
|
# Generate and run a series of tests based on a transcript.
|
||||||
# Usage: test_todo_session "description" <<EOF
|
# Usage: test_todo_session "description" <<'EOF'
|
||||||
# >>> command
|
# >>> command
|
||||||
# output1
|
# output1
|
||||||
# output2
|
# output2
|
||||||
|
#
|
||||||
# >>> command
|
# >>> command
|
||||||
# === exit status
|
# === exit status
|
||||||
# output3
|
# output3 with empty line (must be escaped here)
|
||||||
# output4
|
# \
|
||||||
|
# output5
|
||||||
# EOF
|
# EOF
|
||||||
test_todo_session () {
|
test_todo_session () {
|
||||||
test "$#" = 1 ||
|
test "$#" = 1 ||
|
||||||
@@ -582,7 +570,7 @@ test_todo_session () {
|
|||||||
cmd=""
|
cmd=""
|
||||||
status=0
|
status=0
|
||||||
> expect
|
> expect
|
||||||
while read -r line
|
while IFS= read -r line
|
||||||
do
|
do
|
||||||
case $line in
|
case $line in
|
||||||
">>> "*)
|
">>> "*)
|
||||||
@@ -606,6 +594,9 @@ test_todo_session () {
|
|||||||
> expect
|
> expect
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
\\)
|
||||||
|
echo "" >> expect
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "$line" >> expect
|
echo "$line" >> expect
|
||||||
;;
|
;;
|
||||||
@@ -632,6 +623,66 @@ EOF
|
|||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_todo_custom_completion () {
|
||||||
|
test "$#" = 4 ||
|
||||||
|
error "bug in the test script: not 4 parameters to test_todo_custom_completion"
|
||||||
|
completeFunc=$1
|
||||||
|
shift
|
||||||
|
if ! test_skip "$@"
|
||||||
|
then
|
||||||
|
description=$1
|
||||||
|
expected=$3
|
||||||
|
|
||||||
|
if [ "${2: -1}" = ' ' ]
|
||||||
|
then
|
||||||
|
offset=0
|
||||||
|
say >&3 "expecting completions after: '$2'"
|
||||||
|
else
|
||||||
|
offset=1
|
||||||
|
say >&3 "expecting context completions for: '$2'"
|
||||||
|
fi
|
||||||
|
|
||||||
|
SAVEIFS=$IFS
|
||||||
|
IFS=' ' set -- $2
|
||||||
|
COMP_WORDS=("$@")
|
||||||
|
COMP_CWORD=$(($# - $offset))
|
||||||
|
IFS=' ' eval "set -- $expected"
|
||||||
|
EXPECT=("$@")
|
||||||
|
|
||||||
|
source "$TEST_DIRECTORY/../todo_completion"
|
||||||
|
$completeFunc
|
||||||
|
ret=$?
|
||||||
|
if [ "$ret" = 0 ]
|
||||||
|
then
|
||||||
|
IFS=$'\n'
|
||||||
|
printf "%s${EXPECT:+\\n}" "${EXPECT[*]}" > expect
|
||||||
|
printf "%s${COMPREPLY:+\\n}" "${COMPREPLY[*]}" > compreply
|
||||||
|
IFS=$SAVEIFS
|
||||||
|
|
||||||
|
if [ ${#COMPREPLY[@]} -eq ${#EXPECT[@]} ]
|
||||||
|
then
|
||||||
|
if [ "${COMPREPLY[*]}" = "${EXPECT[*]}" ]
|
||||||
|
then
|
||||||
|
test_ok_ "$description"
|
||||||
|
else
|
||||||
|
test_failure_ "$description" "$(test_cmp expect compreply)"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
test_failure_ "$description" "expected ${#EXPECT[@]} completion(s), got ${#COMPREPLY[@]}:
|
||||||
|
$(test_cmp expect compreply)"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
test_failure_ "$description" "expected completions, actual exit code $ret"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo >&3 ""
|
||||||
|
}
|
||||||
|
test_todo_completion () {
|
||||||
|
test "$#" = 3 ||
|
||||||
|
error "bug in the test script: not 3 parameters to test_todo_completion"
|
||||||
|
test_todo_custom_completion _todo "$@"
|
||||||
|
}
|
||||||
|
|
||||||
test_init_todo "$test"
|
test_init_todo "$test"
|
||||||
# Use -P to resolve symlinks in our working directory so that the pwd
|
# Use -P to resolve symlinks in our working directory so that the pwd
|
||||||
# in subprocesses equals our $PWD (for pathname comparisons).
|
# in subprocesses equals our $PWD (for pathname comparisons).
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
test_description='Providing an interactive shell in the proper environment'
|
test_description='Providing an interactive shell in the proper environment'
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|||||||
14
todo.cfg
14
todo.cfg
@@ -1,14 +1,13 @@
|
|||||||
# === 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=$(dirname "$0")
|
||||||
|
|
||||||
# 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"
|
||||||
export DONE_FILE="$TODO_DIR/done.txt"
|
export DONE_FILE="$TODO_DIR/done.txt"
|
||||||
export REPORT_FILE="$TODO_DIR/report.txt"
|
export REPORT_FILE="$TODO_DIR/report.txt"
|
||||||
export TMP_FILE="$TODO_DIR/todo.tmp"
|
|
||||||
|
|
||||||
# You can customize your actions directory location
|
# You can customize your actions directory location
|
||||||
#export TODO_ACTIONS_DIR="$HOME/.todo.actions.d"
|
#export TODO_ACTIONS_DIR="$HOME/.todo.actions.d"
|
||||||
@@ -63,6 +62,15 @@ export TMP_FILE="$TODO_DIR/todo.tmp"
|
|||||||
#
|
#
|
||||||
# export COLOR_DONE=$LIGHT_GREY
|
# export COLOR_DONE=$LIGHT_GREY
|
||||||
|
|
||||||
|
# There is highlighting for projects and contexts.
|
||||||
|
#
|
||||||
|
# export COLOR_PROJECT=$RED
|
||||||
|
# export COLOR_CONTEXT=$RED
|
||||||
|
|
||||||
|
# ... 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
|
||||||
|
|||||||
66
todo_completion
Normal file → Executable file
66
todo_completion
Normal file → Executable file
@@ -11,32 +11,42 @@ _todo()
|
|||||||
local -r OPTS="-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x"
|
local -r OPTS="-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x"
|
||||||
local -r COMMANDS="\
|
local -r COMMANDS="\
|
||||||
add a addto addm append app archive command del \
|
add a addto addm append app archive command del \
|
||||||
rm depri dp do help list ls listall lsa listcon \
|
rm depri dp do help list ls listaddons listall lsa listcon \
|
||||||
lsc listfile lf listpri lsp listproj lsprj move \
|
lsc listfile lf listpri lsp listproj lsprj move \
|
||||||
mv prepend prep pri p replace report shorthelp"
|
mv prepend prep pri p replace report shorthelp"
|
||||||
|
local -r MOVE_COMMAND_PATTERN='^(move|mv)$'
|
||||||
|
|
||||||
# Add custom commands from add-ons, if installed.
|
local _todo_sh=${_todo_sh:-todo.sh}
|
||||||
# TODO: Filter for executable flag of files found in $TODO_ACTIONS_DIR.
|
|
||||||
local allCommands="$COMMANDS $('ls' "${TODO_ACTIONS_DIR:-$HOME/.todo.actions.d}/" 2>/dev/null)"
|
|
||||||
|
|
||||||
local completions
|
local completions
|
||||||
if [ $COMP_CWORD -eq 1 ]; then
|
if [ $COMP_CWORD -eq 1 ]; then
|
||||||
completions="$allCommands $OPTS"
|
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 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 || \
|
||||||
"${COMP_WORDS[COMP_CWORD-3]}" =~ ^(move|mv)$ ) ]]; then
|
"${COMP_WORDS[COMP_CWORD-3]}" =~ $MOVE_COMMAND_PATTERN ) ]]; 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=$(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)
|
||||||
|
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null)";;
|
||||||
addto|listfile|lf)
|
addto|listfile|lf)
|
||||||
completions=$(TODOTXT_VERBOSE=0 todo.sh command listfile);;
|
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile 2>/dev/null);;
|
||||||
-*) completions="$allCommands $OPTS";;
|
-*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null) $OPTS";;
|
||||||
*) case "$cur" in
|
*) case "$cur" in
|
||||||
+*) completions=$(TODOTXT_VERBOSE=0 todo.sh command listproj);;
|
+*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj 2>/dev/null)
|
||||||
@*) completions=$(TODOTXT_VERBOSE=0 todo.sh command listcon);;
|
COMPREPLY=( $( compgen -W "$completions" -- $cur ))
|
||||||
|
[ ${#COMPREPLY[@]} -gt 0 ] && return 0
|
||||||
|
# Fall back to projects extracted from done tasks.
|
||||||
|
completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listproj 2>/dev/null)
|
||||||
|
;;
|
||||||
|
@*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listcon 2>/dev/null)
|
||||||
|
COMPREPLY=( $( compgen -W "$completions" -- $cur ))
|
||||||
|
[ ${#COMPREPLY[@]} -gt 0 ] && return 0
|
||||||
|
# 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
|
*) if [[ "$cur" =~ ^[0-9]+$ ]]; then
|
||||||
# Remove the (padded) task number; we prepend the
|
# Remove the (padded) task number; we prepend the
|
||||||
# user-provided $cur instead.
|
# user-provided $cur instead.
|
||||||
@@ -50,9 +60,9 @@ _todo()
|
|||||||
# Finally, limit the output to a single line just as
|
# Finally, limit the output to a single line just as
|
||||||
# a safety check of the ls action output.
|
# a safety check of the ls action output.
|
||||||
local todo=$( \
|
local todo=$( \
|
||||||
TODOTXT_VERBOSE=0 todo.sh -@ -+ -p -x command ls "^ *${cur} " | \
|
eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' 2>/dev/null | \
|
||||||
sed -e 's/^ *[0-9]\+ //' -e 's/\((.) \)[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/' \
|
sed -e 's/^ *[0-9]\{1,\} //' -e 's/^\((.) \)\{0,1\}[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/' \
|
||||||
-e 's/\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/' \
|
-e 's/^\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/' \
|
||||||
-e 's/[[:space:]]*$//' \
|
-e 's/[[:space:]]*$//' \
|
||||||
-e '1q' \
|
-e '1q' \
|
||||||
)
|
)
|
||||||
@@ -74,6 +84,30 @@ _todo()
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
complete -F _todo todo.sh
|
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
|
||||||
|
# PATH, you need to add and use a wrapper completion function, like this:
|
||||||
|
#_todoElsewhere()
|
||||||
|
#{
|
||||||
|
# local _todo_sh='/path/to/todo2.sh'
|
||||||
|
# _todo "$@"
|
||||||
|
#}
|
||||||
|
#complete -F _todoElsewhere /path/to/todo2.sh
|
||||||
|
|
||||||
|
# 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
|
||||||
|
# from the actual configured task locations:
|
||||||
|
#alias todo2='todo.sh -d "$HOME/todo2.cfg"'
|
||||||
|
#_todo2()
|
||||||
|
#{
|
||||||
|
# local _todo_sh='todo.sh -d "$HOME/todo2.cfg"'
|
||||||
|
# _todo "$@"
|
||||||
|
#}
|
||||||
|
#complete -F _todo2 todo2
|
||||||
|
|||||||
Reference in New Issue
Block a user