Compare commits
79 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9e65d3602e | |||
|
|
9623f77af8 | ||
|
|
a916aa97df | ||
|
|
b00c212fcc | ||
|
|
c2b3d01024 | ||
|
|
26a82c3c2f | ||
|
|
75dc8cdaed | ||
|
|
a6d69811d4 | ||
|
|
401653fc75 | ||
|
|
ca444e4000 | ||
|
|
3a369110d6 | ||
|
|
afdc68fc67 | ||
|
|
e6d80bac04 | ||
|
|
fd753c6c2e | ||
|
|
ea17510e4e | ||
|
|
c8fa5f1ebc | ||
|
|
aa38153586 | ||
|
|
b10904bb20 | ||
|
|
ef5b71496d | ||
|
|
884b5deb6e | ||
|
|
2937a8b316 | ||
|
|
ef419f3594 | ||
|
|
803881998f | ||
|
|
4cd6822946 | ||
|
|
466265175b | ||
|
|
bab2af9501 | ||
|
|
1a5600c79c | ||
|
|
b25c791af7 | ||
|
|
28523851d0 | ||
|
|
491979b76a | ||
|
|
bf001cef6b | ||
|
|
aef7d8b9e5 | ||
|
|
273c465af0 | ||
|
|
7a4da60374 | ||
|
|
ea32af34e6 | ||
|
|
d0075e4d57 | ||
|
|
bd88c20cab | ||
|
|
e1c1c328a2 | ||
|
|
1185ab1d5e | ||
|
|
7792006853 | ||
|
|
2d70a0aadf | ||
|
|
ee94a3fac5 | ||
|
|
587833bb4e | ||
|
|
eb7feaefb5 | ||
|
|
7501d37b45 | ||
|
|
6ea2b5ae6d | ||
|
|
353db49814 | ||
|
|
f884f73297 | ||
|
|
e4103a8e23 | ||
|
|
77c1f34609 | ||
|
|
71b3991daf | ||
|
|
6188785e48 | ||
|
|
797604e2b6 | ||
|
|
7bac9d861b | ||
|
|
ae1f241887 | ||
|
|
7f3ad0d361 | ||
|
|
ce38bea819 | ||
|
|
da45b0f637 | ||
|
|
ddc560c6b9 | ||
|
|
bf1bf1ae84 | ||
|
|
177432ec94 | ||
|
|
abdbe5371c | ||
|
|
1378c97d80 | ||
|
|
3d308a6f79 | ||
|
|
c6d290b5fb | ||
|
|
355166da67 | ||
|
|
20317b6321 | ||
|
|
861ad5ec41 | ||
|
|
13b451b81d | ||
|
|
34d31ef45a | ||
|
|
8901db8bdd | ||
|
|
c9540122e6 | ||
|
|
19dde076cf | ||
|
|
3bc3616651 | ||
|
|
d589fd0570 | ||
|
|
7a30199fe0 | ||
|
|
867ade5701 | ||
|
|
14f5de1579 | ||
|
|
7ec2a1263e |
2
CONTRIBUTING.md → .github/CONTRIBUTING.md
vendored
2
CONTRIBUTING.md → .github/CONTRIBUTING.md
vendored
@@ -93,5 +93,5 @@ The core team looks at Pull Requests on a regular basis. After feedback has been
|
||||
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
|
||||
[Code of Conduct]: ./CODE_OF_CONDUCT.md
|
||||
[Gitter.im]: https://gitter.im/todotxt/
|
||||
@@ -3,7 +3,7 @@
|
||||
- [ ] 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/).
|
||||
- [ ] Lint your code with [ShellCheck](https://www.shellcheck.net/).
|
||||
- [ ] Include a human-readable description of what the pull request is trying to accomplish.
|
||||
- [ ] Steps for the reviewer(s) on how they can manually QA the changes.
|
||||
- [ ] Have a `fixes #XX` reference to the issue that this pull request fixes.
|
||||
6
.github/dependabot.yml
vendored
Normal file
6
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: github-actions
|
||||
directory: /
|
||||
schedule:
|
||||
interval: weekly
|
||||
21
.github/workflows/tests.yml
vendored
Normal file
21
.github/workflows/tests.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
workflow_dispatch: # Allows you to run this workflow manually from the Actions tab
|
||||
|
||||
jobs:
|
||||
test:
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [ubuntu-24.04, macos-14]
|
||||
runs-on: ${{ matrix.platform }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- run: make
|
||||
- run: make dist
|
||||
- run: make test
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
# Note: "shell" would be more appropriate
|
||||
language: python
|
||||
|
||||
install: make dist && sudo make install
|
||||
|
||||
script: make test
|
||||
187
CHANGELOG.md
187
CHANGELOG.md
@@ -1,4 +1,5 @@
|
||||
# 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/)
|
||||
@@ -6,14 +7,38 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
|
||||
## [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])
|
||||
## [2.12.0] - 2020-08-11
|
||||
|
||||
### Added
|
||||
|
||||
- Added default priority variable `TODOTXT_PRIORITY_ON_ADD` ([#246])
|
||||
- Added `done` option as alias of `do` ([#169])
|
||||
- Added macOS 10.15.x support ([#300])
|
||||
- Highlighting of dates, metadata and item numbers ([#264])
|
||||
- Minimal config file / default filenames (todo.txt, done.txt, report.txt) ([#289])
|
||||
- Enable file completion for add-on actions via `_todo_file{1,2,3}_actions` ([#270])
|
||||
- Allow to customize what can be before / inside / after `+project` and `@context` ([#271])
|
||||
|
||||
### Changed
|
||||
|
||||
- Read the task's name and uses as default ([#249])
|
||||
- Updated interpreter reference to use environment variable ([#160])
|
||||
- Allow setting of bash completion path ([#301])
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fixed no end-of-line bug. Supports todos with no end-of-line. ([#295])
|
||||
|
||||
## [2.11.0] - 2018-03-26
|
||||
|
||||
### Added
|
||||
|
||||
- Added support for `$XDG_CONFIG_HOME` config file/actions location
|
||||
- Created [CODE_OF_CONDUCT.md](.github/CODE_OF_CONDUCT.md) ([#217])
|
||||
- Created [CHANGELOG.md](/CHANGELOG.md) ([#218])
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated `add` command to accept lowercase priority ([#230])
|
||||
- Clean tests and version file in Makefile. Don't ignore errors in tests.
|
||||
- Updated [README.md](/README.md) ([#219])
|
||||
@@ -21,12 +46,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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.
|
||||
@@ -39,30 +66,37 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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.
|
||||
@@ -70,6 +104,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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
|
||||
@@ -80,6 +115,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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`)
|
||||
@@ -87,31 +123,37 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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*
|
||||
- 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.
|
||||
- Faster help/usage document outputs.
|
||||
- Consolidated `TODOTXT_VERBOSE` tests.
|
||||
- Refactored various add functionality to one function.
|
||||
- Updated `_list()` output to match updated `addto`.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Quoting regexp to parse properly.
|
||||
- Fixed erroneous hide/show comments.
|
||||
- Correctly fixed regexp quoting issue for bash v3.1.x and v3.2.x.
|
||||
@@ -120,7 +162,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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
|
||||
@@ -130,42 +174,49 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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 `[ ~-]`.
|
||||
- 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 ."`
|
||||
- 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
|
||||
@@ -174,34 +225,40 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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.
|
||||
@@ -212,76 +269,92 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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
|
||||
@@ -289,89 +362,107 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
- 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"
|
||||
|
||||
- `list` is case insensitive. ie, `todo list Mac` will match lines with "mac" and "Mac"
|
||||
|
||||
### Changed
|
||||
|
||||
- `todo list` matches multiple [TERM]s. ie, `todo list mac offline` will match all lines that contain the words "mac" and "offline"
|
||||
- `repri` and `pri` actions combined into `pri` action (Thanks Mike!)
|
||||
- Quotes no longer required with `add` and `replace` (Thanks Karl!)
|
||||
- Any priority added to a todo must be uppercase to preserve sort order, enforced now. ie `todo pri 1 a` will return a usage error.
|
||||
|
||||
### Fixed
|
||||
|
||||
- File "sanity checks" and cleanup function, test script and various fantastic stylistic improvements added. Extra big thanks to Karl!
|
||||
|
||||
|
||||
## [1.1.0] - 2006-05-12
|
||||
|
||||
### Added
|
||||
|
||||
- Supports file paths with spaces (ie `C:\Documents and Settings\gina\todo.txt`)
|
||||
|
||||
|
||||
## 1.0.0 - 2006-05-11
|
||||
|
||||
### Added
|
||||
|
||||
- Consolidated into one master script with usage notes and released.
|
||||
|
||||
|
||||
[Unreleased]: https://github.com/todotxt/todo.txt-cli/compare/v2.11.0...HEAD
|
||||
[Unreleased]: https://github.com/todotxt/todo.txt-cli/compare/v2.12.0...HEAD
|
||||
[2.12.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.11.0...v2.12.0
|
||||
[2.11.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.10.0...v2.11.0
|
||||
[2.10.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.9.0...v2.10.0
|
||||
[2.9.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.8.0...v2.9.0
|
||||
@@ -400,11 +491,21 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.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
|
||||
[#156]: https://github.com/todotxt/todo.txt-cli/pull/156
|
||||
[#160]: https://github.com/todotxt/todo.txt-cli/pull/160
|
||||
[#169]: https://github.com/todotxt/todo.txt-cli/pull/169
|
||||
[#217]: https://github.com/todotxt/todo.txt-cli/pull/217
|
||||
[#218]: https://github.com/todotxt/todo.txt-cli/pull/218
|
||||
[#219]: https://github.com/todotxt/todo.txt-cli/pull/219
|
||||
[#228]: https://github.com/todotxt/todo.txt-cli/pull/228
|
||||
[#230]: https://github.com/todotxt/todo.txt-cli/pull/230
|
||||
[#246]: https://github.com/todotxt/todo.txt-cli/pull/246
|
||||
[#249]: https://github.com/todotxt/todo.txt-cli/pull/249
|
||||
[#264]: https://github.com/todotxt/todo.txt-cli/pull/264
|
||||
[#270]: https://github.com/todotxt/todo.txt-cli/pull/270
|
||||
[#271]: https://github.com/todotxt/todo.txt-cli/pull/271
|
||||
[#289]: https://github.com/todotxt/todo.txt-cli/pull/289
|
||||
[#295]: https://github.com/todotxt/todo.txt-cli/pull/295
|
||||
[#300]: https://github.com/todotxt/todo.txt-cli/pull/300
|
||||
[#301]: https://github.com/todotxt/todo.txt-cli/pull/301
|
||||
|
||||
@@ -34,5 +34,3 @@ test "$VN" = "$VC" || {
|
||||
echo >&2 "VERSION=$VN"
|
||||
echo "VERSION=$VN" >$VF
|
||||
}
|
||||
|
||||
|
||||
|
||||
34
Makefile
34
Makefile
@@ -10,13 +10,28 @@ INSTALL_DATA = $(INSTALL) -m 644
|
||||
|
||||
prefix = /usr/local
|
||||
|
||||
# ifdef check allows the user to pass custom dirs
|
||||
# as per the README
|
||||
|
||||
# The directory to install todo.sh in.
|
||||
bindir = $(prefix)/bin
|
||||
ifdef INSTALL_DIR
|
||||
bindir = $(INSTALL_DIR)
|
||||
else
|
||||
bindir = $(prefix)/bin
|
||||
endif
|
||||
|
||||
# The directory to install the config file in.
|
||||
sysconfdir = $(prefix)/etc
|
||||
ifdef CONFIG_DIR
|
||||
sysconfdir = $(CONFIG_DIR)
|
||||
else
|
||||
sysconfdir = $(prefix)/etc
|
||||
endif
|
||||
|
||||
datarootdir = $(prefix)/share
|
||||
ifdef BASH_COMPLETION
|
||||
datarootdir = $(BASH_COMPLETION)
|
||||
else
|
||||
datarootdir = $(prefix)/share/bash_completion.d
|
||||
endif
|
||||
|
||||
# Dynamically detect/generate version file as necessary
|
||||
# This file will define a variable called VERSION.
|
||||
@@ -37,9 +52,9 @@ dist: $(DISTFILES) todo.sh
|
||||
cp -f $(DISTFILES) $(DISTNAME)/
|
||||
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
|
||||
zip -9r $(DISTNAME).zip $(DISTNAME)/
|
||||
zip -r -9 $(DISTNAME).zip $(DISTNAME)
|
||||
rm -r $(DISTNAME)
|
||||
|
||||
.PHONY: clean
|
||||
@@ -49,22 +64,22 @@ clean: test-pre-clean
|
||||
|
||||
install: installdirs
|
||||
$(INSTALL_PROGRAM) todo.sh $(DESTDIR)$(bindir)/todo.sh
|
||||
$(INSTALL_DATA) todo_completion $(DESTDIR)$(datarootdir)/bash_completion.d/todo
|
||||
$(INSTALL_DATA) todo_completion $(DESTDIR)$(datarootdir)/todo.sh
|
||||
[ -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)$(datarootdir)/todo
|
||||
rm -f $(DESTDIR)$(sysconfdir)/todo/config
|
||||
|
||||
rmdir $(DESTDIR)$(datarootdir)/bash_completion.d
|
||||
rmdir $(DESTDIR)$(datarootdir)
|
||||
rmdir $(DESTDIR)$(sysconfdir)/todo
|
||||
|
||||
installdirs:
|
||||
mkdir -p $(DESTDIR)$(bindir) \
|
||||
$(DESTDIR)$(sysconfdir)/todo \
|
||||
$(DESTDIR)$(datarootdir)/bash_completion.d
|
||||
$(DESTDIR)$(datarootdir)
|
||||
|
||||
#
|
||||
# Testing
|
||||
@@ -86,3 +101,4 @@ test: aggregate-results
|
||||
|
||||
# Force tests to get run every time
|
||||
.PHONY: test test-pre-clean aggregate-results $(TESTS)
|
||||
|
||||
|
||||
33
README.md
33
README.md
@@ -2,7 +2,7 @@
|
||||
|
||||
> 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)
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||

|
||||
|
||||
*Read our [contributing guide](CONTRIBUTING.md) if you're looking to contribute (issues/PRs/etc).*
|
||||
*Read our [contributing guide][CONTRIBUTING] if you're looking to contribute (issues/PRs/etc).*
|
||||
|
||||
|
||||
## Installation
|
||||
@@ -23,8 +23,16 @@ Download the latest stable [release][release] for use on your desktop or server.
|
||||
|
||||
```shell
|
||||
brew install todo-txt
|
||||
|
||||
# For macOS on x86 CPU
|
||||
cp -n /usr/local/opt/todo-txt/todo.cfg ~/.todo.cfg
|
||||
|
||||
# For macOS on arm CPU
|
||||
cp -n /opt/homebrew/opt/todo-txt/todo.cfg ~/.todo.cfg
|
||||
```
|
||||
|
||||
**Note**: The `-n` flag for `cp` makes sure you do not overwrite an existing file.
|
||||
|
||||
### Linux
|
||||
|
||||
#### From command line
|
||||
@@ -38,18 +46,23 @@ 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
|
||||
- `CONFIG_DIR`: PATH for the todo.txt configuration template
|
||||
- `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
|
||||
make install CONFIG_DIR=/etc INSTALL_DIR=/usr/bin BASH_COMPLETION=/usr/share/bash-completion/completions
|
||||
```
|
||||
|
||||
#### Arch Linux (AUR)
|
||||
|
||||
https://aur.archlinux.org/packages/todotxt-git/
|
||||
https://aur.archlinux.org/packages/todotxt/
|
||||
|
||||
|
||||
## Configuration
|
||||
|
||||
No configuration is required; however, most users tweak the default settings (e.g. relocating the todo.txt directory to a subdirectory of the user's home directory, or onto a cloud drive (via the `TODO_DIR` variable)), modify the colors, add additional highlighting of projects, contexts, dates, and so on. A configuration template with a commented-out list of all available options is included.
|
||||
It is recommended to _copy_ that template into one of the locations listed by `todo.sh help` on `-d CONFIG_FILE`, even if it is installed in the global configuration location (`/etc/todo/config`).
|
||||
|
||||
## Usage
|
||||
```shell
|
||||
todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||
@@ -71,8 +84,8 @@ See [CHANGELOG.md][CHANGELOG]
|
||||
|
||||
## Support
|
||||
|
||||
- [Github Discussions](https://github.com/todotxt/todo.txt-cli/discussions)
|
||||
- [Stack Overflow](https://stackoverflow.com/questions/tagged/todotxt)
|
||||
- [Gitter chat](https://gitter.im/todotxt/todo.txt-cli)
|
||||
- [Twitter](https://twitter.com/todotxt)
|
||||
|
||||
|
||||
@@ -82,7 +95,7 @@ See [CHANGELOG.md][CHANGELOG]
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome all contributations. First read our [Contributor Code of Conduct][CODE_OF_CONDUCT] and then get started [contributing][CONTRIBUTING].
|
||||
We welcome all contributions. First read our [Contributor Code of Conduct][CODE_OF_CONDUCT] and then get started [contributing][CONTRIBUTING].
|
||||
|
||||
## License
|
||||
|
||||
@@ -91,9 +104,9 @@ GNU General Public License v3.0 © [todo.txt org][github]
|
||||
|
||||
|
||||
[release]: https://github.com/todotxt/todo.txt-cli/releases
|
||||
[website]: http://todotxt.org
|
||||
[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
|
||||
[CODE_OF_CONDUCT]: .github/CODE_OF_CONDUCT.md
|
||||
[CONTRIBUTING]: .github/CONTRIBUTING.md
|
||||
|
||||
4
USAGE.md
4
USAGE.md
@@ -104,7 +104,7 @@ todo.sh help [ACTION...]
|
||||
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...]
|
||||
@@ -221,7 +221,7 @@ Hide project names in list output. Use twice to show project names (default).
|
||||
Color mode
|
||||
|
||||
### `-d CONFIG_FILE`
|
||||
Use a configuration file other than the default `~/.todo/config`
|
||||
Use a configuration file other than one of the defaults (e.g. `~/.todo/config`)
|
||||
|
||||
### `-f`
|
||||
Forces actions without confirmation or interactive input.
|
||||
|
||||
58
tests/README
58
tests/README
@@ -42,27 +42,27 @@ You can pass --verbose (or -v), --debug (or -d), and --immediate
|
||||
appropriately before running "make".
|
||||
|
||||
--verbose::
|
||||
This makes the test more verbose. Specifically, the
|
||||
command being run and their output if any are also
|
||||
output.
|
||||
This makes the test more verbose. Specifically, the
|
||||
command being run and their output if any are also
|
||||
output.
|
||||
|
||||
--debug::
|
||||
This may help the person who is developing a new test.
|
||||
It causes the command defined with test_debug to run.
|
||||
This may help the person who is developing a new test.
|
||||
It causes the command defined with test_debug to run.
|
||||
|
||||
--immediate::
|
||||
This causes the test to immediately exit upon the first
|
||||
failed test.
|
||||
This causes the test to immediately exit upon the first
|
||||
failed test.
|
||||
|
||||
--long-tests::
|
||||
This causes additional long-running tests to be run (where
|
||||
available), for more exhaustive testing.
|
||||
This causes additional long-running tests to be run (where
|
||||
available), for more exhaustive testing.
|
||||
|
||||
--tee::
|
||||
In addition to printing the test output to the terminal,
|
||||
write it to files named 't/test-results/$TEST_NAME.out'.
|
||||
As the names depend on the tests' file names, it is safe to
|
||||
run the tests with this option in parallel.
|
||||
In addition to printing the test output to the terminal,
|
||||
write it to files named 't/test-results/$TEST_NAME.out'.
|
||||
As the names depend on the tests' file names, it is safe to
|
||||
run the tests with this option in parallel.
|
||||
|
||||
Skipping Tests
|
||||
--------------
|
||||
@@ -97,15 +97,15 @@ Naming Tests
|
||||
|
||||
The test files are named as:
|
||||
|
||||
tNNNN-commandname-details.sh
|
||||
tNNNN-commandname-details.sh
|
||||
|
||||
where N is a decimal digit.
|
||||
|
||||
First digit tells the family:
|
||||
|
||||
0 - the absolute basics and global stuff
|
||||
1 - basic every-day usage
|
||||
2 - add ins
|
||||
0 - the absolute basics and global stuff
|
||||
1 - basic every-day usage
|
||||
2 - add ins
|
||||
|
||||
Second digit tells the particular command we are testing.
|
||||
|
||||
@@ -128,15 +128,15 @@ The test script is written as a shell script. It should start
|
||||
with the standard "#!/bin/bash" with copyright notices, and an
|
||||
assignment to variable 'test_description', like this:
|
||||
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
|
||||
test_description='xxx test (option --frotz)
|
||||
test_description='xxx test (option --frotz)
|
||||
|
||||
This test registers the following structure in the cache
|
||||
and tries to run git-ls-files with option --frotz.'
|
||||
This test registers the following structure in the cache
|
||||
and tries to run git-ls-files with option --frotz.'
|
||||
|
||||
|
||||
Source 'test-lib.sh'
|
||||
@@ -145,7 +145,7 @@ Source 'test-lib.sh'
|
||||
After assigning test_description, the test script should source
|
||||
test-lib.sh like this:
|
||||
|
||||
. ./test-lib.sh
|
||||
. ./test-lib.sh
|
||||
|
||||
This test harness library does the following things:
|
||||
|
||||
@@ -219,9 +219,9 @@ library for your script to use.
|
||||
|
||||
Example:
|
||||
|
||||
test_expect_success \
|
||||
'git-write-tree should be able to write an empty tree.' \
|
||||
'tree=$(git-write-tree)'
|
||||
test_expect_success \
|
||||
'git-write-tree should be able to write an empty tree.' \
|
||||
'tree=$(git-write-tree)'
|
||||
|
||||
- test_expect_code <code> <message> <script>
|
||||
|
||||
@@ -266,7 +266,7 @@ and the dates and timestamps will be artificially fixed.
|
||||
Then the session can be used to make a unit test thanks to
|
||||
test_todo_session, see the existing tests as examples.
|
||||
|
||||
Be careful to replace all occurences of the full path to the test
|
||||
Be careful to replace all occurrences of the full path to the test
|
||||
directory by $HOME as testshell.sh will explain you when you execute it
|
||||
otherwise the tests will work properly only on your own computer.
|
||||
|
||||
|
||||
@@ -1,36 +1,48 @@
|
||||
#!/bin/bash
|
||||
|
||||
make_dummy_action()
|
||||
{
|
||||
local actionName; actionName="$(basename "${1:?}")"
|
||||
cat > "$1" <<EOF
|
||||
#!/bin/bash
|
||||
[ "\$1" = "usage" ] && {
|
||||
echo " $actionName ITEM#[, ITEM#, ...] [TERM...]"
|
||||
echo " This custom action does $actionName."
|
||||
echo ""
|
||||
exit
|
||||
}
|
||||
echo "custom action $actionName$2"
|
||||
EOF
|
||||
chmod +x "$1"
|
||||
}
|
||||
|
||||
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"
|
||||
[ -z "$1" ] || make_dummy_action ".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
|
||||
mkdir ".todo.actions.d/$1"
|
||||
[ -z "$1" ] || make_dummy_action ".todo.actions.d/$1/$1" "in folder $1"
|
||||
}
|
||||
echo "custom action $1 in folder $1"
|
||||
EOF
|
||||
chmod +x ".todo.actions.d/$1/$1"
|
||||
|
||||
invalidate_action()
|
||||
{
|
||||
local customActionFilespec="${1:?}"; shift
|
||||
local testName="${1:?}"; shift
|
||||
|
||||
chmod -x "$customActionFilespec"
|
||||
# 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, and
|
||||
# remove the (still valid) custom action so that it doesn't break following
|
||||
# tests.
|
||||
if [ -x "$customActionFilespec" ]; then
|
||||
SKIP_TESTS="${SKIP_TESTS}${SKIP_TESTS+ }${testName}"
|
||||
rm -- "$customActionFilespec"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ case "$1" in
|
||||
esac
|
||||
|
||||
if test -n "$color"; then
|
||||
say_color () {
|
||||
say_color() {
|
||||
(
|
||||
export TERM
|
||||
case "$1" in
|
||||
@@ -67,15 +67,15 @@ do
|
||||
'')
|
||||
continue ;;
|
||||
fixed)
|
||||
fixed=$(($fixed + $value)) ;;
|
||||
fixed=$((fixed + $value)) ;;
|
||||
success)
|
||||
success=$(($success + $value)) ;;
|
||||
success=$((success + $value)) ;;
|
||||
failed)
|
||||
failed=$(($failed + $value)) ;;
|
||||
failed=$((failed + $value)) ;;
|
||||
broken)
|
||||
broken=$(($broken + $value)) ;;
|
||||
broken=$((broken + $value)) ;;
|
||||
total)
|
||||
total=$(($total + $value)) ;;
|
||||
total=$((total + $value)) ;;
|
||||
esac
|
||||
done <"$file"
|
||||
done
|
||||
|
||||
@@ -20,12 +20,12 @@ test_expect_success 'no config file' '
|
||||
'
|
||||
|
||||
# All the below tests will output the usage message.
|
||||
cat > expect << EOF
|
||||
cat > expect <<EOF
|
||||
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||
Try 'todo.sh -h' for more information.
|
||||
EOF
|
||||
|
||||
cat > test.cfg << EOF
|
||||
cat > test.cfg <<EOF
|
||||
export TODO_DIR=.
|
||||
export TODO_FILE="\$TODO_DIR/todo.txt"
|
||||
export DONE_FILE="\$TODO_DIR/done.txt"
|
||||
@@ -79,4 +79,18 @@ test_expect_success 'config file (env variable)' '
|
||||
test_cmp expect output && test -f used_config
|
||||
'
|
||||
|
||||
cat > minimal.cfg <<EOF
|
||||
export TODO_DIR=.
|
||||
touch used_config
|
||||
EOF
|
||||
|
||||
rm -f used_config
|
||||
test_expect_success 'config file (minimal)' '
|
||||
mkdir .todo
|
||||
cp minimal.cfg .todo/config
|
||||
todo.sh > output;
|
||||
test_cmp expect output && test -f used_config &&
|
||||
rm -rf .todo
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -59,7 +59,6 @@ test_expect_success 'null list filter' '
|
||||
todo.sh listall filter > output && test_cmp expect output
|
||||
'
|
||||
|
||||
|
||||
#
|
||||
# lsc|listcon
|
||||
#
|
||||
|
||||
@@ -7,11 +7,11 @@ This test just makes sure that todo.sh can locate custom actions.
|
||||
. ./test-lib.sh
|
||||
|
||||
# All the below tests will output the custom action message
|
||||
cat > expect << EOF
|
||||
cat > expect <<EOF
|
||||
TODO: foo
|
||||
EOF
|
||||
|
||||
cat > foo << EOF
|
||||
cat > foo <<EOF
|
||||
echo "TODO: foo"
|
||||
EOF
|
||||
chmod +x foo
|
||||
|
||||
@@ -110,4 +110,17 @@ TODO: 1 added.
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
EOF
|
||||
|
||||
echo -n 'this is a first task without newline' > todo.txt
|
||||
test_todo_session 'add to file without EOL' <<EOF
|
||||
>>> todo.sh add "a second task"
|
||||
2 a second task
|
||||
TODO: 2 added.
|
||||
|
||||
>>> todo.sh list
|
||||
2 a second task
|
||||
1 this is a first task without newline
|
||||
--
|
||||
TODO: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
|
||||
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
|
||||
@@ -45,7 +45,7 @@ grow some corn
|
||||
thrash some hay
|
||||
chase the chickens
|
||||
EOF
|
||||
test_todo_session 'replace error' << EOF
|
||||
test_todo_session 'replace error' <<EOF
|
||||
>>> todo.sh replace 10 "hej!"
|
||||
=== 1
|
||||
TODO: No task 10.
|
||||
@@ -82,7 +82,7 @@ TODO: Replaced task with:
|
||||
EOF
|
||||
|
||||
echo 'jump on hay' > todo.txt
|
||||
test_todo_session 'replace with &' << EOF
|
||||
test_todo_session 'replace with &' <<EOF
|
||||
>>> todo.sh replace 1 "thrash the hay & thrash the wheat"
|
||||
1 jump on hay
|
||||
TODO: Replaced task with:
|
||||
@@ -140,6 +140,18 @@ TODO: Replaced task with:
|
||||
1 2010-07-04 this also has a new date
|
||||
EOF
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'replace handling prepended priority on add' <<EOF
|
||||
>>> todo.sh -t add "new task"
|
||||
1 2009-02-13 new task
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh replace 1 '(B) this also has a priority now'
|
||||
1 2009-02-13 new task
|
||||
TODO: Replaced task with:
|
||||
1 (B) 2009-02-13 this also has a priority now
|
||||
EOF
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'replace handling priority and prepended date on add' <<EOF
|
||||
>>> todo.sh -t add "new task"
|
||||
@@ -156,6 +168,18 @@ TODO: Replaced task with:
|
||||
1 (A) 2009-02-13 this is just a new one
|
||||
EOF
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'replace handling prepended priority and date on add' <<EOF
|
||||
>>> todo.sh -t add "new task"
|
||||
1 2009-02-13 new task
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh replace 1 '(C) 2010-07-04 this also has a priority and new date'
|
||||
1 2009-02-13 new task
|
||||
TODO: Replaced task with:
|
||||
1 (C) 2010-07-04 this also has a priority and new date
|
||||
EOF
|
||||
|
||||
echo '(A) 2009-02-13 this is just a new one' > todo.txt
|
||||
test_todo_session 'replace with prepended date replaces existing date' <<EOF
|
||||
>>> todo.sh replace 1 2010-07-04 this also has a new date
|
||||
@@ -164,6 +188,14 @@ TODO: Replaced task with:
|
||||
1 (A) 2010-07-04 this also has a new date
|
||||
EOF
|
||||
|
||||
echo '(A) 2009-02-13 this is just a new one' > todo.txt
|
||||
test_todo_session 'replace with prepended priority replaces existing priority' <<EOF
|
||||
>>> todo.sh replace 1 '(B) this also has a new priority'
|
||||
1 (A) 2009-02-13 this is just a new one
|
||||
TODO: Replaced task with:
|
||||
1 (B) 2009-02-13 this also has a new priority
|
||||
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'
|
||||
@@ -172,4 +204,13 @@ TODO: Replaced task with:
|
||||
1 (B) 2010-07-04 this also has a new date
|
||||
EOF
|
||||
|
||||
|
||||
echo '(A) 2009-02-13 this is just a new one' > todo.txt
|
||||
test_todo_session 'replace with prepended priority and date replaces existing priority and date' <<EOF
|
||||
>>> todo.sh replace 1 '(B) 2010-07-04 this also has a new prio+date'
|
||||
1 (A) 2009-02-13 this is just a new one
|
||||
TODO: Replaced task with:
|
||||
1 (B) 2010-07-04 this also has a new prio+date
|
||||
EOF
|
||||
|
||||
test_done
|
||||
|
||||
@@ -6,7 +6,7 @@ test_description='basic priority functionality
|
||||
|
||||
test_todo_session 'priority usage' <<EOF
|
||||
>>> todo.sh pri B B
|
||||
usage: todo.sh pri ITEM# PRIORITY
|
||||
usage: todo.sh pri ITEM# PRIORITY[, ITEM# PRIORITY, ...]
|
||||
note: PRIORITY must be anywhere from A to Z.
|
||||
=== 1
|
||||
EOF
|
||||
@@ -90,6 +90,7 @@ TODO: 2 re-prioritized from (C) to (A).
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh pri 2 a
|
||||
=== 1
|
||||
2 (A) notice the sunflowers
|
||||
TODO: 2 already prioritized (A).
|
||||
|
||||
@@ -100,4 +101,39 @@ TODO: 2 already prioritized (A).
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
smell the uppercase Roses +flowers @outside
|
||||
notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'multiple priority' <<EOF
|
||||
>>> todo.sh pri 1 A 2 B
|
||||
1 (A) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 prioritized (A).
|
||||
2 (B) notice the sunflowers
|
||||
TODO: 2 prioritized (B).
|
||||
EOF
|
||||
|
||||
test_todo_session 'multiple reprioritize' <<EOF
|
||||
>>> todo.sh pri 1 Z 2 X
|
||||
1 (Z) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 re-prioritized from (A) to (Z).
|
||||
2 (X) notice the sunflowers
|
||||
TODO: 2 re-prioritized from (B) to (X).
|
||||
EOF
|
||||
|
||||
test_todo_session 'multiple prioritize error' <<EOF
|
||||
>>> todo.sh pri 1 B 4 B
|
||||
=== 1
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 re-prioritized from (Z) to (B).
|
||||
TODO: No task 4.
|
||||
|
||||
>>> todo.sh pri 1 C 4 B 3 A
|
||||
=== 1
|
||||
1 (C) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 re-prioritized from (B) to (C).
|
||||
TODO: No task 4.
|
||||
EOF
|
||||
test_done
|
||||
|
||||
@@ -96,6 +96,26 @@ TODO: 0 of 5 tasks shown
|
||||
--
|
||||
TODO: 1 of 5 tasks shown
|
||||
EOF
|
||||
test_todo_session 'listpri filtering concatenation of priorities and -ranges' <<EOF
|
||||
>>> todo.sh -p listpri CX
|
||||
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 ABR-Y
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
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
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) ccc xxx this line should be third.
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='list functionality
|
||||
|
||||
@@ -162,7 +161,6 @@ TODO: 1 of 5 tasks shown
|
||||
TODO: 1 of 5 tasks shown
|
||||
EOF
|
||||
|
||||
|
||||
#
|
||||
# check the x command line option
|
||||
#
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='listcon functionality
|
||||
|
||||
@@ -65,6 +64,47 @@ test_todo_session 'listcon with project' <<EOF
|
||||
@garden
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) +math (@school or @home) integrate @x and @y
|
||||
(C) say thanks @GinaTrapani w:@OtherContributors
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'listcon with default configuration' <<EOF
|
||||
>>> todo.sh listcon
|
||||
@GinaTrapani
|
||||
@home)
|
||||
@x
|
||||
@y
|
||||
EOF
|
||||
test_todo_session 'listcon limiting to multi-character sequences' <<EOF
|
||||
>>> TODOTXT_SIGIL_VALID_PATTERN='.\{2,\}' todo.sh listcon
|
||||
@GinaTrapani
|
||||
@home)
|
||||
EOF
|
||||
test_todo_session 'listcon allowing w: marker before contexts' <<EOF
|
||||
>>> TODOTXT_SIGIL_BEFORE_PATTERN='\(w:\)\{0,1\}' todo.sh listcon
|
||||
@GinaTrapani
|
||||
@OtherContributors
|
||||
@home)
|
||||
@x
|
||||
@y
|
||||
EOF
|
||||
test_todo_session 'listcon allowing parentheses around contexts' <<EOF
|
||||
>>> TODOTXT_SIGIL_BEFORE_PATTERN='(\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN=')\{0,1\}' todo.sh listcon
|
||||
@GinaTrapani
|
||||
@home
|
||||
@school
|
||||
@x
|
||||
@y
|
||||
EOF
|
||||
test_todo_session 'listcon with all customizations combined' <<EOF
|
||||
>>> TODOTXT_SIGIL_VALID_PATTERN='.\{2,\}' TODOTXT_SIGIL_BEFORE_PATTERN='\(w:\)\{0,1\}\((\)\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN=')\{0,1\}' todo.sh listcon
|
||||
@GinaTrapani
|
||||
@OtherContributors
|
||||
@home
|
||||
@school
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
@con01 -- Some context 1 task
|
||||
EOF
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='listproj functionality
|
||||
|
||||
@@ -75,6 +74,33 @@ test_todo_session 'listproj with context' <<EOF
|
||||
+sunflowers
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) give a +1 to this project
|
||||
(C) notice the sunflowers +sunflowers [+gardening] [+landscape]
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'listproj with default configuration' <<EOF
|
||||
>>> todo.sh listproj
|
||||
+1
|
||||
+sunflowers
|
||||
EOF
|
||||
test_todo_session 'listproj limiting to alphabetic characters' <<EOF
|
||||
>>> TODOTXT_SIGIL_VALID_PATTERN='[a-zA-Z]\{1,\}' todo.sh listproj
|
||||
+sunflowers
|
||||
EOF
|
||||
test_todo_session 'listproj allowing brackets around projects' <<EOF
|
||||
>>> TODOTXT_SIGIL_BEFORE_PATTERN='\[\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN='\]\{0,1\}' todo.sh listproj
|
||||
+1
|
||||
+gardening
|
||||
+landscape
|
||||
+sunflowers
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +roses @outside +shared
|
||||
(C) notice the sunflowers +sunflowers @garden +shared +landscape
|
||||
stop
|
||||
EOF
|
||||
TEST_TODO_CUSTOM=todo-custom.cfg
|
||||
cat todo.cfg > "$TEST_TODO_CUSTOM"
|
||||
cat >> "$TEST_TODO_CUSTOM" <<'EOF'
|
||||
@@ -90,7 +116,6 @@ test_todo_session 'listproj with context special cases' <<EOF
|
||||
+sunflowers
|
||||
EOF
|
||||
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
+prj01 -- Some project 1 task
|
||||
EOF
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='list highlighting
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='list with escape sequences
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='highlighting projects and contexts
|
||||
|
||||
|
||||
43
tests/t1380-ls-date-number-metadata-highlighting.sh
Executable file
43
tests/t1380-ls-date-number-metadata-highlighting.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='highlighting date, item numbers and metadata
|
||||
|
||||
This test checks the highlighting (with colors) of dates, item numbers and metadata
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
# Tasks with dates and metadata
|
||||
cat > todo.txt <<EOF
|
||||
2018-11-11 task with date
|
||||
task with metadata due:2018-12-31
|
||||
task without date and without metadata
|
||||
EOF
|
||||
|
||||
# config file specifying COLOR_PROJECT and COLOR_CONTEXT
|
||||
#
|
||||
TEST_TODO_LABEL_COLORS=todo-colors.cfg
|
||||
cat todo.cfg > "$TEST_TODO_LABEL_COLORS"
|
||||
|
||||
echo "export COLOR_DATE='\\\\033[0;31m'" >>"$TEST_TODO_LABEL_COLORS"
|
||||
echo "export COLOR_META='\\\\033[0;32m'" >>"$TEST_TODO_LABEL_COLORS"
|
||||
echo "export COLOR_NUMBER='\\\\033[0;34m'" >>"$TEST_TODO_LABEL_COLORS"
|
||||
|
||||
test_todo_session 'highlighting for date, item numbers and metadata' <<'EOF'
|
||||
>>> todo.sh -d "$TEST_TODO_LABEL_COLORS" ls
|
||||
[0;34m1[0m [0;31m2018-11-11[0m task with date
|
||||
[0;34m2[0m task with metadata [0;32mdue:2018-12-31[0m
|
||||
[0;34m3[0m task without date and without metadata
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'suppressing highlighting for date, item numbers and metadata' <<'EOF'
|
||||
>>> todo.sh -p -d "$TEST_TODO_LABEL_COLORS" ls
|
||||
1 2018-11-11 task with date
|
||||
2 task with metadata due:2018-12-31
|
||||
3 task without date and without metadata
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
@@ -81,6 +81,8 @@ test_todo_session 'fail multiple do attempts' <<EOF
|
||||
TODO: 3 marked as done.
|
||||
|
||||
>>> todo.sh -a do 3
|
||||
=== 1
|
||||
TODO: 3 is already marked done.
|
||||
EOF
|
||||
|
||||
test_done
|
||||
|
||||
@@ -17,7 +17,7 @@ test_todo_session 'append usage' <<EOF
|
||||
usage: todo.sh append ITEM# "TEXT TO APPEND"
|
||||
EOF
|
||||
|
||||
test_todo_session 'append error' << EOF
|
||||
test_todo_session 'append error' <<EOF
|
||||
>>> todo.sh append 10 "hej!"
|
||||
=== 1
|
||||
TODO: No task 10.
|
||||
|
||||
@@ -82,6 +82,7 @@ test_todo_session 'depriority of unprioritized task' <<EOF
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh depri 3 2
|
||||
=== 1
|
||||
TODO: 3 is not prioritized.
|
||||
2 notice the sunflowers
|
||||
TODO: 2 deprioritized.
|
||||
|
||||
@@ -4,6 +4,8 @@ test_description='basic del functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
SPACE=' '
|
||||
|
||||
test_todo_session 'del usage' <<EOF
|
||||
>>> todo.sh del B
|
||||
usage: todo.sh del ITEM# [TERM]
|
||||
@@ -44,6 +46,53 @@ TODO: 1 deleted.
|
||||
TODO: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'del with confirmation' <<EOF
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> printf n | todo.sh del 1
|
||||
\\
|
||||
TODO: No tasks were deleted.
|
||||
=== 1
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> printf x | todo.sh del 1
|
||||
\\
|
||||
TODO: No tasks were deleted.
|
||||
=== 1
|
||||
|
||||
>>> echo | todo.sh del 1
|
||||
\\
|
||||
TODO: No tasks were deleted.
|
||||
=== 1
|
||||
|
||||
>>> printf y | todo.sh del 1
|
||||
\\
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 deleted.
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
3 stop
|
||||
--
|
||||
TODO: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
|
||||
100
tests/t1850-move.sh
Executable file
100
tests/t1850-move.sh
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic move functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
EOF
|
||||
cat > done.txt <<EOF
|
||||
x 2009-02-13 make the coffee +wakeup
|
||||
x 2009-02-13 smell the coffee +wakeup
|
||||
EOF
|
||||
test_todo_session 'basic move with implicit source' <<EOF
|
||||
>>> todo.sh -f move 1 done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 moved from 'todo.txt' to 'done.txt'.
|
||||
|
||||
>>> todo.sh -p ls
|
||||
2 (A) notice the sunflowers
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
|
||||
>>> todo.sh -p listfile done.txt
|
||||
3 (B) smell the uppercase Roses +flowers @outside
|
||||
1 x 2009-02-13 make the coffee +wakeup
|
||||
2 x 2009-02-13 smell the coffee +wakeup
|
||||
--
|
||||
DONE: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
EOF
|
||||
cat > done.txt <<EOF
|
||||
x 2009-02-13 make the coffee +wakeup
|
||||
x 2009-02-13 smell the coffee +wakeup
|
||||
EOF
|
||||
test_todo_session 'basic move with confirmation' <<EOF
|
||||
>>> printf y | todo.sh move 1 done.txt 2>&1 | sed -e "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g" -e 's#from .\{1,\}/\([^/]\{1,\}\) to .\{1,\}/\([^/]\{1,\}\)?#from \1 to \2?#g'
|
||||
\\
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 moved from 'todo.txt' to 'done.txt'.
|
||||
|
||||
>>> todo.sh -p ls
|
||||
2 (A) notice the sunflowers
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
|
||||
>>> todo.sh -p listfile done.txt
|
||||
3 (B) smell the uppercase Roses +flowers @outside
|
||||
1 x 2009-02-13 make the coffee +wakeup
|
||||
2 x 2009-02-13 smell the coffee +wakeup
|
||||
--
|
||||
DONE: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'basic move with passed source' <<EOF
|
||||
>>> todo.sh -f move 2 todo.txt done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
|
||||
2 x 2009-02-13 smell the coffee +wakeup
|
||||
TODO: 2 moved from 'done.txt' to 'todo.txt'.
|
||||
|
||||
>>> todo.sh -p ls
|
||||
2 (A) notice the sunflowers
|
||||
3 x 2009-02-13 smell the coffee +wakeup
|
||||
--
|
||||
TODO: 2 of 2 tasks shown
|
||||
|
||||
>>> todo.sh -p listfile done.txt
|
||||
3 (B) smell the uppercase Roses +flowers @outside
|
||||
1 x 2009-02-13 make the coffee +wakeup
|
||||
--
|
||||
DONE: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
echo -n 'this is a first task without newline' > todo.txt
|
||||
cat > done.txt <<EOF
|
||||
x 2009-02-13 make the coffee +wakeup
|
||||
x 2009-02-13 smell the coffee +wakeup
|
||||
EOF
|
||||
test_todo_session 'move to destination without EOL' <<EOF
|
||||
>>> todo.sh -f move 2 todo.txt done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
|
||||
2 x 2009-02-13 smell the coffee +wakeup
|
||||
TODO: 2 moved from 'done.txt' to 'todo.txt'.
|
||||
|
||||
>>> todo.sh -p ls
|
||||
1 this is a first task without newline
|
||||
2 x 2009-02-13 smell the coffee +wakeup
|
||||
--
|
||||
TODO: 2 of 2 tasks shown
|
||||
|
||||
>>> todo.sh -p listfile done.txt
|
||||
1 x 2009-02-13 make the coffee +wakeup
|
||||
--
|
||||
DONE: 1 of 1 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
@@ -32,6 +32,7 @@ EOF
|
||||
|
||||
test_todo_session 'deduplicate without duplicates' <<EOF
|
||||
>>> todo.sh deduplicate
|
||||
=== 1
|
||||
TODO: No duplicate tasks found
|
||||
EOF
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='help functionality
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='shorthelp functionality
|
||||
|
||||
@@ -36,7 +35,6 @@ test_todo_session 'shorthelp output with custom action' <<EOF
|
||||
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".
|
||||
@@ -49,7 +47,7 @@ echo 'export TODO_ACTIONS_DIR=$HOME/custom.actions' >> custom.cfg
|
||||
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'
|
||||
>>> todo.sh -h 2>&1 | 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
|
||||
@@ -60,7 +58,7 @@ 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'
|
||||
>>> todo.sh -h -d custom.cfg 2>&1 | 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
|
||||
@@ -71,7 +69,7 @@ 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'
|
||||
>>> todo.sh -d custom.cfg -h 2>&1 | 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
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='todo.sh configuration with a sole todo.txt data file.
|
||||
|
||||
@@ -8,7 +7,7 @@ checks that no such empty files are created.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > test.cfg << EOF
|
||||
cat > test.cfg <<EOF
|
||||
export TODO_DIR=.
|
||||
export TODO_FILE="\$TODO_DIR/todo.txt"
|
||||
export DONE_FILE=/dev/null
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash completion functionality
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash context completion functionality
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash project completion functionality
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash task number completion functionality
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash todo file completion functionality
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash add-on action completion functionality
|
||||
|
||||
@@ -74,7 +73,7 @@ removeCustomActions "$HOME/.todo.actions.d"
|
||||
#
|
||||
# Test resolution of an alternative TODO_ACTIONS_DIR.
|
||||
#
|
||||
mkdir "$HOME/.todo"
|
||||
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"
|
||||
|
||||
27
tests/t6060-completion-addon-files.sh
Executable file
27
tests/t6060-completion-addon-files.sh
Executable file
@@ -0,0 +1,27 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='Bash add-on action file completion functionality
|
||||
|
||||
This test checks todo_completion of files for add-on actions that have file argument(s) configured
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
readonly FILES='done.txt report.txt todo.txt'
|
||||
test_todo_completion 'nothing after unconfigured bar' 'todo.sh bar ' ''
|
||||
|
||||
_todo_file1_actions='foo|bar'
|
||||
test_todo_completion 'all files after configured bar' 'todo.sh bar ' "$FILES"
|
||||
test_todo_completion 'nothing after configured bar ITEM#' 'todo.sh bar 1 ' ''
|
||||
|
||||
_todo_file2_actions='baz'
|
||||
test_todo_completion 'nothing after configured baz' 'todo.sh baz ' ''
|
||||
test_todo_completion 'all files after configured baz ITEM#' 'todo.sh baz 1 ' "$FILES"
|
||||
test_todo_completion 'nothing after configured baz ITEM# MORE' 'todo.sh baz 1 more ' ''
|
||||
|
||||
_todo_file3_actions='biz'
|
||||
test_todo_completion 'nothing after configured biz' 'todo.sh biz ' ''
|
||||
test_todo_completion 'nothing after configured biz ITEM#' 'todo.sh biz 1 ' ''
|
||||
test_todo_completion 'all files after configured biz ITEM# MORE' 'todo.sh biz 1 more ' "$FILES"
|
||||
test_todo_completion 'nothing after configured biz ITEM# EVEN MORE' 'todo.sh biz 1 even more ' ''
|
||||
|
||||
test_done
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash completion with different path functionality
|
||||
|
||||
@@ -28,8 +27,6 @@ _todo2()
|
||||
|
||||
test_todo_custom_completion _todo2 'all todo2 contexts' 'todo2 list @' '@garden @outdoor @outside'
|
||||
|
||||
|
||||
|
||||
# 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:"}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash completion with different aliases functionality
|
||||
|
||||
@@ -46,17 +45,23 @@ test_todo_session 'todo 1 and 2 contexts' <<EOF
|
||||
@oriental
|
||||
EOF
|
||||
|
||||
|
||||
# Define a second completion function that injects the different configuration
|
||||
# file. In real use, this would be installed via
|
||||
# file and uppercases all output. (This is a silly behavior change that still
|
||||
# requires a completion function override.)
|
||||
# In real use, this would be installed via
|
||||
# complete -F _todo2 todo2
|
||||
_uppercase_todo()
|
||||
{
|
||||
todo.sh "$@" | tr '[:lower:]' '[:upper:]'
|
||||
}
|
||||
_todo2()
|
||||
{
|
||||
local _todo_sh='todo.sh -d "$HOME/todo2.cfg"'
|
||||
local _todo_sh='_uppercase_todo -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_todo_completion 'all todo2 contexts' 'todo2 list @' '@home @oriental'
|
||||
test_todo_custom_completion _todo2 'all uppercased todo2 contexts' 'doesNotMatter list @' '@HOME @ORIENTAL'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
|
||||
test_description='Bash help completion functionality
|
||||
|
||||
|
||||
@@ -44,4 +44,50 @@ custom action bad
|
||||
=== 42
|
||||
EOF
|
||||
|
||||
make_action
|
||||
ln -s /actionsdir/doesnotexist/badlink .todo.actions.d/badlink
|
||||
# On Cygwin, the Windows ACL may still grant execution rights. In this case, we
|
||||
# skip the test.
|
||||
if [ -x .todo.actions.d/badlink ]; then
|
||||
SKIP_TESTS="${SKIP_TESTS}${SKIP_TESTS+ }t8000.6 t8000.7"
|
||||
fi
|
||||
test_todo_session 'broken symlink' <<EOF
|
||||
>>> todo.sh badlink 2>&1 | sed "s#'[^']*\(\\.todo\\.actions\\.d/[^']\{1,\}\)'#'\1'#g"
|
||||
Fatal Error: Broken link to custom action: '.todo.actions.d/badlink'
|
||||
|
||||
>>> todo.sh do 2>/dev/null
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
make_action
|
||||
mkdir .todo.actions.d/badfolderlink
|
||||
ln -s /actionsdir/doesnotexist/badfolderlink .todo.actions.d/badfolderlink/badfolderlink
|
||||
# On Cygwin, the Windows ACL may still grant execution rights. In this case, we
|
||||
# skip the test.
|
||||
if [ -x .todo.actions.d/badfolderlink/badfolderlink ]; then
|
||||
SKIP_TESTS="${SKIP_TESTS}${SKIP_TESTS+ }t8000.8 t8000.9"
|
||||
fi
|
||||
test_todo_session 'broken symlink in folder' <<EOF
|
||||
>>> todo.sh badfolderlink 2>&1 | sed "s#'[^']*\(\\.todo\\.actions\\.d/[^']\{1,\}\)'#'\1'#g"
|
||||
Fatal Error: Broken link to custom action: '.todo.actions.d/badfolderlink/badfolderlink'
|
||||
|
||||
>>> todo.sh do 2>/dev/null
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
make_action
|
||||
ln -s /actionsdir/doesnotexist/do .todo.actions.d/do
|
||||
# On Cygwin, the Windows ACL may still grant execution rights. In this case, we
|
||||
# skip the test.
|
||||
if [ -x .todo.actions.d/do ]; then
|
||||
SKIP_TESTS="${SKIP_TESTS}${SKIP_TESTS+ }t8000.10 t8000.11"
|
||||
fi
|
||||
test_todo_session 'broken symlink overrides built-in action' <<EOF
|
||||
>>> todo.sh do 2>&1 | sed "s#'[^']*\(\\.todo\\.actions\\.d/[^']\{1,\}\)'#'\1'#g"
|
||||
Fatal Error: Broken link to custom action: '.todo.actions.d/do'
|
||||
|
||||
>>> todo.sh do 2>/dev/null
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
test_done
|
||||
|
||||
@@ -28,12 +28,7 @@ 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
|
||||
invalidate_action .todo.actions.d/foo t8010.4
|
||||
test_todo_session 'nonexecutable action' <<EOF
|
||||
>>> todo.sh listaddons
|
||||
bar
|
||||
@@ -66,13 +61,7 @@ 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
|
||||
invalidate_action .todo.actions.d/norris/norris t8010.8
|
||||
test_todo_session 'nonexecutable action in subfolder' <<EOF
|
||||
>>> todo.sh listaddons
|
||||
bar
|
||||
|
||||
@@ -172,12 +172,12 @@ test_set_editor () {
|
||||
# the text_expect_* functions instead.
|
||||
|
||||
test_ok_ () {
|
||||
test_success=$(($test_success + 1))
|
||||
test_success=$((test_success + 1))
|
||||
say_color "" " ok $test_count: $@"
|
||||
}
|
||||
|
||||
test_failure_ () {
|
||||
test_failure=$(($test_failure + 1))
|
||||
test_failure=$((test_failure + 1))
|
||||
say_color error "FAIL $test_count: $1"
|
||||
shift
|
||||
echo "$@"
|
||||
@@ -185,12 +185,12 @@ test_failure_ () {
|
||||
}
|
||||
|
||||
test_known_broken_ok_ () {
|
||||
test_fixed=$(($test_fixed+1))
|
||||
test_fixed=$((test_fixed + 1))
|
||||
say_color "" " FIXED $test_count: $@"
|
||||
}
|
||||
|
||||
test_known_broken_failure_ () {
|
||||
test_broken=$(($test_broken+1))
|
||||
test_broken=$((test_broken + 1))
|
||||
say_color skip " still broken $test_count: $@"
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ test_run_ () {
|
||||
}
|
||||
|
||||
test_skip () {
|
||||
test_count=$(($test_count+1))
|
||||
test_count=$((test_count + 1))
|
||||
to_skip=
|
||||
for skp in $SKIP_TESTS
|
||||
do
|
||||
@@ -364,7 +364,7 @@ test_external_without_stderr () {
|
||||
test_ok_ "$descr"
|
||||
else
|
||||
if [ "$verbose" = t ]; then
|
||||
output=`echo; echo Stderr is:; cat "$stderr"`
|
||||
output=$(echo; echo Stderr is:; cat "$stderr")
|
||||
else
|
||||
output=
|
||||
fi
|
||||
@@ -414,12 +414,12 @@ test_done () {
|
||||
mkdir -p "$test_results_dir"
|
||||
test_results_path="$test_results_dir/${0%.sh}-$$"
|
||||
|
||||
echo "total $test_count" >> $test_results_path
|
||||
echo "success $test_success" >> $test_results_path
|
||||
echo "fixed $test_fixed" >> $test_results_path
|
||||
echo "broken $test_broken" >> $test_results_path
|
||||
echo "failed $test_failure" >> $test_results_path
|
||||
echo "" >> $test_results_path
|
||||
echo "total $test_count" >> "$test_results_path"
|
||||
echo "success $test_success" >> "$test_results_path"
|
||||
echo "fixed $test_fixed" >> "$test_results_path"
|
||||
echo "broken $test_broken" >> "$test_results_path"
|
||||
echo "failed $test_failure" >> "$test_results_path"
|
||||
echo "" >> "$test_results_path"
|
||||
|
||||
if test "$test_fixed" != 0
|
||||
then
|
||||
@@ -428,7 +428,7 @@ test_done () {
|
||||
if test "$test_broken" != 0
|
||||
then
|
||||
say_color error "still have $test_broken known breakage(s)"
|
||||
msg="remaining $(($test_count-$test_broken)) test(s)"
|
||||
msg="remaining $((test_count - test_broken)) test(s)"
|
||||
else
|
||||
msg="$test_count test(s)"
|
||||
fi
|
||||
@@ -471,12 +471,12 @@ rm -fr "$test" || {
|
||||
test_init_todo () {
|
||||
test "$#" = 1 ||
|
||||
error "bug in the test script: not 1 parameter to test_init_todo"
|
||||
owd=`pwd`
|
||||
owd=$(pwd)
|
||||
root="$1"
|
||||
mkdir -p "$root"
|
||||
cd "$root" || error "Cannot setup todo dir in $root"
|
||||
# Initialize the configuration file. Carefully quoted.
|
||||
sed -e 's|TODO_DIR=.*$|TODO_DIR="'"$TEST_DIRECTORY/$test"'"|' $TEST_DIRECTORY/../todo.cfg > todo.cfg
|
||||
sed -e 's|TODO_DIR=.*$|TODO_DIR="'"$TEST_DIRECTORY/$test"'"|' "$TEST_DIRECTORY/../todo.cfg" > todo.cfg
|
||||
|
||||
# Install latest todo.sh
|
||||
mkdir bin
|
||||
@@ -499,8 +499,8 @@ test_init_todo () {
|
||||
#date --version
|
||||
#date: illegal option -- -
|
||||
#usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
|
||||
#[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
|
||||
elif date --version 2>&1 | grep -q -e "-jnu"; then
|
||||
# [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
|
||||
elif date --version 2>&1 | grep -q -e "-jnR\?u"; then
|
||||
DATE_STYLE=Mac10.5
|
||||
# on Mac OS X 10.4:
|
||||
#date --version
|
||||
@@ -548,7 +548,7 @@ test_init_todo () {
|
||||
|
||||
# Usage: test_tick [increment]
|
||||
test_tick () {
|
||||
TODO_TEST_TIME=$(($TODO_TEST_TIME + ${1:-86400}))
|
||||
TODO_TEST_TIME=$((TODO_TEST_TIME + ${1:-86400}))
|
||||
}
|
||||
|
||||
# Generate and run a series of tests based on a transcript.
|
||||
@@ -581,14 +581,14 @@ test_todo_session () {
|
||||
status=${line#=== }
|
||||
;;
|
||||
"")
|
||||
if [ ! -z "$cmd" ]; then
|
||||
if [ $status = 0 ]; then
|
||||
if [ -n "$cmd" ]; then
|
||||
if [ "$status" = 0 ]; then
|
||||
test_expect_output "$1 $subnum" "$cmd"
|
||||
else
|
||||
test_expect_code_and_output "$status" "$1 $subnum" "$cmd"
|
||||
fi
|
||||
|
||||
subnum=$(($subnum + 1))
|
||||
subnum=$((subnum + 1))
|
||||
cmd=""
|
||||
status=0
|
||||
> expect
|
||||
@@ -602,8 +602,8 @@ test_todo_session () {
|
||||
;;
|
||||
esac
|
||||
done
|
||||
if [ ! -z "$cmd" ]; then
|
||||
if [ $status = 0 ]; then
|
||||
if [ -n "$cmd" ]; then
|
||||
if [ "$status" = 0 ]; then
|
||||
test_expect_output "$1 $subnum" "$cmd"
|
||||
else
|
||||
test_expect_code_and_output "$status" "$1 $subnum" "$cmd"
|
||||
@@ -645,7 +645,7 @@ test_todo_custom_completion () {
|
||||
SAVEIFS=$IFS
|
||||
IFS=' ' set -- $2
|
||||
COMP_WORDS=("$@")
|
||||
COMP_CWORD=$(($# - $offset))
|
||||
COMP_CWORD=$(($# - offset))
|
||||
IFS=' ' eval "set -- $expected"
|
||||
EXPECT=("$@")
|
||||
|
||||
@@ -693,6 +693,13 @@ cd -P "$test" || exit 1
|
||||
# but use something specified by the framework.
|
||||
HOME=$(pwd)
|
||||
export HOME
|
||||
# Unset XDG_CONFIG_HOME as that is used as a config alternative.
|
||||
unset XDG_CONFIG_HOME
|
||||
# User add-ons may override built-in commands; these could have incompatible
|
||||
# behavior that makes the tests fail. Avoid picking up user add-ons by
|
||||
# explicitly configuring the first default location (which with the redirected
|
||||
# HOME lies within the test directory and usually does not exist).
|
||||
export TODO_ACTIONS_DIR="$HOME/.todo/actions"
|
||||
|
||||
this_test=${0##*/}
|
||||
this_test=${this_test%%-*}
|
||||
|
||||
22
todo.cfg
22
todo.cfg
@@ -2,7 +2,7 @@
|
||||
|
||||
# Your todo.txt directory (this should be an absolute path)
|
||||
#export TODO_DIR="/Users/gina/Documents/todo"
|
||||
export TODO_DIR=$(dirname "$0")
|
||||
export TODO_DIR=${HOME:-$USERPROFILE}
|
||||
|
||||
# Your todo/done/report.txt locations
|
||||
export TODO_FILE="$TODO_DIR/todo.txt"
|
||||
@@ -62,13 +62,31 @@ export REPORT_FILE="$TODO_DIR/report.txt"
|
||||
#
|
||||
# export COLOR_DONE=$LIGHT_GREY
|
||||
|
||||
# There is highlighting for projects and contexts.
|
||||
# There is highlighting for projects, contexts, dates, and item numbers.
|
||||
#
|
||||
# export COLOR_PROJECT=$RED
|
||||
# export COLOR_CONTEXT=$RED
|
||||
# export COLOR_DATE=$BLUE
|
||||
# export COLOR_NUMBER=$LIGHT_GREY
|
||||
|
||||
# There is highlighting for metadata key:value pairs e.g.
|
||||
# DUE:2006-08-01 or note:MYNOTE
|
||||
#
|
||||
# export COLOR_META=$CYAN
|
||||
|
||||
# ... and for date extensions (due:yyyy-mm-dd, t:yyyy-mm-dd and again:X)
|
||||
#
|
||||
# export COLOR_DATEEXT=$LIGHT_BLUE
|
||||
|
||||
# === BEHAVIOR ===
|
||||
|
||||
## verbosity
|
||||
#
|
||||
# By default, additional information and confirmation of actions (like
|
||||
# "TODO: 1 added") are printed. You can suppress this via 0 or add extra
|
||||
# verbosity via 2.
|
||||
# export TODOTXT_VERBOSE=1
|
||||
|
||||
## customize list output
|
||||
#
|
||||
# TODOTXT_SORT_COMMAND will filter after line numbers are
|
||||
|
||||
135
todo_completion
135
todo_completion
@@ -1,5 +1,7 @@
|
||||
#!/bin/bash source-this-script
|
||||
[ "$BASH_VERSION" ] || return
|
||||
# bash completion for todo.txt-cli
|
||||
|
||||
# Check for bash
|
||||
[ -z "$BASH_VERSION" ] && return
|
||||
|
||||
_todo()
|
||||
{
|
||||
@@ -14,15 +16,15 @@ _todo()
|
||||
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"
|
||||
local -r MOVE_COMMAND_PATTERN='^(move|mv)$'
|
||||
local -r MOVE_COMMAND_PATTERN='move|mv'
|
||||
|
||||
local _todo_sh=${_todo_sh:-todo.sh}
|
||||
local _todo_sh=${_todo_sh:-${COMP_WORDS[0]}}
|
||||
local completions
|
||||
if [ $COMP_CWORD -eq 1 ]; then
|
||||
if [ "$COMP_CWORD" -eq 1 ]; then
|
||||
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null) $OPTS"
|
||||
elif [[ $COMP_CWORD -gt 2 && ( \
|
||||
"${COMP_WORDS[COMP_CWORD-2]}" =~ $MOVE_COMMAND_PATTERN || \
|
||||
"${COMP_WORDS[COMP_CWORD-3]}" =~ $MOVE_COMMAND_PATTERN ) ]]; then
|
||||
"${COMP_WORDS[COMP_CWORD-2]}" =~ ^($MOVE_COMMAND_PATTERN${_todo_file2_actions:+|${_todo_file2_actions}})$ || \
|
||||
"${COMP_WORDS[COMP_CWORD-3]}" =~ ^($MOVE_COMMAND_PATTERN${_todo_file3_actions:+|${_todo_file3_actions}})$ ) ]]; then
|
||||
# "move ITEM# DEST [SRC]" has file arguments on positions 2 and 3.
|
||||
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile 2>/dev/null)
|
||||
else
|
||||
@@ -31,51 +33,58 @@ _todo()
|
||||
completions=$COMMANDS;;
|
||||
help)
|
||||
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null)";;
|
||||
addto|listfile|lf)
|
||||
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile 2>/dev/null);;
|
||||
-*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null) $OPTS";;
|
||||
*) case "$cur" in
|
||||
+*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj 2>/dev/null)
|
||||
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
|
||||
# Remove the (padded) task number; we prepend the
|
||||
# user-provided $cur instead.
|
||||
# Remove the timestamp prepended by the -t option,
|
||||
# and the done date (for done tasks); there's no
|
||||
# todo.txt option for that yet.
|
||||
# But keep priority and "x"; they're short and may
|
||||
# provide useful context.
|
||||
# Remove any trailing whitespace; the Bash
|
||||
# completion inserts a trailing space itself.
|
||||
# Finally, limit the output to a single line just as
|
||||
# a safety check of the ls action output.
|
||||
local todo=$( \
|
||||
eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' 2>/dev/null | \
|
||||
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/[[:space:]]*$//' \
|
||||
-e '1q' \
|
||||
)
|
||||
# Append task text as a shell comment. This
|
||||
# completion can be a safety check before a
|
||||
# destructive todo.txt operation.
|
||||
[ "$todo" ] && COMPREPLY[0]="$cur # $todo"
|
||||
return 0
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
*) if [[ "$prev" =~ ^(addto|listfile|lf${_todo_file1_actions:+|${_todo_file1_actions}})$ ]]; then
|
||||
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile 2>/dev/null)
|
||||
else
|
||||
case "$cur" in
|
||||
+*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj 2>/dev/null)
|
||||
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
|
||||
declare -a sedTransformations=(
|
||||
# Remove the (padded) task number; we prepend the
|
||||
# user-provided $cur instead.
|
||||
-e 's/^ *[0-9]\{1,\} //'
|
||||
# Remove the timestamp prepended by the -t option,
|
||||
# but keep any priority (as it's short and may
|
||||
# provide useful context).
|
||||
-e 's/^\((.) \)\{0,1\}[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/'
|
||||
# Remove the done date and (if there) the timestamp.
|
||||
# Keep the "x" (as it's short and may provide useful
|
||||
# context)
|
||||
-e 's/^\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/'
|
||||
# Remove any trailing whitespace; the Bash
|
||||
# completion inserts a trailing space itself.
|
||||
-e 's/[[:space:]]*$//'
|
||||
# Finally, limit the output to a single line just as
|
||||
# a safety check of the ls action output.
|
||||
-e '1q'
|
||||
)
|
||||
local todo=$( \
|
||||
eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' 2>/dev/null | \
|
||||
sed "${sedTransformations[@]}" \
|
||||
)
|
||||
# Append task text as a shell comment. This
|
||||
# completion can be a safety check before a
|
||||
# destructive todo.txt operation.
|
||||
[ "$todo" ] && COMPREPLY[0]="$cur # $todo"
|
||||
return 0
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
@@ -92,22 +101,14 @@ complete -F _todo todo.sh
|
||||
# ~/.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()
|
||||
# The completion uses the alias itself, so any custom arguments (like a custom
|
||||
# configuration (-d "$HOME/todo2.cfg")) are used there as well.
|
||||
# If you don't want this, or need to further tweak the todo.sh command that's
|
||||
# used by the completion, you can add and use a wrapper completion function that
|
||||
# redefines _todo_sh before invoking _todo():
|
||||
#_todo_tweak()
|
||||
#{
|
||||
# local _todo_sh='/path/to/todo2.sh'
|
||||
# local _todo_sh='todo.sh -d "$HOME/todo-tweaked.cfg"'
|
||||
# _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
|
||||
#complete -F _todo_tweak todo.sh
|
||||
|
||||
Reference in New Issue
Block a user