Compare commits
428 Commits
wip-weekly
...
master
| 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 | ||
|
|
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 | ||
|
|
74858365f6 | ||
|
|
be0a0265d1 | ||
|
|
cf7f7531be | ||
|
|
28ec5a06f2 | ||
|
|
dfec12e2a4 | ||
|
|
c31716af47 | ||
|
|
ebe9fb868b | ||
|
|
189779c6de | ||
|
|
516f806d58 | ||
|
|
9e38fa11ee | ||
|
|
309b0f81b0 | ||
|
|
f3fc18af6b | ||
|
|
25e6d7ae24 | ||
|
|
880d829e8e | ||
|
|
7e525ee743 | ||
|
|
d46adadb1d | ||
|
|
d0205b48a6 | ||
|
|
7a4d11812d | ||
|
|
ba66f66e86 | ||
|
|
88ac3d87e6 | ||
|
|
1a2af45b4d | ||
|
|
6424c4c1a0 | ||
|
|
fe5cdcb13a | ||
|
|
bf2ca0ed6a | ||
|
|
62d78a0034 | ||
|
|
e33603939b | ||
|
|
c99543506a | ||
|
|
b4aaba8387 | ||
|
|
493e975199 | ||
|
|
fda31ea260 | ||
|
|
8744167827 | ||
|
|
73e28b7225 | ||
|
|
43bd1b645b | ||
|
|
4db4494f03 | ||
|
|
799840b664 | ||
|
|
54f15a7854 | ||
|
|
17658c852d | ||
|
|
f8a6e5f8d6 | ||
|
|
388ae745af | ||
|
|
cb908bd454 | ||
|
|
55679d136f | ||
|
|
c0847b0b25 | ||
|
|
76fb1cb3ee | ||
|
|
ac090fa30b | ||
|
|
ea0e7c7b25 | ||
|
|
cd7d2f2fda | ||
|
|
395465b5f2 | ||
|
|
d2e0f6e38d | ||
|
|
b1d894f65d | ||
|
|
f5270be463 | ||
|
|
8cba7533b9 | ||
|
|
285d5039f2 | ||
|
|
9b67a76833 | ||
|
|
2b0921f4ec | ||
|
|
202f892e85 | ||
|
|
417e86ae7a | ||
|
|
cb982391de | ||
|
|
b8244792cc | ||
|
|
a433c5828e | ||
|
|
7742d3c115 | ||
|
|
7ca2b4c687 | ||
|
|
239f7234ab | ||
|
|
e3fce6f12b | ||
|
|
65d39319f1 | ||
|
|
62d3ff2977 | ||
|
|
227b9d2c0a | ||
|
|
99fa15da36 | ||
|
|
72fe73f3d8 | ||
|
|
8f6070e702 | ||
|
|
2891472630 | ||
|
|
f3af778d3e | ||
|
|
c14788e764 | ||
|
|
32c84781d2 | ||
|
|
6e740f748e | ||
|
|
0fa5f6d1dd | ||
|
|
f8b66f117a | ||
|
|
b00ca1074a | ||
|
|
a60dfb668d | ||
|
|
899687f0ef | ||
|
|
301dbcf297 | ||
|
|
e79b1629f5 | ||
|
|
a4db95166d | ||
|
|
afe6d9dfd5 | ||
|
|
ab705cd670 | ||
|
|
e0ad2292a2 | ||
|
|
c4670b6502 | ||
|
|
7900ad7e1b | ||
|
|
e24777fa2c | ||
|
|
dae6f2bcaf | ||
|
|
0c5bdf3b0a | ||
|
|
5afd734dcb | ||
|
|
990bc293ba | ||
|
|
8e4364f5e1 | ||
|
|
f1d339a537 | ||
|
|
82c8349499 | ||
|
|
9a5668a51c | ||
|
|
a82fd58363 | ||
|
|
819a8285cc | ||
|
|
2df5f9fee9 | ||
|
|
07baa2c1bd | ||
|
|
a117b7cb3c | ||
|
|
9760ee23c7 | ||
|
|
ce501c5362 | ||
|
|
824101defd | ||
|
|
194a062c2d | ||
|
|
94325f57cd | ||
|
|
938bbc1ec2 | ||
|
|
99f8911c8f | ||
|
|
f5d4249078 | ||
|
|
9b7f85bea1 | ||
|
|
a7afc7917d | ||
|
|
4d29e68e89 | ||
|
|
b383b1f0c5 | ||
|
|
8a95a66749 | ||
|
|
83053fd0c1 | ||
|
|
74fa07d26a | ||
|
|
3e597ce20e | ||
|
|
da466c9361 | ||
|
|
72caab8bbd | ||
|
|
7501b225c2 | ||
|
|
bcbf93ebe4 | ||
|
|
cea6d07735 | ||
|
|
2f4ba26994 | ||
|
|
5e44868261 | ||
|
|
2f6d9ae329 | ||
|
|
d46a12f14a | ||
|
|
95919765f7 | ||
|
|
2d0efff9a8 | ||
|
|
c58317258e | ||
|
|
38e2b8847f | ||
|
|
f72c1034ee | ||
|
|
37fcc53b26 | ||
|
|
e7b5841721 | ||
|
|
0b16bae2e8 | ||
|
|
8b7e2e6aad | ||
|
|
9f03cf6847 | ||
|
|
821b9d2795 | ||
|
|
c52d9c33af | ||
|
|
70b2c4ca40 | ||
|
|
69e756a2cd | ||
|
|
52b9db310f | ||
|
|
26bee144bd | ||
|
|
8ff3a7ce4a | ||
|
|
8bddb08196 | ||
|
|
391064e4f0 | ||
|
|
d52a1a7bd2 | ||
|
|
15084aa4d7 | ||
|
|
5876cc0437 | ||
|
|
370abbbf36 | ||
|
|
97eaa24b06 | ||
|
|
9e5e6aef39 | ||
|
|
edac86a94d | ||
|
|
948686a501 | ||
|
|
2a65615c7a | ||
|
|
d7e194b09d | ||
|
|
fd10678257 | ||
|
|
a4ab8a808a | ||
|
|
e395ac78d8 | ||
|
|
6fc2d81919 | ||
|
|
b6467eaa64 | ||
|
|
2d3820394a | ||
|
|
394c4c748a | ||
|
|
4c76f04a82 | ||
|
|
bf537934d7 | ||
|
|
2bb14eb9bc | ||
|
|
99511169c3 | ||
|
|
acc881f0dd | ||
|
|
d337933fd9 | ||
|
|
0a7e6337b2 | ||
|
|
0e326067e3 | ||
|
|
f6cf3fe76f | ||
|
|
20e04d5a4d | ||
|
|
9c56d2137a | ||
|
|
ceed8bf841 | ||
|
|
b8ced51a22 | ||
|
|
9a56bdd4ed | ||
|
|
9b580acf14 | ||
|
|
0d5904658e | ||
|
|
97866082e6 | ||
|
|
5f9fd4c759 | ||
|
|
5a49f4b5d5 | ||
|
|
f8e6a8d69d | ||
|
|
2983917f25 | ||
|
|
7a87077dfc | ||
|
|
51dd50b41d | ||
|
|
ddaf9ade22 | ||
|
|
ce8a0a7875 | ||
|
|
5e71728cda | ||
|
|
f44bcfb067 | ||
|
|
a19a3616c4 | ||
|
|
229737bd2f | ||
|
|
857121090a | ||
|
|
490f5d34e8 | ||
|
|
7baf051942 | ||
|
|
266d9e1258 | ||
|
|
e0b3ea1da9 | ||
|
|
35e80b3f33 | ||
|
|
294e2ac9a4 | ||
|
|
8d78cc6053 | ||
|
|
092e83404f | ||
|
|
91126e38aa | ||
|
|
5df58793a0 | ||
|
|
d2e892049d | ||
|
|
0e2798acce | ||
|
|
98569d5f8c | ||
|
|
75622c4a72 | ||
|
|
f9bb135068 | ||
|
|
a4227dfec1 | ||
|
|
78850255e0 | ||
|
|
4dda7e27e4 | ||
|
|
cace5eb2d9 | ||
|
|
701c30c04f | ||
|
|
2e62536f90 | ||
|
|
678283b69e | ||
|
|
c490e773cf | ||
|
|
a67d0de625 | ||
|
|
55015f5071 | ||
|
|
c8fc661256 | ||
|
|
fee3133547 | ||
|
|
825c60514f | ||
|
|
90d113b77d | ||
|
|
4caee7d9c0 | ||
|
|
fe99926bb2 | ||
|
|
fd9e2c05a7 | ||
|
|
10bca653a0 | ||
|
|
d6c57e4230 | ||
|
|
25616bd198 | ||
|
|
b238a29430 | ||
|
|
16a5103668 |
46
.github/CODE_OF_CONDUCT.md
vendored
Normal file
46
.github/CODE_OF_CONDUCT.md
vendored
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
.github/CONTRIBUTING.md
vendored
Normal file
97
.github/CONTRIBUTING.md
vendored
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/
|
||||
22
.github/ISSUE_TEMPLATE.md
vendored
Normal file
22
.github/ISSUE_TEMPLATE.md
vendored
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`
|
||||
|
||||
9
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
9
.github/PULL_REQUEST_TEMPLATE.md
vendored
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.
|
||||
- [ ] 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
|
||||
BIN
.github/example.gif
vendored
Normal file
BIN
.github/example.gif
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 657 KiB |
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
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,6 @@
|
||||
VERSION-FILE
|
||||
tests/test-results
|
||||
tests/trash\ directory.*
|
||||
done.txt
|
||||
report.txt
|
||||
todo.txt
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
TODO.TXT CLI Add-ons
|
||||
|
||||
adda (symlink to aa for fewer keystrokes)
|
||||
* Adds a task and prioritizes it A in one shot
|
||||
|
||||
addx (symlink ax for fewer keystrokes)
|
||||
* Adds a task and marks it as complete in one shot
|
||||
|
||||
birdseye (requires Python in path and birdseye.py file)
|
||||
* Generates a textual report of open and complete tasks in all contexts and projects
|
||||
@@ -1,20 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
action=$1
|
||||
shift
|
||||
|
||||
[ "$action" = "usage" ] && {
|
||||
echo " Add and prioritize A:"
|
||||
curcmd=`basename $0`
|
||||
echo " $curcmd \"THING I NEED TO DO +project @context\""
|
||||
echo " Add an item and prioritize it A in one step"
|
||||
echo ""
|
||||
exit
|
||||
}
|
||||
|
||||
if "$TODO_SH" command add "$@"; then
|
||||
# figure out the line of what we just added, and prioritize it A
|
||||
line=`sed -n '$ =' "$TODO_FILE"`
|
||||
echo "$line"
|
||||
"$TODO_SH" command pri "$line" A
|
||||
fi
|
||||
@@ -1,20 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
action=$1
|
||||
shift
|
||||
|
||||
[ "$action" = "usage" ] && {
|
||||
echo " Add and do:"
|
||||
curcmd=`basename $0`
|
||||
echo " $curcmd \"THING I DID +project @context\""
|
||||
echo " Add an item and mark it as done in one step"
|
||||
echo ""
|
||||
exit
|
||||
}
|
||||
|
||||
if "$TODO_SH" command add "$@"; then
|
||||
# figure out the line of what we just added, and prioritize it A
|
||||
line=`sed -n '$ =' "$TODO_FILE"`
|
||||
echo "$line"
|
||||
"$TODO_SH" command do "$line"
|
||||
fi
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
action=$1
|
||||
shift
|
||||
|
||||
[ "$action" = "usage" ] && {
|
||||
echo " Bird's eye report:"
|
||||
echo " birdseye"
|
||||
echo " generates a textual report of pending and completed tasks in all projects and contexts"
|
||||
echo ""
|
||||
exit
|
||||
}
|
||||
|
||||
[ "$action" = "birdseye" ] && {
|
||||
python ${TODO_ACTIONS_DIR}/birdseye.py "$TODO_FILE" "$DONE_FILE"
|
||||
}
|
||||
@@ -1,202 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
""" TODO.TXT Bird's Eye View Reporter
|
||||
USAGE:
|
||||
birdseye.py [todo.txt] [done.txt]
|
||||
|
||||
USAGE NOTES:
|
||||
Expects two text files as parameters, each of which formatted as follows:
|
||||
- One todo per line, ie, "call Mom"
|
||||
- with an optional project association indicated as such: "+projectname"
|
||||
- with the context in which the tasks should be completed, indicated as such: "@context"
|
||||
- with the task priority optionally listed at the front of the line, in parens, ie, "(A)"
|
||||
|
||||
For example, 4 lines of todo.txt might look like this:
|
||||
|
||||
+garagesale @phone schedule Goodwill pickup
|
||||
(A) @phone Tell Mom I love her
|
||||
+writing draft Great American Novel
|
||||
(B) smell the roses
|
||||
|
||||
The done.txt file is a list of completed todos from todo.txt.
|
||||
|
||||
See more on todo.txt here:
|
||||
http://todotxt.com
|
||||
|
||||
|
||||
OUTPUT:
|
||||
Displays a list of:
|
||||
- working projects and their percentage complete
|
||||
- contexts in which open todos exist
|
||||
- contexts and projects with tasks that have been prioritized
|
||||
- projects which are completely done (don't have any open todos)
|
||||
|
||||
CHANGELOG:
|
||||
2016.03.17 - Update for Python 3. Tx, JonathanReeve!
|
||||
2006.07.29 - Now supports p:, p- and + project notation. Tx, Pedro!
|
||||
2006.05.02 - Released
|
||||
"""
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
__version__ = "1.2"
|
||||
__date__ = "2006/05/02"
|
||||
__updated__ = "2016/03/17"
|
||||
__author__ = "Gina Trapani (ginatrapani@gmail.com)"
|
||||
__copyright__ = "Copyright 2006 - 2016, Gina Trapani"
|
||||
__license__ = "GPL"
|
||||
__history__ = """
|
||||
1.2 - Update for Python 3. Tx, JonathanReeve!
|
||||
1.1 - Now supports p:, p- and + project notation. Tx, Pedro!
|
||||
1.0 - Released.
|
||||
"""
|
||||
|
||||
def usage():
|
||||
print("USAGE: %s [todo.txt] [done.txt]" % (sys.argv[0], ))
|
||||
|
||||
def printTaskGroups(title, taskDict, priorityList, percentages):
|
||||
print("")
|
||||
print("%s"% (title,))
|
||||
separator("-")
|
||||
if not taskDict:
|
||||
print("No items to list.")
|
||||
else:
|
||||
# sort the dictionary by value
|
||||
# http://python.fyxm.net/peps/pep-0265.html
|
||||
items = [(v, k) for k, v in list(taskDict.items())]
|
||||
items.sort()
|
||||
items.reverse() # so largest is first
|
||||
items = [(k, v) for v, k in items]
|
||||
|
||||
for item in items:
|
||||
if item[0] in priorityList:
|
||||
if item[0] not in percentages:
|
||||
printTaskGroup(item, -1, "*")
|
||||
else:
|
||||
printTaskGroup(item, percentages[item[0]], "*")
|
||||
|
||||
for item in items:
|
||||
if item[0] not in priorityList:
|
||||
if item[0] not in percentages:
|
||||
printTaskGroup(item, -1, " ")
|
||||
else:
|
||||
printTaskGroup(item, percentages[item[0]], " ")
|
||||
|
||||
def printTaskGroup(p, pctage, star):
|
||||
if pctage > -1:
|
||||
progressBar = ""
|
||||
numStars = int(pctage//10)
|
||||
progressBar = "=" * numStars
|
||||
numSpaces = 10 - numStars
|
||||
for n in range(numSpaces):
|
||||
progressBar += " "
|
||||
|
||||
if pctage > 9:
|
||||
displayTotal = " %d%%"% (pctage, );
|
||||
else:
|
||||
displayTotal = " %d%%"% (pctage, );
|
||||
print("%s %s [%s] %s (%d todos)"% (star, displayTotal, progressBar, p[0], p[1],))
|
||||
else:
|
||||
print("%s %s (%d todos)"% (star, p[0], p[1], ))
|
||||
|
||||
def separator(c):
|
||||
sep = ""
|
||||
sep = c * 42
|
||||
print(sep)
|
||||
|
||||
|
||||
def main(argv):
|
||||
# make sure you have all your args
|
||||
if len(argv) < 2:
|
||||
usage()
|
||||
sys.exit(2)
|
||||
|
||||
# process todo.txt
|
||||
try:
|
||||
f = open (argv[0], "r")
|
||||
projects = {}
|
||||
contexts = {}
|
||||
projectPriority = []
|
||||
contextPriority = []
|
||||
for line in f:
|
||||
prioritized = False
|
||||
words = line.split()
|
||||
if words and words[0].startswith("("):
|
||||
prioritized = True
|
||||
for word in words:
|
||||
if word[0:2] == "p:" or word[0:2] == "p-" or word[0:1] == "+":
|
||||
if word not in projects:
|
||||
projects[word] = 1
|
||||
else:
|
||||
projects[word] = projects.setdefault(word,0) + 1
|
||||
if prioritized:
|
||||
projectPriority.append(word)
|
||||
if word[0:1] == "@":
|
||||
if word not in contexts:
|
||||
contexts[word] = 1
|
||||
else:
|
||||
contexts[word] = contexts.setdefault(word, 0) + 1
|
||||
if prioritized:
|
||||
contextPriority.append(word)
|
||||
f.close()
|
||||
except IOError:
|
||||
print("ERROR: The file named %s could not be read."% (argv[0], ))
|
||||
usage()
|
||||
sys.exit(2)
|
||||
|
||||
# process done.txt
|
||||
try:
|
||||
completedTasks = {}
|
||||
f = open (argv[1], "r")
|
||||
for line in f:
|
||||
words = line.split()
|
||||
for word in words:
|
||||
if word[0:2] == "p:" or word[0:2] == "p-" or word[0:1] == "+":
|
||||
if word not in completedTasks:
|
||||
completedTasks[word] = 1
|
||||
else:
|
||||
completedTasks[word] = completedTasks.setdefault(word, 0) + 1
|
||||
f.close()
|
||||
except IOError:
|
||||
print("ERROR: The file named %s could not be read."% (argv[1], ))
|
||||
usage()
|
||||
sys.exit(2)
|
||||
|
||||
# calculate percentages
|
||||
projectPercentages = {}
|
||||
for project in projects:
|
||||
openTasks = projects[project]
|
||||
if project in completedTasks:
|
||||
closedTasks = completedTasks[project]
|
||||
else:
|
||||
closedTasks = 0
|
||||
totalTasks = openTasks + closedTasks
|
||||
projectPercentages[project] = (closedTasks*100) / totalTasks
|
||||
|
||||
# get projects all done
|
||||
projectsWithNoIncompletes = {}
|
||||
for task in completedTasks:
|
||||
if task not in projects:
|
||||
projectsWithNoIncompletes[task] = 0
|
||||
|
||||
# print out useful info
|
||||
#print "TODO.TXT Bird's Eye View Report %s"% ( datetime.date.today().isoformat(), )
|
||||
print("")
|
||||
print("TODO.TXT Bird's Eye View Report")
|
||||
|
||||
separator("=")
|
||||
|
||||
printTaskGroups("Projects with Open TODOs", projects, projectPriority, projectPercentages)
|
||||
printTaskGroups("Contexts with Open TODOs", contexts, contextPriority, projectPercentages)
|
||||
printTaskGroups("Completed Projects (No open TODOs)", projectsWithNoIncompletes, projectPriority, projectPercentages)
|
||||
print("")
|
||||
print("* Projects and contexts with an asterisk next to them denote prioritized tasks.")
|
||||
print("Project with prioritized tasks are listed first, then sorted by number of open todos.")
|
||||
print("")
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
||||
@@ -1,199 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
""" TODO.TXT Weekly Review
|
||||
USAGE:
|
||||
weeklyreview.py [todo.txt] [done.txt] [projects.txt]
|
||||
|
||||
USAGE NOTES:
|
||||
Expects three text files as parameters:
|
||||
1 & 2. Properly-formatted todo.txt and done.txt files.
|
||||
3. A projects.txt file which lists one project per line, and any number of #goals associated with it.
|
||||
|
||||
See more on todo.txt here:
|
||||
http://todotxt.com
|
||||
|
||||
OUTPUT:
|
||||
Displays a count of how many tasks were completed associated with a goal.
|
||||
|
||||
"""
|
||||
|
||||
import sys
|
||||
import datetime
|
||||
|
||||
__version__ = "1.2"
|
||||
__date__ = "2016/03/17"
|
||||
__updated__ = "2016/03/17"
|
||||
__author__ = "Gina Trapani (ginatrapani@gmail.com)"
|
||||
__copyright__ = "Copyright 2016, Gina Trapani"
|
||||
__license__ = "GPL"
|
||||
__history__ = """
|
||||
0.1 - WIP
|
||||
"""
|
||||
|
||||
def usage():
|
||||
print("USAGE: %s [todo.txt] [done.txt] [projects.txt]" % (sys.argv[0], ))
|
||||
|
||||
def separator(c, r=42):
|
||||
sep = ""
|
||||
sep = c * r
|
||||
print(sep)
|
||||
|
||||
def printTitle(text):
|
||||
print("")
|
||||
r = len(text)
|
||||
print(text)
|
||||
separator("=", r)
|
||||
|
||||
def printHeader(text):
|
||||
r = len(text)
|
||||
print("")
|
||||
print(text)
|
||||
separator("-", r)
|
||||
|
||||
def main(argv):
|
||||
# make sure you have all your args
|
||||
if len(argv) < 3:
|
||||
usage()
|
||||
sys.exit(2)
|
||||
|
||||
goal_projects = getGoalProjects(argv)
|
||||
#print(goal_projects)
|
||||
|
||||
last_7_days = getLast7Days()
|
||||
#print(last_7_days)
|
||||
|
||||
last_7_days_of_completions = getLast7DaysOfCompletions(argv, last_7_days)
|
||||
#print(last_7_days_of_completions)
|
||||
|
||||
project_completions = getProjectCompletions(argv, last_7_days_of_completions)
|
||||
#print(project_completions)
|
||||
|
||||
goal_completions = getGoalCompletions(goal_projects, project_completions)
|
||||
# print(goal_completions)
|
||||
|
||||
# Print report: For each item in goal_projects, print the goal, the number of tasks completed,
|
||||
# then each project and the number of tasks completed
|
||||
printTitle("Weekly Review for the past 7 days")
|
||||
|
||||
goals_not_moved = []
|
||||
goals_moved = []
|
||||
for goal in goal_projects:
|
||||
total_done = 0
|
||||
if goal in goal_completions:
|
||||
total_done = len(goal_completions[goal])
|
||||
goal_header = goal + " - " + str(total_done) + " done"
|
||||
if total_done > 0:
|
||||
printHeader(goal_header)
|
||||
for project in goal_projects[goal]:
|
||||
if project in project_completions:
|
||||
print(project + " - " + str(len(project_completions[project])) + " done" )
|
||||
for task in project_completions[project]:
|
||||
print(" " + task.strip())
|
||||
goals_moved.append(goal)
|
||||
else:
|
||||
goals_not_moved.append(goal)
|
||||
|
||||
# Print a list of goals that had no movement
|
||||
if len(goals_not_moved) > 0:
|
||||
printTitle("Goals with no progress")
|
||||
for goal in goals_not_moved:
|
||||
print(goal)
|
||||
|
||||
# Print summary
|
||||
print("")
|
||||
summary = str(len(last_7_days_of_completions)) + " completed tasks moved " + str(len(goals_moved)) + " out of " + str(len(goal_projects)) + " goals forward."
|
||||
separator("-", len(summary))
|
||||
print(summary)
|
||||
separator("-", len(summary))
|
||||
|
||||
# Warnings
|
||||
crossCheckCompletedProjects(project_completions, goal_projects)
|
||||
|
||||
|
||||
# Return an array of goals with total tasks completed.
|
||||
def getGoalCompletions(goal_projects, project_completions):
|
||||
goal_completions = {}
|
||||
goals = goal_projects.keys()
|
||||
for goal in goal_projects:
|
||||
for project in project_completions:
|
||||
if project in goal_projects[goal]:
|
||||
if goal not in goal_completions:
|
||||
goal_completions[goal] = project_completions[project]
|
||||
else:
|
||||
goal_completions[goal] = goal_completions[goal] + project_completions[project]
|
||||
return goal_completions
|
||||
|
||||
# Return the goal/project list as an array of arrays goalProjects[goal] = projects[]
|
||||
def getGoalProjects(argv):
|
||||
try:
|
||||
goal_projects = {}
|
||||
f = open (argv[2], "r")
|
||||
for line in f:
|
||||
words = line.split()
|
||||
for word in words:
|
||||
# Project
|
||||
if word[0:1] == "+":
|
||||
current_project = word
|
||||
# Goal
|
||||
if word[0:1] == "#":
|
||||
if word not in goal_projects:
|
||||
goal_projects[word] = [current_project];
|
||||
else:
|
||||
goal_projects[word].append(current_project)
|
||||
f.close()
|
||||
return goal_projects
|
||||
except IOError:
|
||||
print("ERROR: The file named %s could not be read."% (argv[1], ))
|
||||
usage()
|
||||
sys.exit(2)
|
||||
|
||||
|
||||
# Get the last 7 days as an array of todo.txt-formatted dates.
|
||||
def getLast7Days():
|
||||
today = datetime.date.today()
|
||||
last7Days = []
|
||||
for d in range(8):
|
||||
day_this_week = today - datetime.timedelta(days=d)
|
||||
last7Days.append(day_this_week.strftime('%Y-%m-%d'))
|
||||
return last7Days
|
||||
|
||||
# Return last 7 days of completed tasks from done.txt
|
||||
def getLast7DaysOfCompletions(argv, last_7_days):
|
||||
try:
|
||||
last_7_days_of_completions = []
|
||||
f = open (argv[1], "r")
|
||||
for line in f:
|
||||
words = line.split()
|
||||
if len(words) > 2 and words[1] in last_7_days:
|
||||
last_7_days_of_completions.append(line)
|
||||
f.close()
|
||||
return last_7_days_of_completions
|
||||
except IOError:
|
||||
print("ERROR: The file named %s could not be read."% (argv[1], ))
|
||||
usage()
|
||||
sys.exit(2)
|
||||
|
||||
# Return an array of projects with the total tasks completed.
|
||||
def getProjectCompletions(argv, last_7_days_of_completions):
|
||||
project_completions = {}
|
||||
for task in last_7_days_of_completions:
|
||||
words = task.split()
|
||||
for word in words:
|
||||
if word[0:2] == "p:" or word[0:2] == "p-" or word[0:1] == "+":
|
||||
if word not in project_completions:
|
||||
project_completions[word] = [task]
|
||||
else:
|
||||
project_completions[word].append(task)
|
||||
return project_completions
|
||||
|
||||
def crossCheckCompletedProjects(project_completions, goal_projects):
|
||||
for project in project_completions:
|
||||
goal_in_project = False
|
||||
for goal in goal_projects:
|
||||
if project in goal_projects[goal]:
|
||||
goal_in_project = True
|
||||
if goal_in_project == False:
|
||||
print("WARNING: Project " + project + " not in goal.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
||||
511
CHANGELOG.md
Normal file
511
CHANGELOG.md
Normal file
@@ -0,0 +1,511 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [2.12.0] - 2020-08-11
|
||||
|
||||
### Added
|
||||
|
||||
- Added default priority variable `TODOTXT_PRIORITY_ON_ADD` ([#246])
|
||||
- Added `done` option as alias of `do` ([#169])
|
||||
- Added macOS 10.15.x support ([#300])
|
||||
- Highlighting of dates, metadata and item numbers ([#264])
|
||||
- Minimal config file / default filenames (todo.txt, done.txt, report.txt) ([#289])
|
||||
- Enable file completion for add-on actions via `_todo_file{1,2,3}_actions` ([#270])
|
||||
- Allow to customize what can be before / inside / after `+project` and `@context` ([#271])
|
||||
|
||||
### Changed
|
||||
|
||||
- Read the task's name and uses as default ([#249])
|
||||
- Updated interpreter reference to use environment variable ([#160])
|
||||
- Allow setting of bash completion path ([#301])
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fixed no end-of-line bug. Supports todos with no end-of-line. ([#295])
|
||||
|
||||
## [2.11.0] - 2018-03-26
|
||||
|
||||
### Added
|
||||
|
||||
- Added support for `$XDG_CONFIG_HOME` config file/actions location
|
||||
- Created [CODE_OF_CONDUCT.md](.github/CODE_OF_CONDUCT.md) ([#217])
|
||||
- Created [CHANGELOG.md](/CHANGELOG.md) ([#218])
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated `add` command to accept lowercase priority ([#230])
|
||||
- Clean tests and version file in Makefile. Don't ignore errors in tests.
|
||||
- Updated [README.md](/README.md) ([#219])
|
||||
- Update Downloads links to point at the Releases page ([#228])
|
||||
- Set the executable bit when preparing releases ([#156])
|
||||
|
||||
### Fixes
|
||||
|
||||
- Update links to use https
|
||||
- Suppress todo.sh error messages when invoked during completion ([#8])
|
||||
|
||||
## [2.10.0] - 2013-12-06
|
||||
|
||||
### Added
|
||||
|
||||
- Enable term filtering for listcon.
|
||||
- Add make install command.
|
||||
- Enable use of global config file in `/etc/todo/config`. `make install` installs a global config file.
|
||||
- Allow use of `post_filter_command` for `listall` and `listpri`.
|
||||
- Print usage help for custom action and all passed actions.
|
||||
- Allow configuring null data files (done.txt and report.txt) and don't create
|
||||
them.
|
||||
- Color contexts and projects without an add-on, just by setting vars in the
|
||||
config file.
|
||||
- Place add-ons in subfolders (for easier git clone).
|
||||
|
||||
### Changed
|
||||
|
||||
- Improve code commenting/documentation.
|
||||
- Refactor code for speed/better organization.
|
||||
- Improve test coverage and test library.
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed add date from line completion, ie, `todo.sh ls 10[tab]`.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Properly replace date when replacing task with priority and date.
|
||||
- Handle `-h`, `shorthelp`, and `help` when a Fatal Error happens.
|
||||
- Fix `todo_completion` problem with Bash 3.1.
|
||||
|
||||
## [2.9.0] - 2012-04-08
|
||||
|
||||
### Added
|
||||
|
||||
- Added tab auto-completion of projects and contexts from `todo.txt` and `done.txt`. Type `@<Tab>` or `+<Tab>` while entering a task.
|
||||
- Added new listaddons command displays installed addons.
|
||||
- List priorities within a range using listpri. For example, to see tasks prioritized A-B, use `todo.sh listpri A-B`
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed various cosmetic issues, bugs, and added developer test library enhancements.
|
||||
|
||||
## [2.8.0] - 2011-09-13
|
||||
|
||||
### Added
|
||||
|
||||
- `listpri`/`lsp` now filters by term. For example, `todo.sh lsp A book` will only return tasks prioritized `A` with the word book in them.
|
||||
- Added support for todo directory paths with spaces in them.
|
||||
- Tasks with priority included and auto prepend date on (`-t`) get the date where expected.
|
||||
- Smarter action completion messaging: `do`, `pri`, and `depri` all let you know if a task is already done, prioritized, or deprioritized.
|
||||
- Made more parameters available to offer more control to custom actions (`-c`, `-A`, `-N`, `-T`)
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved portability for Dropbox or USB key users. If not specified, todo.sh checks for a config file in its own directory; default todo.txt location is todo.sh's directory.
|
||||
- Improved script performance thanks to optimized code
|
||||
- Exposed `cleaninput()` for use in addons
|
||||
- Improved testing framework:
|
||||
- Better escaped input handling
|
||||
- Abstracted make_action function to test custom action behavior
|
||||
- Added tests for source code compliance
|
||||
- Cleaner, simpler, modernized, optimized code
|
||||
|
||||
### Fixed
|
||||
|
||||
- Custom action output no longer prefaced by `TODO:` so it's easier to see when the core script vs. addon is performing an action
|
||||
- `listpri` complains if specified priority is invalid
|
||||
- Don't abort task listing when items contain certain escape sequences (`\c \033`)
|
||||
- Condense whitespace ONLY whe task is quoted; automatically convert CRLF to space
|
||||
- Don't delete `|` (pipe) from task input
|
||||
- `-+` and `-@` no longer break task coloring if context or project appears at the end of the line
|
||||
|
||||
## [2.7.0] - 2010-08-03
|
||||
|
||||
### Added
|
||||
|
||||
- Added generalization of the _PRI_X_ color support to all priorities
|
||||
- Added highlighting of done, but not yet archived tasks via _COLOR_DONE_
|
||||
- Color map (BLACK, ...) now supports spaces in the color definitions, making it possible to override the default ANSI escape codes with e.g. Conky tags (`${color black}`)
|
||||
|
||||
### Changed
|
||||
|
||||
- Cleanup: help messages, consistent output messages
|
||||
- Exporting `die()` function for use in custom commands
|
||||
- `prepend` and `replace` actions keep prepended date, `append` considers sentence delimiters
|
||||
- Tests: several regression tests added
|
||||
|
||||
## [2.6.0] - 2010-05-11
|
||||
|
||||
### Added
|
||||
|
||||
- Added a case for the fixed replace command.
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed odd tabs to spaces.
|
||||
- Faster help/usage document outputs.
|
||||
- Consolidated `TODOTXT_VERBOSE` tests.
|
||||
- Refactored various add functionality to one function.
|
||||
- Updated `_list()` output to match updated `addto`.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Quoting regexp to parse properly.
|
||||
- Fixed erroneous hide/show comments.
|
||||
- Correctly fixed regexp quoting issue for bash v3.1.x and v3.2.x.
|
||||
- Old versions of bash do not have `=~`
|
||||
- Fix line endings.
|
||||
- Fixed bug for replace command.
|
||||
|
||||
## [2.5.0] - 2010-05-05
|
||||
|
||||
### Added
|
||||
|
||||
- Support use of `$HOME/.todo/` for all todo.sh configuration
|
||||
- Added new multiple do capability to help message
|
||||
- Added option to disable final filter
|
||||
- Added a new variable `$TODO_FULL_SH`
|
||||
- Added new action `addm`
|
||||
- Added support PAGER pipe for help output
|
||||
- Added some additional mappings, plus a project context
|
||||
|
||||
### Changed
|
||||
|
||||
- Added 'silent' to a bunch of calls
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixing prepend and priority issue.
|
||||
- Replace with `priority` set
|
||||
- Multiple `do` items
|
||||
- `prepend` not correct on prioritized tasks
|
||||
- Invalid date range. Changed regex `[ -~]` to `[ ~-]`.
|
||||
- `do`: no safeguard to `do` twice. Tests item is not marked done before attempting to mark item as "done".
|
||||
- Fixed `add` does not escape line breaks
|
||||
- `append` and `replace` unexpected behavior if there's an `&` in task (even in quotes)
|
||||
- Tasks whose `ID` begins with `0` ought to be ignored.
|
||||
- Fixed auto-complete function name for contexts
|
||||
|
||||
## [2.4.0] - 2009-05-11
|
||||
|
||||
### Added
|
||||
|
||||
- Added support for `TODOTXT_FINAL_FILTER` to provide a final custom list filter.
|
||||
- Added support for custom sorting (can set in `todo.cfg`)
|
||||
- Added parameterize for `.todo.actions.d` directory
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed annoying trailing space on `pri` tasks
|
||||
- Don't set colors in default `todo.cfg`.
|
||||
- Don't set sort command in default `todo.cfg`.
|
||||
|
||||
### Fixed
|
||||
|
||||
- `listcon` and `listproj` now work correctly on Mac OS X 10.5
|
||||
- `pri` accepted priorities of more than a single letter
|
||||
- Support commands combination for `TODOTXT_SORT_COMMAND`; e.g. piped commands can be used: `export TODOTXT_SORT_COMMAND=" env LC_COLLATE=C sort -f -k2 - | grep -m 10 ."`
|
||||
- Replace now echoes old item AND new item, like it used to.
|
||||
- `depri` no longer wipes out tasks with more than just the priority in parentheses
|
||||
- Now throws an error if you try to prioritize with more than one letter, ie, `todo.sh pri AA` doesn't work any more.
|
||||
|
||||
## [2.3.0] - 2009-04-02
|
||||
|
||||
### Added
|
||||
|
||||
- Added hide priority, context, and projects options now enabled `-P`, `-@` and `-+`
|
||||
- Enabled recursive call of todo.sh from add-ons
|
||||
- Exported variables for use in add-ons
|
||||
- Added `-vv` option for debugging output
|
||||
- Added short usage statement (that fits on one screen) with `-h`
|
||||
- Added Makefile dist infrastructure for versioned releases in Downloads area on GitHub
|
||||
|
||||
### Changed
|
||||
|
||||
- Separated `_list` function for reuse by various versions of list command to reduce duplicate code
|
||||
- Set `ls` as the default action
|
||||
|
||||
## [2.2.0] - 2009-03-??
|
||||
|
||||
### Fixed
|
||||
|
||||
- For awhile here during the GitHub transition, we stripped the version number from todo.sh and updated it kind of willy-nilly, so we're back-versioning all unversioned copies v 2.2.
|
||||
|
||||
## [2.1.0] - 2009-02-23
|
||||
|
||||
### Added
|
||||
|
||||
- Added "pluggability" with `~/.todo.actions.d/` support (via [Tammy and Ed](http://tech.groups.yahoo.com/group/todotxt/message/1739))
|
||||
- Added `-t` param, off by default. When specified, it automatically prepends the current date to new todo's on add
|
||||
- Searches for more Unix-y `~/.todo.cfg` if `~/todo.cfg` doesn't exist (via [Ed](http://tech.groups.yahoo.com/group/todotxt/message/1767))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Corrected "ambiguous redirect" bug with done file (via [Jeff](http://tech.groups.yahoo.com/group/todotxt/message/1764))
|
||||
- Corrected usage and help message with new params
|
||||
- Corrected config file miscomment about colors
|
||||
|
||||
## [2.0.1] - 2009-02-17
|
||||
|
||||
### Fixed
|
||||
|
||||
- Restored `-d` parameter functionality broken in 2.0 (d'oh, thanks Jason, you made the changelog! )
|
||||
|
||||
## [2.0.0] - 2009-02-17
|
||||
|
||||
### Added
|
||||
|
||||
- Added `addto [DEST] "Text to add"` will append text to any file in the todo directory, like `ideas.txt` or `maybelater.txt`.
|
||||
- Added `mv # [DEST]` will move a task from `todo.txt` to another file `[DEST]` in the todo directory, like if you decide your `"Learn French"` task should go into your `maybelater.txt` file.
|
||||
- `depri #` removes priority from a task.
|
||||
- `rm # [TERM]` or `del # [TERM]` will delete just the `[TERM]` from the task on line # in todo.txt.
|
||||
- `listfile [SRC] [TERM]` or `lf [SRC] [TERM]` will list the contents of any text file in the todo directory, and filter by keyword `[TERM]`.
|
||||
- `listcon` (`lsc`) and `listproj` (`lsprj`) lists contexts and projects, respectively, that appear in todo.txt. (Requires `gawk`)
|
||||
- On task deletion, line number preservation is on by default (known issue, leaves blank lines). Optional, can be turned off with `-n` option.
|
||||
- Auto-archive on task completion is now on by default; can be turned off with `-a` parameter.
|
||||
|
||||
### Changed
|
||||
|
||||
- Separated config file into a non hidden dot file.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Better error handling throughout for all commands.
|
||||
- Archive now defrags the file (removes blank lines; see line preservation option.)
|
||||
- Using `/bin/bash` instead of `/bin/sh`
|
||||
|
||||
## [1.7.3] - 2006-07-29
|
||||
|
||||
### Added
|
||||
|
||||
- Added short action aliases – `add/a`, `list/ls`, `listpri/lsp`, `listall/lsa`, `prepend/prep`, `append/app`, `del/rm`
|
||||
|
||||
## [1.7.2] - 2006-07-28
|
||||
|
||||
### Added
|
||||
|
||||
- `listpri` automatically capitalizes lowercase priorities
|
||||
- `listpri` now displays friendly error message, and the # of tasks returned in verbose mode
|
||||
|
||||
### Changed
|
||||
|
||||
- `do` action removes priority from task automatically
|
||||
Update:
|
||||
|
||||
### Fixed
|
||||
|
||||
- Actions are now case-insensitive (ie, `todo.sh Add` will work)
|
||||
|
||||
## [1.7.1] - 2006-07-21
|
||||
|
||||
### Changed
|
||||
|
||||
- I'm a big dummy and didn't keep track of what I fixed here. Sorry!
|
||||
|
||||
## [1.7.0] - 2006-07-19
|
||||
|
||||
### Added
|
||||
|
||||
- Interactive `add`, `append`, `prepend`, and `replace` (tx, Ben!)
|
||||
- Action `listall` displays tasks from both todo.txt and done.txt
|
||||
- Option `-f` forces delete action and disables interactive input (for todobot.pl)
|
||||
- Option `-h` displays full help message.
|
||||
|
||||
### Deprecated
|
||||
|
||||
- Option `-q` deprecated; Use `-v` to turn on verbose mode
|
||||
|
||||
### Changed
|
||||
|
||||
- A very short version of usage message displays by default instead of the long version.
|
||||
- Comment in info about `.todo` file being required
|
||||
|
||||
### Fixed
|
||||
|
||||
- No colors display for done tasks (tx, Tanja!)
|
||||
- Sort is now case-insensitive (tx, Lonnie!)
|
||||
|
||||
## [1.6.3] - 2006-07-06
|
||||
|
||||
### Added
|
||||
|
||||
- Line numbers now padded, up to 100 characters. (tx, Tanja!)
|
||||
|
||||
## [1.6.2] - 2006-07-05
|
||||
|
||||
### Fixed
|
||||
|
||||
- Windows config files with spaces now work (tx Ron)
|
||||
|
||||
## [1.6.1] - 2006-07-05
|
||||
|
||||
### Changed
|
||||
|
||||
- The default location of your `.todo` file is now `$HOME/.todo`
|
||||
|
||||
### Fixed
|
||||
|
||||
- No colors mode (`-p`) now works as expected
|
||||
|
||||
## [1.6.0] - 2006-07-04
|
||||
|
||||
### Added
|
||||
|
||||
- Action `prepend` adds text to an item at the beginning of the line.
|
||||
- Configuration file is now separated from script into `.todo` file
|
||||
- Specify a config file other than `.todo` using the `-d` option
|
||||
- Option `-q` quiets todo.sh's chattiness.
|
||||
- Option `-V` shows version and license information.
|
||||
|
||||
### Changed
|
||||
|
||||
- The option to turn off colors is now `-p` (no longer `-nc` as in 1.5.2)
|
||||
|
||||
## [1.5.2] - 2006-06-26
|
||||
|
||||
### Fixed
|
||||
|
||||
- Items that start with `x ` (an x with a space after) are archived now to avoid lines that start with a word like `xander` from being archived. (tx, Tannie!)
|
||||
- Report now only archives items that start with `x ` as well.
|
||||
|
||||
## [1.5.1] - 2006-06-26
|
||||
|
||||
### Fixed
|
||||
|
||||
- Items with an `x` in them at all were being deleted on archive with 1.5; all fixed now.
|
||||
|
||||
## [1.5.0] - 2006-06-24
|
||||
|
||||
### Added
|
||||
|
||||
- Option to turn off colors (to avoid characters in piped text files or IM bot), ie `todo.sh -nc [COMMAND]`
|
||||
- A date is added to a completed todo, ie `x 2006-06-24` (tx SETH)
|
||||
- Action `remdup` removes exact duplicate lines from todo.txt (tx Tannie)
|
||||
- Action `del` removes any blank lines from todo.txt (tx Tannie)
|
||||
|
||||
### Changed
|
||||
|
||||
- Using `sed -i` instead of copying tmp file (tx Tannie)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Colors show in OS/X 10.4 (tx SETH & misha)
|
||||
|
||||
## [1.4.0] - 2006-06-17
|
||||
|
||||
### Added
|
||||
|
||||
- Tasks are color-coded by priority in Cygwin (Thanks, Abraham, Manuel and Luis!)
|
||||
|
||||
### Changed
|
||||
|
||||
- Switched endless `if-then` to a `case` statement, and tightened up `wc -l` regex. (Thanks, Sash!)
|
||||
|
||||
### Fixed
|
||||
|
||||
- If you `replace`/`do`/`append` to a non-existent task, your todo.txt is no longer overwritten and the error is handled gracefully. (Thanks, Scott!)
|
||||
|
||||
## [1.3.0] - 2006-05-29
|
||||
|
||||
### Added
|
||||
|
||||
- Displays the number of newly added todo (Thanks, Amy!)
|
||||
- Confirms whether or not you really want to delete a todo
|
||||
- Displays success messages and confirmations on `append`, `replace`, `do`, etc.
|
||||
- Added licensing information in comments. GPL, baby!
|
||||
|
||||
### Changed
|
||||
|
||||
- Alphabetized command workflow in if/then construction
|
||||
- Tightened up `sed` commands, removed unnecessary `grep`s and `cat`s (Thanks, Sash!)
|
||||
- Stripped whitespace around number lines from wc results
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed filenames from `report.txt` format, for easier graphing or Excel imports.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Todos are now sorted alphabetically when listed by a term. (ie: `todo list flowers)
|
||||
|
||||
## [1.2.0] - 2006-05-15
|
||||
|
||||
### Added
|
||||
|
||||
- `list` is case insensitive. ie, `todo list Mac` will match lines with "mac" and "Mac"
|
||||
|
||||
### Changed
|
||||
|
||||
- `todo list` matches multiple [TERM]s. ie, `todo list mac offline` will match all lines that contain the words "mac" and "offline"
|
||||
- `repri` and `pri` actions combined into `pri` action (Thanks Mike!)
|
||||
- Quotes no longer required with `add` and `replace` (Thanks Karl!)
|
||||
- Any priority added to a todo must be uppercase to preserve sort order, enforced now. ie `todo pri 1 a` will return a usage error.
|
||||
|
||||
### Fixed
|
||||
|
||||
- File "sanity checks" and cleanup function, test script and various fantastic stylistic improvements added. Extra big thanks to Karl!
|
||||
|
||||
## [1.1.0] - 2006-05-12
|
||||
|
||||
### Added
|
||||
|
||||
- Supports file paths with spaces (ie `C:\Documents and Settings\gina\todo.txt`)
|
||||
|
||||
## 1.0.0 - 2006-05-11
|
||||
|
||||
### Added
|
||||
|
||||
- Consolidated into one master script with usage notes and released.
|
||||
|
||||
[Unreleased]: https://github.com/todotxt/todo.txt-cli/compare/v2.12.0...HEAD
|
||||
[2.12.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.11.0...v2.12.0
|
||||
[2.11.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.10.0...v2.11.0
|
||||
[2.10.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.9.0...v2.10.0
|
||||
[2.9.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.8.0...v2.9.0
|
||||
[2.8.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.7.0...v2.8.0
|
||||
[2.7.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.6.0...v2.7.0
|
||||
[2.6.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.5.0...v2.6.0
|
||||
[2.5.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.4.0...v2.5.0
|
||||
[2.4.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.3.0...v2.4.0
|
||||
[2.3.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.2.0...v2.3.0
|
||||
[2.2.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.1.0...v2.2.0
|
||||
[2.1.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.0.1...v2.1.0
|
||||
[2.0.1]: https://github.com/todotxt/todo.txt-cli/compare/v2.0.0...v2.0.1
|
||||
[2.0.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.3...v2.0.0
|
||||
[1.7.3]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.2...v1.7.3
|
||||
[1.7.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.1...v1.7.2
|
||||
[1.7.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.0...v1.7.1
|
||||
[1.7.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.3...v1.7.0
|
||||
[1.6.3]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.2...v1.6.3
|
||||
[1.6.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.1...v1.6.2
|
||||
[1.6.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.0...v1.6.1
|
||||
[1.6.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.2...v1.6.0
|
||||
[1.5.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.1...v1.5.2
|
||||
[1.5.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.0...v1.5.1
|
||||
[1.5.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.4.0...v1.5.0
|
||||
[1.4.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.3.0...v1.4.0
|
||||
[1.3.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.2.0...v1.3.0
|
||||
[1.2.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.1.0...v1.2.0
|
||||
[1.1.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.0.0...v1.1.0
|
||||
[#8]: https://github.com/todotxt/todo.txt-cli/pull/8
|
||||
[#156]: https://github.com/todotxt/todo.txt-cli/pull/156
|
||||
[#160]: https://github.com/todotxt/todo.txt-cli/pull/160
|
||||
[#169]: https://github.com/todotxt/todo.txt-cli/pull/169
|
||||
[#217]: https://github.com/todotxt/todo.txt-cli/pull/217
|
||||
[#218]: https://github.com/todotxt/todo.txt-cli/pull/218
|
||||
[#219]: https://github.com/todotxt/todo.txt-cli/pull/219
|
||||
[#228]: https://github.com/todotxt/todo.txt-cli/pull/228
|
||||
[#230]: https://github.com/todotxt/todo.txt-cli/pull/230
|
||||
[#246]: https://github.com/todotxt/todo.txt-cli/pull/246
|
||||
[#249]: https://github.com/todotxt/todo.txt-cli/pull/249
|
||||
[#264]: https://github.com/todotxt/todo.txt-cli/pull/264
|
||||
[#270]: https://github.com/todotxt/todo.txt-cli/pull/270
|
||||
[#271]: https://github.com/todotxt/todo.txt-cli/pull/271
|
||||
[#289]: https://github.com/todotxt/todo.txt-cli/pull/289
|
||||
[#295]: https://github.com/todotxt/todo.txt-cli/pull/295
|
||||
[#300]: https://github.com/todotxt/todo.txt-cli/pull/300
|
||||
[#301]: https://github.com/todotxt/todo.txt-cli/pull/301
|
||||
@@ -8,7 +8,7 @@ LF='
|
||||
'
|
||||
|
||||
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
|
||||
*$LF*) (exit 1) ;;
|
||||
v[0-9]*)
|
||||
@@ -34,5 +34,3 @@ test "$VN" = "$VC" || {
|
||||
echo >&2 "VERSION=$VN"
|
||||
echo "VERSION=$VN" >$VF
|
||||
}
|
||||
|
||||
|
||||
|
||||
674
LICENSE
Normal file
674
LICENSE
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
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.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
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,
|
||||
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
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
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
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
62
Makefile
62
Makefile
@@ -2,6 +2,37 @@
|
||||
# Makefile for todo.txt
|
||||
#
|
||||
|
||||
SHELL = /bin/sh
|
||||
|
||||
INSTALL = /usr/bin/install
|
||||
INSTALL_PROGRAM = $(INSTALL)
|
||||
INSTALL_DATA = $(INSTALL) -m 644
|
||||
|
||||
prefix = /usr/local
|
||||
|
||||
# ifdef check allows the user to pass custom dirs
|
||||
# as per the README
|
||||
|
||||
# The directory to install todo.sh in.
|
||||
ifdef INSTALL_DIR
|
||||
bindir = $(INSTALL_DIR)
|
||||
else
|
||||
bindir = $(prefix)/bin
|
||||
endif
|
||||
|
||||
# The directory to install the config file in.
|
||||
ifdef CONFIG_DIR
|
||||
sysconfdir = $(CONFIG_DIR)
|
||||
else
|
||||
sysconfdir = $(prefix)/etc
|
||||
endif
|
||||
|
||||
ifdef BASH_COMPLETION
|
||||
datarootdir = $(BASH_COMPLETION)
|
||||
else
|
||||
datarootdir = $(prefix)/share/bash_completion.d
|
||||
endif
|
||||
|
||||
# Dynamically detect/generate version file as necessary
|
||||
# This file will define a variable called VERSION.
|
||||
.PHONY: .FORCE-VERSION-FILE
|
||||
@@ -13,22 +44,42 @@ VERSION-FILE: .FORCE-VERSION-FILE
|
||||
todo.sh: VERSION-FILE
|
||||
|
||||
# For packaging
|
||||
DISTFILES := todo.cfg
|
||||
DISTFILES := todo.cfg todo_completion
|
||||
|
||||
DISTNAME=todo.txt_cli-$(VERSION)
|
||||
dist: $(DISTFILES) todo.sh
|
||||
mkdir -p $(DISTNAME)
|
||||
cp -f $(DISTFILES) $(DISTNAME)/
|
||||
sed -e 's/@DEV_VERSION@/'$(VERSION)'/' todo.sh > $(DISTNAME)/todo.sh
|
||||
tar cf $(DISTNAME).tar $(DISTNAME)/
|
||||
chmod +x $(DISTNAME)/todo.sh
|
||||
tar cf $(DISTNAME).tar $(DISTNAME)
|
||||
gzip -f -9 $(DISTNAME).tar
|
||||
zip -9r $(DISTNAME).zip $(DISTNAME)/
|
||||
zip -r -9 $(DISTNAME).zip $(DISTNAME)
|
||||
rm -r $(DISTNAME)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
clean: test-pre-clean
|
||||
rm -f $(DISTNAME).tar.gz $(DISTNAME).zip
|
||||
rm VERSION-FILE
|
||||
|
||||
install: installdirs
|
||||
$(INSTALL_PROGRAM) todo.sh $(DESTDIR)$(bindir)/todo.sh
|
||||
$(INSTALL_DATA) todo_completion $(DESTDIR)$(datarootdir)/todo.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)/todo
|
||||
rm -f $(DESTDIR)$(sysconfdir)/todo/config
|
||||
|
||||
rmdir $(DESTDIR)$(datarootdir)
|
||||
rmdir $(DESTDIR)$(sysconfdir)/todo
|
||||
|
||||
installdirs:
|
||||
mkdir -p $(DESTDIR)$(bindir) \
|
||||
$(DESTDIR)$(sysconfdir)/todo \
|
||||
$(DESTDIR)$(datarootdir)
|
||||
|
||||
#
|
||||
# Testing
|
||||
@@ -42,7 +93,7 @@ test-pre-clean:
|
||||
aggregate-results: $(TESTS)
|
||||
|
||||
$(TESTS): test-pre-clean
|
||||
-cd tests && sh $(notdir $@) $(TEST_OPTIONS)
|
||||
cd tests && ./$(notdir $@) $(TEST_OPTIONS)
|
||||
|
||||
test: aggregate-results
|
||||
tests/aggregate-results.sh tests/test-results/t*-*
|
||||
@@ -50,3 +101,4 @@ test: aggregate-results
|
||||
|
||||
# Force tests to get run every time
|
||||
.PHONY: test test-pre-clean aggregate-results $(TESTS)
|
||||
|
||||
|
||||
112
README.md
Normal file
112
README.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# [][website]
|
||||
|
||||
> A simple and extensible shell script for managing your todo.txt file.
|
||||
|
||||

|
||||
[](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] if you're looking to contribute (issues/PRs/etc).*
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
### Download
|
||||
Download the latest stable [release][release] for use on your desktop or server.
|
||||
|
||||
### OS X / macOS
|
||||
|
||||
```shell
|
||||
brew install todo-txt
|
||||
|
||||
# For macOS on x86 CPU
|
||||
cp -n /usr/local/opt/todo-txt/todo.cfg ~/.todo.cfg
|
||||
|
||||
# For macOS on arm CPU
|
||||
cp -n /opt/homebrew/opt/todo-txt/todo.cfg ~/.todo.cfg
|
||||
```
|
||||
|
||||
**Note**: The `-n` flag for `cp` makes sure you do not overwrite an existing file.
|
||||
|
||||
### Linux
|
||||
|
||||
#### From command line
|
||||
|
||||
```shell
|
||||
make
|
||||
make install
|
||||
make test
|
||||
```
|
||||
|
||||
*NOTE:* Makefile defaults to several default paths for installed files. Adjust to your system:
|
||||
|
||||
- `INSTALL_DIR`: PATH for executables (default /usr/local/bin)
|
||||
- `CONFIG_DIR`: PATH for 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=/usr/share/bash-completion/completions
|
||||
```
|
||||
|
||||
#### Arch Linux (AUR)
|
||||
|
||||
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]
|
||||
```
|
||||
|
||||
For example, to add a todo item, you can do:
|
||||
|
||||
```shell
|
||||
todo.sh add "THING I NEED TO DO +project @context"
|
||||
```
|
||||
|
||||
Read about all the possible commands in the [USAGE][USAGE] file.
|
||||
|
||||
|
||||
## Release History
|
||||
|
||||
See [CHANGELOG.md][CHANGELOG]
|
||||
|
||||
|
||||
## Support
|
||||
|
||||
- [Github Discussions](https://github.com/todotxt/todo.txt-cli/discussions)
|
||||
- [Stack Overflow](https://stackoverflow.com/questions/tagged/todotxt)
|
||||
- [Twitter](https://twitter.com/todotxt)
|
||||
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
[Contributor Code of Conduct][CODE_OF_CONDUCT]. By participating in this project you agree to abide by its terms.
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome all contributions. First read our [Contributor Code of Conduct][CODE_OF_CONDUCT] and then get started [contributing][CONTRIBUTING].
|
||||
|
||||
## License
|
||||
|
||||
GNU General Public License v3.0 © [todo.txt org][github]
|
||||
|
||||
|
||||
|
||||
[release]: https://github.com/todotxt/todo.txt-cli/releases
|
||||
[website]: http://todotxt.org/
|
||||
[github]: https://github.com/todotxt
|
||||
[USAGE]: ./USAGE.md
|
||||
[CHANGELOG]: ./CHANGELOG.md
|
||||
[CODE_OF_CONDUCT]: .github/CODE_OF_CONDUCT.md
|
||||
[CONTRIBUTING]: .github/CONTRIBUTING.md
|
||||
@@ -1,26 +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":http://wiki.github.com/ginatrapani/todo.txt-cli/todosh-add-on-directory
|
||||
* "Changelog":http://wiki.github.com/ginatrapani/todo.txt-cli/todosh-changelog
|
||||
* "Known Bugs":http://wiki.github.com/ginatrapani/todo.txt-cli/known-bugs
|
||||
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 one of the defaults (e.g. `~/.todo/config`)
|
||||
|
||||
### `-f`
|
||||
Forces actions without confirmation or interactive input.
|
||||
|
||||
### `-h`
|
||||
Display a short help message; same as action "shorthelp"
|
||||
|
||||
### `-p`
|
||||
Plain mode turns off colors
|
||||
|
||||
### `-P`
|
||||
Hide priority labels in list output. Use twice to show priority labels (default).
|
||||
|
||||
### `-a`
|
||||
Don't auto-archive tasks automatically on completion
|
||||
|
||||
### `-A`
|
||||
Auto-archive tasks automatically on completion
|
||||
|
||||
### `-n`
|
||||
Don't preserve line numbers; automatically remove blank lines on task deletion.
|
||||
|
||||
### `-N`
|
||||
Preserve line numbers
|
||||
|
||||
### `-t`
|
||||
Prepend the current date to a task automatically when it's added.
|
||||
|
||||
### `-T`
|
||||
Do not prepend the current date to a task automatically when it's added.
|
||||
|
||||
### `-v`
|
||||
Verbose mode turns on confirmation messages
|
||||
|
||||
### `-vv`
|
||||
Extra verbose mode prints some debugging information and additional help text
|
||||
|
||||
### `-V`
|
||||
Displays version, license and credits
|
||||
|
||||
### `-x`
|
||||
Disables `TODOTXT_FINAL_FILTER`
|
||||
124
tests/README
124
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.
|
||||
|
||||
@@ -125,18 +125,18 @@ Writing Tests
|
||||
-------------
|
||||
|
||||
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:
|
||||
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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:
|
||||
|
||||
@@ -176,6 +176,41 @@ Test harness library
|
||||
There are a handful helper functions defined in the test harness
|
||||
library for your script to use.
|
||||
|
||||
- test_todo_session <message> < transcript
|
||||
|
||||
This takes a single string as a parameter, which is treated
|
||||
as a base description of what is being tested, and then
|
||||
reads from standard input a transcript of todo.sh commands
|
||||
and expected output. Each command is run in the current
|
||||
test environment and the output is compared with the
|
||||
expected output. (See below for how to generate transcripts
|
||||
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]
|
||||
|
||||
The test harness has an internal view of time which is
|
||||
implemented by wrapping the date command. This takes a single
|
||||
optional positive integer parameter which indicates how much
|
||||
to advance the internal time. The default value is one day.
|
||||
|
||||
- test_expect_success <message> <script>
|
||||
|
||||
This takes two strings as parameter, and evaluates the
|
||||
@@ -184,9 +219,16 @@ 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>
|
||||
|
||||
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>
|
||||
|
||||
@@ -211,9 +253,31 @@ library for your script to use.
|
||||
exit with an appropriate error code.
|
||||
|
||||
|
||||
Generating test transcripts
|
||||
---------------------------
|
||||
|
||||
You can generate test scripts from screenshots as following:
|
||||
|
||||
$ ./testshell.sh
|
||||
|
||||
You'll be in a special test environment with an empty todo.txt
|
||||
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 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.
|
||||
|
||||
Don't use "script" as this would log every keystroke, not only what's
|
||||
visible!!
|
||||
|
||||
|
||||
Credits
|
||||
-------
|
||||
|
||||
This test framework was derived from the framework used by
|
||||
git itself, written originally by Junio Hamano and licensed
|
||||
for use under the GPL.
|
||||
for use under the GPL. It was specialized for todo.txt-cli
|
||||
by Emil Sit and Philippe Teuwen.
|
||||
|
||||
48
tests/actions-test-lib.sh
Normal file
48
tests/actions-test-lib.sh
Normal file
@@ -0,0 +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
|
||||
[ -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"
|
||||
[ -z "$1" ] || make_dummy_action ".todo.actions.d/$1/$1" "in folder $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
|
||||
}
|
||||
@@ -1,4 +1,57 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
[ "x$TERM" != "xdumb" ] && (
|
||||
export TERM &&
|
||||
[ -t 1 ] &&
|
||||
tput bold >/dev/null 2>&1 &&
|
||||
tput setaf 1 >/dev/null 2>&1 &&
|
||||
tput sgr0 >/dev/null 2>&1
|
||||
) &&
|
||||
color=t
|
||||
|
||||
case "$1" in
|
||||
--no-color)
|
||||
color=; shift ;;
|
||||
esac
|
||||
|
||||
if test -n "$color"; then
|
||||
say_color() {
|
||||
(
|
||||
export TERM
|
||||
case "$1" in
|
||||
error) tput bold; tput setaf 1;; # bold red
|
||||
skip) tput bold; tput setaf 2;; # bold green
|
||||
pass) tput setaf 2;; # green
|
||||
info) tput setaf 3;; # brown
|
||||
*) test -n "$quiet" && return;;
|
||||
esac
|
||||
shift
|
||||
printf "* %s" "$*"
|
||||
tput sgr0
|
||||
echo
|
||||
)
|
||||
}
|
||||
else
|
||||
say_color() {
|
||||
test -z "$1" && test -n "$quiet" && return
|
||||
shift
|
||||
echo "* $*"
|
||||
}
|
||||
fi
|
||||
|
||||
get_color()
|
||||
{
|
||||
# Only use the supplied color if there are actually instances of that
|
||||
# type, so that a clean test run does not distract the user by the
|
||||
# appearance of the error highlighting.
|
||||
if [ ${1:?} -eq 0 ]
|
||||
then
|
||||
echo 'info'
|
||||
else
|
||||
echo "${2:-info}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
fixed=0
|
||||
success=0
|
||||
@@ -14,21 +67,21 @@ 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
|
||||
|
||||
printf "%-8s%d\n" fixed $fixed
|
||||
printf "%-8s%d\n" success $success
|
||||
printf "%-8s%d\n" failed $failed
|
||||
printf "%-8s%d\n" broken $broken
|
||||
printf "%-8s%d\n" total $total
|
||||
say_color 'info' "$(printf "%-8s%d\n" fixed $fixed)"
|
||||
say_color "$(get_color "$success" 'pass')" "$(printf "%-8s%d\n" success $success)"
|
||||
say_color "$(get_color "$failed" 'error')" "$(printf "%-8s%d\n" failed $failed)"
|
||||
say_color "$(get_color "$broken" 'error')" "$(printf "%-8s%d\n" broken $broken)"
|
||||
say_color 'info' "$(printf "%-8s%d\n" total $total)"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
test_description='todo.sh configuration file location
|
||||
|
||||
@@ -8,30 +8,43 @@ to find it somewhere else.
|
||||
'
|
||||
. ./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
|
||||
rm -f todo.cfg
|
||||
echo "Fatal error: Cannot read configuration file $HOME/todo.cfg" > expect
|
||||
echo "Fatal Error: Cannot read configuration file $HOME/.todo/config" > expect
|
||||
test_expect_success 'no config file' '
|
||||
todo.sh > output 2>&1 || test_cmp expect output
|
||||
'
|
||||
|
||||
# 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"
|
||||
export REPORT_FILE="$TODO_DIR/report.txt"
|
||||
export TMP_FILE="$TODO_DIR/todo.tmp"
|
||||
export TODO_FILE="\$TODO_DIR/todo.txt"
|
||||
export DONE_FILE="\$TODO_DIR/done.txt"
|
||||
export REPORT_FILE="\$TODO_DIR/report.txt"
|
||||
export TMP_FILE="\$TODO_DIR/todo.tmp"
|
||||
touch used_config
|
||||
EOF
|
||||
|
||||
rm -f used_config
|
||||
test_expect_success 'config file (default location 1)' '
|
||||
mkdir .todo
|
||||
cp test.cfg .todo/config
|
||||
todo.sh > output;
|
||||
test_cmp expect output && test -f used_config &&
|
||||
rm -rf .todo
|
||||
'
|
||||
|
||||
rm -f used_config
|
||||
test_expect_success 'config file (default location 2)' '
|
||||
cp test.cfg todo.cfg
|
||||
todo.sh > output;
|
||||
test_cmp expect output && test -f used_config &&
|
||||
@@ -39,13 +52,21 @@ test_expect_success 'config file (default location 1)' '
|
||||
'
|
||||
|
||||
rm -f used_config
|
||||
test_expect_success 'config file (default location 2)' '
|
||||
test_expect_success 'config file (default location 3)' '
|
||||
cp test.cfg .todo.cfg
|
||||
todo.sh > output;
|
||||
test_cmp expect output && test -f used_config &&
|
||||
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
|
||||
test_expect_success 'config file (command line)' '
|
||||
todo.sh -d test.cfg > output;
|
||||
@@ -58,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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
test_description='todo.sh basic null functionality test.
|
||||
|
||||
@@ -12,7 +12,7 @@ when there are no todos.
|
||||
#
|
||||
cat > expect <<EOF
|
||||
--
|
||||
TODO: 0 of 0 tasks shown from $HOME/todo.txt
|
||||
TODO: 0 of 0 tasks shown
|
||||
EOF
|
||||
|
||||
test_expect_success 'null ls' '
|
||||
@@ -44,7 +44,9 @@ test_expect_success 'null listpri a' '
|
||||
#
|
||||
cat > expect <<EOF
|
||||
--
|
||||
TODO: 0 of 0 tasks shown from $HOME/todo.tmp
|
||||
TODO: 0 of 0 tasks shown
|
||||
DONE: 0 of 0 tasks shown
|
||||
total 0 of 0 tasks shown
|
||||
EOF
|
||||
|
||||
test_expect_success 'null lsa' '
|
||||
@@ -57,7 +59,6 @@ test_expect_success 'null list filter' '
|
||||
todo.sh listall filter > output && test_cmp expect output
|
||||
'
|
||||
|
||||
|
||||
#
|
||||
# lsc|listcon
|
||||
#
|
||||
|
||||
40
tests/t0002-actions.sh
Executable file
40
tests/t0002-actions.sh
Executable file
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='todo.sh actions.d
|
||||
|
||||
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
|
||||
TODO: foo
|
||||
EOF
|
||||
|
||||
cat > foo <<EOF
|
||||
echo "TODO: foo"
|
||||
EOF
|
||||
chmod +x foo
|
||||
|
||||
test_expect_success 'custom action (default location 1)' '
|
||||
mkdir .todo.actions.d
|
||||
cp foo .todo.actions.d/
|
||||
todo.sh foo > output;
|
||||
test_cmp expect output && rm -rf .todo.actions.d
|
||||
'
|
||||
|
||||
test_expect_success 'custom action (default location 2)' '
|
||||
mkdir -p .todo/actions
|
||||
cp foo .todo/actions/
|
||||
todo.sh foo > output;
|
||||
test_cmp expect output && rm -rf .todo/actions
|
||||
'
|
||||
|
||||
test_expect_success 'custom action (env variable)' '
|
||||
mkdir myactions
|
||||
cp foo myactions/
|
||||
TODO_ACTIONS_DIR=myactions todo.sh foo > output;
|
||||
test_cmp expect output && rm -rf myactions
|
||||
'
|
||||
|
||||
test_done
|
||||
23
tests/t0100-code-nobacktick.sh
Executable file
23
tests/t0100-code-nobacktick.sh
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='no old-style backtick command substitution
|
||||
|
||||
This test checks the todo.sh script itself for occurrences
|
||||
of old-style backtick command substitution, which should be
|
||||
replaced with $(...).
|
||||
On failure, it will print each offending line number and line.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
backtick_check()
|
||||
{
|
||||
sed -n -e 's/\(^\|[ \t]\)#.*//' -e '/`/{' -e '=;p' -e '}' "$@"
|
||||
}
|
||||
|
||||
test_todo_session 'no old-style backtick command substitution' <<EOF
|
||||
>>> backtick_check bin/todo.sh
|
||||
|
||||
>>> backtick_check ../../todo.cfg
|
||||
EOF
|
||||
|
||||
test_done
|
||||
126
tests/t1000-addlist.sh
Executable file
126
tests/t1000-addlist.sh
Executable file
@@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic add and list functionality
|
||||
|
||||
This test just makes sure the basic add and list
|
||||
command work, including support for filtering.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
#
|
||||
# Add and list
|
||||
#
|
||||
test_todo_session 'basic add/list' <<EOF
|
||||
>>> todo.sh add notice the daisies
|
||||
1 notice the daisies
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh list
|
||||
1 notice the daisies
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
|
||||
>>> todo.sh add smell the roses
|
||||
2 smell the roses
|
||||
TODO: 2 added.
|
||||
|
||||
>>> todo.sh list
|
||||
1 notice the daisies
|
||||
2 smell the roses
|
||||
--
|
||||
TODO: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# Filter
|
||||
#
|
||||
test_todo_session 'basic list filtering' <<EOF
|
||||
>>> todo.sh list daisies
|
||||
1 notice the daisies
|
||||
--
|
||||
TODO: 1 of 2 tasks shown
|
||||
|
||||
>>> todo.sh list smell
|
||||
2 smell the roses
|
||||
--
|
||||
TODO: 1 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'case-insensitive filtering' <<EOF
|
||||
>>> todo.sh add smell the uppercase Roses
|
||||
3 smell the uppercase Roses
|
||||
TODO: 3 added.
|
||||
|
||||
>>> todo.sh list roses
|
||||
2 smell the roses
|
||||
3 smell the uppercase Roses
|
||||
--
|
||||
TODO: 2 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'add with symbols' <<EOF
|
||||
>>> todo.sh add "~@#$%^&*()-_=+[{]}|;:',<.>/?"
|
||||
4 ~@#$%^&*()-_=+[{]}|;:',<.>/?
|
||||
TODO: 4 added.
|
||||
|
||||
>>> todo.sh add '\`!\\"'
|
||||
5 \`!\\"
|
||||
TODO: 5 added.
|
||||
|
||||
>>> todo.sh list
|
||||
1 notice the daisies
|
||||
2 smell the roses
|
||||
3 smell the uppercase Roses
|
||||
5 \`!\\"
|
||||
4 ~@#$%^&*()-_=+[{]}|;:',<.>/?
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# Advanced add
|
||||
#
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'add with spaces' <<EOF
|
||||
>>> todo.sh add "notice the three spaces"
|
||||
1 notice the three spaces
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh add notice how the spaces get lost
|
||||
2 notice how the spaces get lost
|
||||
TODO: 2 added.
|
||||
|
||||
>>> todo.sh list
|
||||
2 notice how the spaces get lost
|
||||
1 notice the three spaces
|
||||
--
|
||||
TODO: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'add with CR' <<EOF
|
||||
>>> todo.sh add "smell the
|
||||
Carriage Return"
|
||||
1 smell the Carriage Return
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh list
|
||||
1 smell the Carriage Return
|
||||
--
|
||||
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
|
||||
|
||||
105
tests/t1010-add-date.sh
Executable file
105
tests/t1010-add-date.sh
Executable file
@@ -0,0 +1,105 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='test the date on add feature
|
||||
|
||||
Tests paths by which we might automatically add
|
||||
a date to each item.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
#
|
||||
# Add and list
|
||||
#
|
||||
test_todo_session 'cmd line first day' <<EOF
|
||||
>>> todo.sh -t add notice the daisies
|
||||
1 2009-02-13 notice the daisies
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh list
|
||||
1 2009-02-13 notice the daisies
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'cmd line first day with priority' <<EOF
|
||||
>>> todo.sh -pt add '(A) notice the daisies'
|
||||
2 (A) 2009-02-13 notice the daisies
|
||||
TODO: 2 added.
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 (A) 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 (A) 2009-02-13 notice the daisies
|
||||
TODO: 2 deleted.
|
||||
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_todo_session 'cmd line second day' <<EOF
|
||||
>>> todo.sh -t add smell the roses
|
||||
2 2009-02-14 smell the roses
|
||||
TODO: 2 added.
|
||||
|
||||
>>> todo.sh list
|
||||
1 2009-02-13 notice the daisies
|
||||
2 2009-02-14 smell the roses
|
||||
--
|
||||
TODO: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
test_tick
|
||||
|
||||
test_todo_session 'cmd line third day' <<EOF
|
||||
>>> todo.sh -t add mow the lawn
|
||||
3 2009-02-15 mow the lawn
|
||||
TODO: 3 added.
|
||||
|
||||
>>> todo.sh list
|
||||
1 2009-02-13 notice the daisies
|
||||
2 2009-02-14 smell the roses
|
||||
3 2009-02-15 mow the lawn
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
# Switch to config file
|
||||
echo "export TODOTXT_DATE_ON_ADD=1" >> todo.cfg
|
||||
|
||||
# Bump the clock, for good measure.
|
||||
test_tick 3600
|
||||
|
||||
test_todo_session 'config file third day' <<EOF
|
||||
>>> todo.sh add take out the trash
|
||||
4 2009-02-15 take out the trash
|
||||
TODO: 4 added.
|
||||
|
||||
>>> todo.sh list
|
||||
1 2009-02-13 notice the daisies
|
||||
2 2009-02-14 smell the roses
|
||||
3 2009-02-15 mow the lawn
|
||||
4 2009-02-15 take out the trash
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
101
tests/t1020-addtolistfile.sh
Executable file
101
tests/t1020-addtolistfile.sh
Executable file
@@ -0,0 +1,101 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic addto and list functionality
|
||||
|
||||
This test just makes sure the basic addto and listfile
|
||||
commands work, including support for filtering.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
#
|
||||
# Addto and listfile
|
||||
#
|
||||
test_todo_session 'nonexistant file' <<EOF
|
||||
>>> todo.sh addto garden.txt notice the daisies
|
||||
TODO: Destination file $HOME/garden.txt does not exist.
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
touch "$HOME/garden.txt"
|
||||
|
||||
test_todo_session 'basic addto/listfile' <<EOF
|
||||
>>> todo.sh addto garden.txt notice the daisies
|
||||
1 notice the daisies
|
||||
GARDEN: 1 added.
|
||||
|
||||
>>> todo.sh listfile garden.txt
|
||||
1 notice the daisies
|
||||
--
|
||||
GARDEN: 1 of 1 tasks shown
|
||||
|
||||
>>> todo.sh addto garden.txt smell the roses
|
||||
2 smell the roses
|
||||
GARDEN: 2 added.
|
||||
|
||||
>>> todo.sh listfile garden.txt
|
||||
1 notice the daisies
|
||||
2 smell the roses
|
||||
--
|
||||
GARDEN: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# List available files
|
||||
#
|
||||
test_todo_session 'list available files' <<EOF
|
||||
>>> todo.sh listfile
|
||||
Files in the todo.txt directory:
|
||||
done.txt
|
||||
garden.txt
|
||||
report.txt
|
||||
todo.txt
|
||||
|
||||
>>> TODOTXT_VERBOSE=0 todo.sh listfile
|
||||
done.txt
|
||||
garden.txt
|
||||
report.txt
|
||||
todo.txt
|
||||
EOF
|
||||
|
||||
#
|
||||
# Filter
|
||||
#
|
||||
test_todo_session 'basic listfile filtering' <<EOF
|
||||
>>> todo.sh listfile garden.txt daisies
|
||||
1 notice the daisies
|
||||
--
|
||||
GARDEN: 1 of 2 tasks shown
|
||||
|
||||
>>> todo.sh listfile garden.txt smell
|
||||
2 smell the roses
|
||||
--
|
||||
GARDEN: 1 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'case-insensitive filtering' <<EOF
|
||||
>>> todo.sh addto garden.txt smell the uppercase Roses
|
||||
3 smell the uppercase Roses
|
||||
GARDEN: 3 added.
|
||||
|
||||
>>> todo.sh listfile garden.txt roses
|
||||
2 smell the roses
|
||||
3 smell the uppercase Roses
|
||||
--
|
||||
GARDEN: 2 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'addto with &' <<EOF
|
||||
>>> todo.sh addto garden.txt "dig the garden & water the flowers"
|
||||
4 dig the garden & water the flowers
|
||||
GARDEN: 4 added.
|
||||
|
||||
>>> todo.sh listfile garden.txt
|
||||
4 dig the garden & water the flowers
|
||||
1 notice the daisies
|
||||
2 smell the roses
|
||||
3 smell the uppercase Roses
|
||||
--
|
||||
GARDEN: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
75
tests/t1030-addto-date.sh
Executable file
75
tests/t1030-addto-date.sh
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='test the date on addto feature
|
||||
|
||||
Tests paths by which we might automatically add
|
||||
a date to each item.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
touch "$HOME/garden.txt"
|
||||
|
||||
#
|
||||
# Add and list
|
||||
#
|
||||
test_todo_session 'cmd line first day' <<EOF
|
||||
>>> todo.sh -t addto garden.txt notice the daisies
|
||||
1 2009-02-13 notice the daisies
|
||||
GARDEN: 1 added.
|
||||
|
||||
>>> todo.sh listfile garden.txt
|
||||
1 2009-02-13 notice the daisies
|
||||
--
|
||||
GARDEN: 1 of 1 tasks shown
|
||||
EOF
|
||||
|
||||
test_tick
|
||||
|
||||
test_todo_session 'cmd line second day' <<EOF
|
||||
>>> todo.sh -t addto garden.txt smell the roses
|
||||
2 2009-02-14 smell the roses
|
||||
GARDEN: 2 added.
|
||||
|
||||
>>> todo.sh listfile garden.txt
|
||||
1 2009-02-13 notice the daisies
|
||||
2 2009-02-14 smell the roses
|
||||
--
|
||||
GARDEN: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
test_tick
|
||||
|
||||
test_todo_session 'cmd line third day' <<EOF
|
||||
>>> todo.sh -t addto garden.txt mow the lawn
|
||||
3 2009-02-15 mow the lawn
|
||||
GARDEN: 3 added.
|
||||
|
||||
>>> todo.sh listfile garden.txt
|
||||
1 2009-02-13 notice the daisies
|
||||
2 2009-02-14 smell the roses
|
||||
3 2009-02-15 mow the lawn
|
||||
--
|
||||
GARDEN: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
# Switch to config file
|
||||
echo "export TODOTXT_DATE_ON_ADD=1" >> todo.cfg
|
||||
|
||||
# Bump the clock, for good measure.
|
||||
test_tick 3600
|
||||
|
||||
test_todo_session 'config file third day' <<EOF
|
||||
>>> todo.sh addto garden.txt take out the trash
|
||||
4 2009-02-15 take out the trash
|
||||
GARDEN: 4 added.
|
||||
|
||||
>>> todo.sh listfile garden.txt
|
||||
1 2009-02-13 notice the daisies
|
||||
2 2009-02-14 smell the roses
|
||||
3 2009-02-15 mow the lawn
|
||||
4 2009-02-15 take out the trash
|
||||
--
|
||||
GARDEN: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
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
|
||||
216
tests/t1100-replace.sh
Executable file
216
tests/t1100-replace.sh
Executable file
@@ -0,0 +1,216 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic replace functionality
|
||||
|
||||
Ensure we can replace items successfully.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
#
|
||||
# Set up the basic todo.txt
|
||||
#
|
||||
todo.sh add notice the daisies > /dev/null
|
||||
|
||||
test_todo_session 'replace usage' <<EOF
|
||||
>>> todo.sh replace adf asdfa
|
||||
=== 1
|
||||
usage: todo.sh replace ITEM# "UPDATED ITEM"
|
||||
EOF
|
||||
|
||||
test_todo_session 'basic replace' <<EOF
|
||||
>>> todo.sh replace 1 "smell the cows"
|
||||
1 notice the daisies
|
||||
TODO: Replaced task with:
|
||||
1 smell the cows
|
||||
|
||||
>>> todo.sh list
|
||||
1 smell the cows
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
|
||||
>>> todo.sh replace 1 smell the roses
|
||||
1 smell the cows
|
||||
TODO: Replaced task with:
|
||||
1 smell the roses
|
||||
|
||||
>>> todo.sh list
|
||||
1 smell the roses
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
smell the cows
|
||||
grow some corn
|
||||
thrash some hay
|
||||
chase the chickens
|
||||
EOF
|
||||
test_todo_session 'replace error' <<EOF
|
||||
>>> todo.sh replace 10 "hej!"
|
||||
=== 1
|
||||
TODO: No task 10.
|
||||
EOF
|
||||
|
||||
test_todo_session 'replace in multi-item file' <<EOF
|
||||
>>> todo.sh replace 1 smell the cheese
|
||||
1 smell the cows
|
||||
TODO: Replaced task with:
|
||||
1 smell the cheese
|
||||
|
||||
>>> todo.sh replace 3 jump on hay
|
||||
3 thrash some hay
|
||||
TODO: Replaced task with:
|
||||
3 jump on hay
|
||||
|
||||
>>> todo.sh replace 4 collect the eggs
|
||||
4 chase the chickens
|
||||
TODO: Replaced task with:
|
||||
4 collect the eggs
|
||||
EOF
|
||||
|
||||
echo '(A) collect the eggs' > todo.txt
|
||||
test_todo_session 'replace with priority' <<EOF
|
||||
>>> todo.sh replace 1 "collect the bread"
|
||||
1 (A) collect the eggs
|
||||
TODO: Replaced task with:
|
||||
1 (A) collect the bread
|
||||
|
||||
>>> todo.sh replace 1 collect the eggs
|
||||
1 (A) collect the bread
|
||||
TODO: Replaced task with:
|
||||
1 (A) collect the eggs
|
||||
EOF
|
||||
|
||||
echo 'jump on hay' > todo.txt
|
||||
test_todo_session 'replace with &' <<EOF
|
||||
>>> todo.sh replace 1 "thrash the hay & thrash the wheat"
|
||||
1 jump on hay
|
||||
TODO: Replaced task with:
|
||||
1 thrash the hay & thrash the wheat
|
||||
EOF
|
||||
|
||||
echo 'jump on hay' > todo.txt
|
||||
test_todo_session 'replace with spaces' <<EOF
|
||||
>>> todo.sh replace 1 "notice the three spaces"
|
||||
1 jump on hay
|
||||
TODO: Replaced task with:
|
||||
1 notice the three spaces
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
smell the cows
|
||||
grow some corn
|
||||
thrash some hay
|
||||
chase the chickens
|
||||
EOF
|
||||
test_todo_session 'replace with symbols' <<EOF
|
||||
>>> todo.sh replace 1 "~@#$%^&*()-_=+[{]}|;:',<.>/?"
|
||||
1 smell the cows
|
||||
TODO: Replaced task with:
|
||||
1 ~@#$%^&*()-_=+[{]}|;:',<.>/?
|
||||
|
||||
>>> todo.sh replace 2 '\`!\\"'
|
||||
2 grow some corn
|
||||
TODO: Replaced task with:
|
||||
2 \`!\\"
|
||||
|
||||
>>> todo.sh list
|
||||
4 chase the chickens
|
||||
3 thrash some hay
|
||||
2 \`!\\"
|
||||
1 ~@#$%^&*()-_=+[{]}|;:',<.>/?
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'replace handling prepended date on add' <<EOF
|
||||
>>> todo.sh -t add "new task"
|
||||
1 2009-02-13 new task
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh replace 1 this is just a new one
|
||||
1 2009-02-13 new task
|
||||
TODO: Replaced task with:
|
||||
1 2009-02-13 this is just a new one
|
||||
|
||||
>>> todo.sh replace 1 2010-07-04 this also has a new date
|
||||
1 2009-02-13 this is just a new one
|
||||
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"
|
||||
1 2009-02-13 new task
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh pri 1 A
|
||||
1 (A) 2009-02-13 new task
|
||||
TODO: 1 prioritized (A).
|
||||
|
||||
>>> todo.sh replace 1 this is just a new one
|
||||
1 (A) 2009-02-13 new task
|
||||
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
|
||||
1 (A) 2009-02-13 this is just a new one
|
||||
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'
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
139
tests/t1200-pri.sh
Executable file
139
tests/t1200-pri.sh
Executable file
@@ -0,0 +1,139 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic priority functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_todo_session 'priority usage' <<EOF
|
||||
>>> todo.sh pri B B
|
||||
usage: todo.sh pri ITEM# PRIORITY[, ITEM# PRIORITY, ...]
|
||||
note: PRIORITY must be anywhere from A to Z.
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
smell the uppercase Roses +flowers @outside
|
||||
notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'basic priority' <<EOF
|
||||
>>> todo.sh list
|
||||
2 notice the sunflowers
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh pri 1 B
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 prioritized (B).
|
||||
|
||||
>>> todo.sh list
|
||||
[0;32m1 (B) smell the uppercase Roses +flowers @outside[0m
|
||||
2 notice the sunflowers
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
2 notice the sunflowers
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh pri 2 C
|
||||
2 (C) notice the sunflowers
|
||||
TODO: 2 prioritized (C).
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
2 (C) notice the sunflowers
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh add "smell the coffee +wakeup"
|
||||
4 smell the coffee +wakeup
|
||||
TODO: 4 added.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
2 (C) notice the sunflowers
|
||||
4 smell the coffee +wakeup
|
||||
3 stop
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'priority error' <<EOF
|
||||
>>> todo.sh pri 10 B
|
||||
=== 1
|
||||
TODO: No task 10.
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(C) notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'reprioritize' <<EOF
|
||||
>>> todo.sh pri 2 A
|
||||
2 (A) notice the sunflowers
|
||||
TODO: 2 re-prioritized from (C) to (A).
|
||||
|
||||
>>> 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
|
||||
|
||||
>>> todo.sh pri 2 a
|
||||
=== 1
|
||||
2 (A) notice the sunflowers
|
||||
TODO: 2 already prioritized (A).
|
||||
|
||||
>>> 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
|
||||
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
|
||||
151
tests/t1250-listpri.sh
Executable file
151
tests/t1250-listpri.sh
Executable file
@@ -0,0 +1,151 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='list priority functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(C) notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'basic listpri' <<EOF
|
||||
>>> todo.sh listpri A
|
||||
--
|
||||
TODO: 0 of 3 tasks shown
|
||||
|
||||
>>> todo.sh -p listpri c
|
||||
2 (C) notice the sunflowers
|
||||
--
|
||||
TODO: 1 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'listpri highlighting' <<EOF
|
||||
>>> todo.sh listpri
|
||||
[0;32m1 (B) smell the uppercase Roses +flowers @outside[0m
|
||||
[1;34m2 (C) notice the sunflowers[0m
|
||||
--
|
||||
TODO: 2 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(C) notice the sunflowers
|
||||
(m)others will notice this
|
||||
(n) not a prioritized task
|
||||
notice the (C)opyright
|
||||
EOF
|
||||
test_todo_session 'listpri filtering priorities' <<EOF
|
||||
>>> todo.sh -p listpri
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
2 (C) notice the sunflowers
|
||||
--
|
||||
TODO: 2 of 5 tasks shown
|
||||
|
||||
>>> todo.sh -p listpri b
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
--
|
||||
TODO: 1 of 5 tasks shown
|
||||
|
||||
>>> todo.sh -p listpri c
|
||||
2 (C) notice the sunflowers
|
||||
--
|
||||
TODO: 1 of 5 tasks shown
|
||||
|
||||
>>> todo.sh -p listpri m
|
||||
--
|
||||
TODO: 0 of 5 tasks shown
|
||||
|
||||
>>> todo.sh -p listpri n
|
||||
--
|
||||
TODO: 0 of 5 tasks shown
|
||||
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
|
||||
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.
|
||||
ccc xxx this line should be third.
|
||||
(A) aaa zzz this line should be first.
|
||||
aaa zzz this line should be first.
|
||||
(B) bbb yyy this line should be second.
|
||||
bbb yyy this line should be second.
|
||||
EOF
|
||||
test_todo_session 'listpri filtering of TERM' <<EOF
|
||||
>>> todo.sh -p listpri "should be"
|
||||
3 (A) aaa zzz this line should be first.
|
||||
5 (B) bbb yyy this line should be second.
|
||||
1 (B) ccc xxx this line should be third.
|
||||
--
|
||||
TODO: 3 of 6 tasks shown
|
||||
|
||||
>>> todo.sh -p listpri a "should be"
|
||||
3 (A) aaa zzz this line should be first.
|
||||
--
|
||||
TODO: 1 of 6 tasks shown
|
||||
|
||||
>>> todo.sh -p listpri b second
|
||||
5 (B) bbb yyy this line should be second.
|
||||
--
|
||||
TODO: 1 of 6 tasks shown
|
||||
|
||||
>>> todo.sh -p listpri x "should be"
|
||||
--
|
||||
TODO: 0 of 6 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
731
tests/t1300-ls.sh
Executable file
731
tests/t1300-ls.sh
Executable file
@@ -0,0 +1,731 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='list functionality
|
||||
|
||||
This test checks various list functionality including
|
||||
sorting, output filtering and line numbering.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
TEST_TODO_=todo.cfg
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
ccc xxx this line should be third.
|
||||
aaa zzz this line should be first.
|
||||
bbb yyy this line should be second.
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the sort filter
|
||||
#
|
||||
TEST_TODO1_=todo1.cfg
|
||||
sed -e "s/^.*export TODOTXT_SORT_COMMAND=.*$/export TODOTXT_SORT_COMMAND='env LC_COLLATE=C sort -r -f -k2'/" "${TEST_TODO_}" > "${TEST_TODO1_}"
|
||||
|
||||
test_todo_session 'checking TODOTXT_SORT_COMMAND' <<EOF
|
||||
>>> todo.sh ls
|
||||
2 aaa zzz this line should be first.
|
||||
3 bbb yyy this line should be second.
|
||||
1 ccc xxx this line should be third.
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh -d "$TEST_TODO1_" ls
|
||||
1 ccc xxx this line should be third.
|
||||
3 bbb yyy this line should be second.
|
||||
2 aaa zzz this line should be first.
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the final filter
|
||||
#
|
||||
TEST_TODO2_=todo2.cfg
|
||||
sed -e "s%^.*export TODOTXT_FINAL_FILTER=.*$%export TODOTXT_FINAL_FILTER=\"sed 's/^\\\(..\\\{20\\\}\\\).....*$/\\\1.../'\"%" "${TEST_TODO_}" > "${TEST_TODO2_}"
|
||||
|
||||
test_todo_session 'checking TODOTXT_FINAL_FILTER' <<EOF
|
||||
>>> todo.sh -d "$TEST_TODO2_" ls
|
||||
2 aaa zzz this line s...
|
||||
3 bbb yyy this line s...
|
||||
1 ccc xxx this line s...
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the custom hiding
|
||||
#
|
||||
test_todo_session 'checking HIDE_CUSTOM_SUBSTITUTION' <<EOF
|
||||
>>> HIDE_CUSTOM_SUBSTITUTION='[tT]h' todo.sh ls
|
||||
2 aaa zzz is line should be first.
|
||||
3 bbb yyy is line should be second.
|
||||
1 ccc xxx is line should be ird.
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the filtering of TERM
|
||||
#
|
||||
test_todo_session 'checking filtering of TERM' <<EOF
|
||||
>>> todo.sh ls second
|
||||
3 bbb yyy this line should be second.
|
||||
--
|
||||
TODO: 1 of 3 tasks shown
|
||||
|
||||
>>> todo.sh ls "should be f"
|
||||
2 aaa zzz this line should be first.
|
||||
--
|
||||
TODO: 1 of 3 tasks shown
|
||||
|
||||
>>> todo.sh ls " zzz"
|
||||
2 aaa zzz this line should be first.
|
||||
--
|
||||
TODO: 1 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check negative filtering via -TERM
|
||||
#
|
||||
test_todo_session 'checking negative filtering via -TERM' <<EOF
|
||||
>>> todo.sh ls -second
|
||||
2 aaa zzz this line should be first.
|
||||
1 ccc xxx this line should be third.
|
||||
--
|
||||
TODO: 2 of 3 tasks shown
|
||||
|
||||
>>> todo.sh ls "-should be f"
|
||||
3 bbb yyy this line should be second.
|
||||
1 ccc xxx this line should be third.
|
||||
--
|
||||
TODO: 2 of 3 tasks shown
|
||||
|
||||
>>> todo.sh ls "- zzz"
|
||||
3 bbb yyy this line should be second.
|
||||
1 ccc xxx this line should be third.
|
||||
--
|
||||
TODO: 2 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the filtering of TERM with regexp
|
||||
#
|
||||
test_todo_session 'checking filtering of TERM with regexp' <<EOF
|
||||
>>> todo.sh ls "ir[ds]"
|
||||
2 aaa zzz this line should be first.
|
||||
1 ccc xxx this line should be third.
|
||||
--
|
||||
TODO: 2 of 3 tasks shown
|
||||
|
||||
>>> todo.sh ls "f.*t"
|
||||
2 aaa zzz this line should be first.
|
||||
--
|
||||
TODO: 1 of 3 tasks shown
|
||||
|
||||
>>> todo.sh ls "ir[ds]" xxx
|
||||
1 ccc xxx this line should be third.
|
||||
--
|
||||
TODO: 1 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the filtering of TERM containing characters that are special to the
|
||||
# shell, like variables, quotes, and multiple subsequent spaces.
|
||||
#
|
||||
cat > todo.txt <<'EOF'
|
||||
earn some pennies
|
||||
earn some $$
|
||||
earn some "money"
|
||||
get money from O'Brian
|
||||
just get money!
|
||||
EOF
|
||||
test_todo_session 'checking filtering of special characters' <<'EOF'
|
||||
>>> todo.sh ls '$$'
|
||||
2 earn some $$
|
||||
--
|
||||
TODO: 1 of 5 tasks shown
|
||||
|
||||
>>> todo.sh ls '"money"'
|
||||
3 earn some "money"
|
||||
--
|
||||
TODO: 1 of 5 tasks shown
|
||||
|
||||
>>> todo.sh ls "O'Brian"
|
||||
4 get money from O'Brian
|
||||
--
|
||||
TODO: 1 of 5 tasks shown
|
||||
|
||||
>>> todo.sh ls "get money"
|
||||
5 just get money!
|
||||
--
|
||||
TODO: 1 of 5 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the x command line option
|
||||
#
|
||||
TEST_TODO3_=todo3.cfg
|
||||
sed -e "s%^.*export TODOTXT_FINAL_FILTER=.*$%export TODOTXT_FINAL_FILTER=\"grep -v xxx\"%" "${TEST_TODO_}" > "${TEST_TODO3_}"
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
foo
|
||||
bar xxx
|
||||
baz
|
||||
EOF
|
||||
|
||||
test_todo_session 'final filter suppression' <<EOF
|
||||
>>> todo.sh -d "$TEST_TODO3_" ls
|
||||
3 baz
|
||||
1 foo
|
||||
--
|
||||
TODO: 2 of 3 tasks shown
|
||||
|
||||
>>> todo.sh -d "$TEST_TODO3_" -x ls
|
||||
2 bar xxx
|
||||
3 baz
|
||||
1 foo
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the p command line option
|
||||
#
|
||||
cat > todo.txt <<EOF
|
||||
(A) @con01 +prj01 -- Some project 01 task, pri A
|
||||
(A) @con01 +prj02 -- Some project 02 task, pri A
|
||||
(A) @con02 +prj03 -- Some project 03 task, pri A
|
||||
(A) @con02 +prj04 -- Some project 04 task, pri A
|
||||
(B) @con01 +prj01 -- Some project 01 task, pri B
|
||||
(B) @con01 +prj02 -- Some project 02 task, pri B
|
||||
(B) @con02 +prj03 -- Some project 03 task, pri B
|
||||
(B) @con02 +prj04 -- Some project 04 task, pri B
|
||||
(C) @con01 +prj01 -- Some project 01 task, pri C
|
||||
(C) @con01 +prj02 -- Some project 02 task, pri C
|
||||
(C) @con02 +prj03 -- Some project 03 task, pri C
|
||||
(C) @con02 +prj04 -- Some project 04 task, pri C
|
||||
(D) @con01 +prj01 -- Some project 01 task, pri D
|
||||
(D) @con01 +prj02 -- Some project 02 task, pri D
|
||||
(D) @con02 +prj03 -- Some project 03 task, pri D
|
||||
(D) @con02 +prj04 -- Some project 04 task, pri D
|
||||
@con01 +prj01 -- Some project 01 task, no priority
|
||||
@con01 +prj02 -- Some project(S) 02 task, no priority
|
||||
@con02 +prj03 -- Some project 03 task, no priorty
|
||||
@con02 +prj04 -- Some project 04 task, no priority
|
||||
EOF
|
||||
test_todo_session 'plain mode option' <<EOF
|
||||
>>> todo.sh ls
|
||||
[1;33m01 (A) @con01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 (A) @con01 +prj02 -- Some project 02 task, pri A[0m
|
||||
[1;33m03 (A) @con02 +prj03 -- Some project 03 task, pri A[0m
|
||||
[1;33m04 (A) @con02 +prj04 -- Some project 04 task, pri A[0m
|
||||
[0;32m05 (B) @con01 +prj01 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 (B) @con01 +prj02 -- Some project 02 task, pri B[0m
|
||||
[0;32m07 (B) @con02 +prj03 -- Some project 03 task, pri B[0m
|
||||
[0;32m08 (B) @con02 +prj04 -- Some project 04 task, pri B[0m
|
||||
[1;34m09 (C) @con01 +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 (C) @con01 +prj02 -- Some project 02 task, pri C[0m
|
||||
[1;34m11 (C) @con02 +prj03 -- Some project 03 task, pri C[0m
|
||||
[1;34m12 (C) @con02 +prj04 -- Some project 04 task, pri C[0m
|
||||
[1;37m13 (D) @con01 +prj01 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 (D) @con01 +prj02 -- Some project 02 task, pri D[0m
|
||||
[1;37m15 (D) @con02 +prj03 -- Some project 03 task, pri D[0m
|
||||
[1;37m16 (D) @con02 +prj04 -- Some project 04 task, pri D[0m
|
||||
17 @con01 +prj01 -- Some project 01 task, no priority
|
||||
18 @con01 +prj02 -- Some project(S) 02 task, no priority
|
||||
19 @con02 +prj03 -- Some project 03 task, no priorty
|
||||
20 @con02 +prj04 -- Some project 04 task, no priority
|
||||
--
|
||||
TODO: 20 of 20 tasks shown
|
||||
|
||||
>>> todo.sh -p ls
|
||||
01 (A) @con01 +prj01 -- Some project 01 task, pri A
|
||||
02 (A) @con01 +prj02 -- Some project 02 task, pri A
|
||||
03 (A) @con02 +prj03 -- Some project 03 task, pri A
|
||||
04 (A) @con02 +prj04 -- Some project 04 task, pri A
|
||||
05 (B) @con01 +prj01 -- Some project 01 task, pri B
|
||||
06 (B) @con01 +prj02 -- Some project 02 task, pri B
|
||||
07 (B) @con02 +prj03 -- Some project 03 task, pri B
|
||||
08 (B) @con02 +prj04 -- Some project 04 task, pri B
|
||||
09 (C) @con01 +prj01 -- Some project 01 task, pri C
|
||||
10 (C) @con01 +prj02 -- Some project 02 task, pri C
|
||||
11 (C) @con02 +prj03 -- Some project 03 task, pri C
|
||||
12 (C) @con02 +prj04 -- Some project 04 task, pri C
|
||||
13 (D) @con01 +prj01 -- Some project 01 task, pri D
|
||||
14 (D) @con01 +prj02 -- Some project 02 task, pri D
|
||||
15 (D) @con02 +prj03 -- Some project 03 task, pri D
|
||||
16 (D) @con02 +prj04 -- Some project 04 task, pri D
|
||||
17 @con01 +prj01 -- Some project 01 task, no priority
|
||||
18 @con01 +prj02 -- Some project(S) 02 task, no priority
|
||||
19 @con02 +prj03 -- Some project 03 task, no priorty
|
||||
20 @con02 +prj04 -- Some project 04 task, no priority
|
||||
--
|
||||
TODO: 20 of 20 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the P,@,+ command line options
|
||||
#
|
||||
cat > todo.txt <<EOF
|
||||
(A) @con01 +prj01 -- Some project 01 task, pri A
|
||||
(A) @con01 +prj02 -- Some project 02 task, pri A
|
||||
(A) @con02 +prj03 -- Some project 03 task, pri A
|
||||
(A) @con02 +prj04 -- Some project 04 task, pri A
|
||||
(B) @con01 +prj01 -- Some project 01 task, pri B
|
||||
(B) @con01 +prj02 -- Some project 02 task, pri B
|
||||
(B) @con02 +prj03 -- Some project 03 task, pri B
|
||||
(B) @con02 +prj04 -- Some project 04 task, pri B
|
||||
(C) @con01 +prj01 -- Some project 01 task, pri C
|
||||
(C) @con01 +prj02 -- Some project 02 task, pri C
|
||||
(C) @con02 +prj03 -- Some project 03 task, pri C
|
||||
(C) @con02 +prj04 -- Some project 04 task, pri C
|
||||
(D) @con01 +prj01 -- Some project 01 task, pri D
|
||||
(D) @con01 +prj02 -- Some project 02 task, pri D
|
||||
(D) @con02 +prj03 -- Some project 03 task, pri D
|
||||
(D) @con02 +prj04 -- Some project 04 task, pri D
|
||||
@con01 +prj01 -- Some project 01 task, no priority
|
||||
@con01 +prj02 -- Some project(S) 02 task, no priority
|
||||
@con02 +prj03 -- Some project 03 task, no priorty
|
||||
@con02 +prj04 -- Some project 04 task, no priority
|
||||
EOF
|
||||
test_todo_session 'context, project, and priority suppression' <<EOF
|
||||
>>> todo.sh ls
|
||||
[1;33m01 (A) @con01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 (A) @con01 +prj02 -- Some project 02 task, pri A[0m
|
||||
[1;33m03 (A) @con02 +prj03 -- Some project 03 task, pri A[0m
|
||||
[1;33m04 (A) @con02 +prj04 -- Some project 04 task, pri A[0m
|
||||
[0;32m05 (B) @con01 +prj01 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 (B) @con01 +prj02 -- Some project 02 task, pri B[0m
|
||||
[0;32m07 (B) @con02 +prj03 -- Some project 03 task, pri B[0m
|
||||
[0;32m08 (B) @con02 +prj04 -- Some project 04 task, pri B[0m
|
||||
[1;34m09 (C) @con01 +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 (C) @con01 +prj02 -- Some project 02 task, pri C[0m
|
||||
[1;34m11 (C) @con02 +prj03 -- Some project 03 task, pri C[0m
|
||||
[1;34m12 (C) @con02 +prj04 -- Some project 04 task, pri C[0m
|
||||
[1;37m13 (D) @con01 +prj01 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 (D) @con01 +prj02 -- Some project 02 task, pri D[0m
|
||||
[1;37m15 (D) @con02 +prj03 -- Some project 03 task, pri D[0m
|
||||
[1;37m16 (D) @con02 +prj04 -- Some project 04 task, pri D[0m
|
||||
17 @con01 +prj01 -- Some project 01 task, no priority
|
||||
18 @con01 +prj02 -- Some project(S) 02 task, no priority
|
||||
19 @con02 +prj03 -- Some project 03 task, no priorty
|
||||
20 @con02 +prj04 -- Some project 04 task, no priority
|
||||
--
|
||||
TODO: 20 of 20 tasks shown
|
||||
|
||||
>>> todo.sh ls @con01
|
||||
[1;33m01 (A) @con01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 (A) @con01 +prj02 -- Some project 02 task, pri A[0m
|
||||
[0;32m05 (B) @con01 +prj01 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 (B) @con01 +prj02 -- Some project 02 task, pri B[0m
|
||||
[1;34m09 (C) @con01 +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 (C) @con01 +prj02 -- Some project 02 task, pri C[0m
|
||||
[1;37m13 (D) @con01 +prj01 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 (D) @con01 +prj02 -- Some project 02 task, pri D[0m
|
||||
17 @con01 +prj01 -- Some project 01 task, no priority
|
||||
18 @con01 +prj02 -- Some project(S) 02 task, no priority
|
||||
--
|
||||
TODO: 10 of 20 tasks shown
|
||||
|
||||
>>> todo.sh -P ls @con01
|
||||
[1;33m01 @con01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 @con01 +prj02 -- Some project 02 task, pri A[0m
|
||||
[0;32m05 @con01 +prj01 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 @con01 +prj02 -- Some project 02 task, pri B[0m
|
||||
[1;34m09 @con01 +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 @con01 +prj02 -- Some project 02 task, pri C[0m
|
||||
[1;37m13 @con01 +prj01 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 @con01 +prj02 -- Some project 02 task, pri D[0m
|
||||
17 @con01 +prj01 -- Some project 01 task, no priority
|
||||
18 @con01 +prj02 -- Some project(S) 02 task, no priority
|
||||
--
|
||||
TODO: 10 of 20 tasks shown
|
||||
|
||||
>>> todo.sh -+ ls @con01
|
||||
[1;33m01 (A) @con01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 (A) @con01 -- Some project 02 task, pri A[0m
|
||||
[0;32m05 (B) @con01 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 (B) @con01 -- Some project 02 task, pri B[0m
|
||||
[1;34m09 (C) @con01 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 (C) @con01 -- Some project 02 task, pri C[0m
|
||||
[1;37m13 (D) @con01 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 (D) @con01 -- Some project 02 task, pri D[0m
|
||||
17 @con01 -- Some project 01 task, no priority
|
||||
18 @con01 -- Some project(S) 02 task, no priority
|
||||
--
|
||||
TODO: 10 of 20 tasks shown
|
||||
|
||||
>>> todo.sh -@ ls @con01
|
||||
[1;33m01 (A) +prj01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 (A) +prj02 -- Some project 02 task, pri A[0m
|
||||
[0;32m05 (B) +prj01 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 (B) +prj02 -- Some project 02 task, pri B[0m
|
||||
[1;34m09 (C) +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 (C) +prj02 -- Some project 02 task, pri C[0m
|
||||
[1;37m13 (D) +prj01 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 (D) +prj02 -- Some project 02 task, pri D[0m
|
||||
17 +prj01 -- Some project 01 task, no priority
|
||||
18 +prj02 -- Some project(S) 02 task, no priority
|
||||
--
|
||||
TODO: 10 of 20 tasks shown
|
||||
|
||||
>>> todo.sh -P -@ ls @con01
|
||||
[1;33m01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 +prj02 -- Some project 02 task, pri A[0m
|
||||
[0;32m05 +prj01 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 +prj02 -- Some project 02 task, pri B[0m
|
||||
[1;34m09 +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 +prj02 -- Some project 02 task, pri C[0m
|
||||
[1;37m13 +prj01 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 +prj02 -- Some project 02 task, pri D[0m
|
||||
17 +prj01 -- Some project 01 task, no priority
|
||||
18 +prj02 -- Some project(S) 02 task, no priority
|
||||
--
|
||||
TODO: 10 of 20 tasks shown
|
||||
|
||||
>>> todo.sh -P -@ -+ -P -@ -+ ls @con01
|
||||
[1;33m01 (A) @con01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 (A) @con01 +prj02 -- Some project 02 task, pri A[0m
|
||||
[0;32m05 (B) @con01 +prj01 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 (B) @con01 +prj02 -- Some project 02 task, pri B[0m
|
||||
[1;34m09 (C) @con01 +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 (C) @con01 +prj02 -- Some project 02 task, pri C[0m
|
||||
[1;37m13 (D) @con01 +prj01 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 (D) @con01 +prj02 -- Some project 02 task, pri D[0m
|
||||
17 @con01 +prj01 -- Some project 01 task, no priority
|
||||
18 @con01 +prj02 -- Some project(S) 02 task, no priority
|
||||
--
|
||||
TODO: 10 of 20 tasks shown
|
||||
|
||||
>>> todo.sh -P -@ -+ -P -@ -+ -P -@ -+ ls @con01
|
||||
[1;33m01 -- Some project 01 task, pri A[0m
|
||||
[1;33m02 -- Some project 02 task, pri A[0m
|
||||
[0;32m05 -- Some project 01 task, pri B[0m
|
||||
[0;32m06 -- Some project 02 task, pri B[0m
|
||||
[1;34m09 -- Some project 01 task, pri C[0m
|
||||
[1;34m10 -- Some project 02 task, pri C[0m
|
||||
[1;37m13 -- Some project 01 task, pri D[0m
|
||||
[1;37m14 -- Some project 02 task, pri D[0m
|
||||
17 -- Some project 01 task, no priority
|
||||
18 -- Some project(S) 02 task, no priority
|
||||
--
|
||||
TODO: 10 of 20 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check the line number padding
|
||||
#
|
||||
cat > todo.txt <<EOF
|
||||
hex00 this is one line
|
||||
hex01 this is another line
|
||||
hex02 this is another line
|
||||
hex03 this is another line
|
||||
hex04 this is another line
|
||||
hex05 this is another line
|
||||
hex06 this is another line
|
||||
hex07 this is another line
|
||||
hex08 this is another line
|
||||
hex09 this is another line
|
||||
hex0A this is another line
|
||||
hex0B this is another line
|
||||
hex0C this is another line
|
||||
hex0D this is another line
|
||||
hex0E this is another line
|
||||
hex0F this is another line
|
||||
hex10 this is line is a multiple of 16
|
||||
hex11 this is another line
|
||||
hex12 this is another line
|
||||
hex13 this is another line
|
||||
hex14 this is another line
|
||||
hex15 this is another line
|
||||
hex16 this is another line
|
||||
hex17 this is another line
|
||||
hex18 this is another line
|
||||
hex19 this is another line
|
||||
hex1A this is another line
|
||||
hex1B this is another line
|
||||
hex1C this is another line
|
||||
hex1D this is another line
|
||||
hex1E this is another line
|
||||
hex1F this is another line
|
||||
hex20 this is line is a multiple of 16
|
||||
hex21 this is another line
|
||||
hex22 this is another line
|
||||
hex23 this is another line
|
||||
hex24 this is another line
|
||||
hex25 this is another line
|
||||
hex26 this is another line
|
||||
hex27 this is another line
|
||||
hex28 this is another line
|
||||
hex29 this is another line
|
||||
hex2A this is another line
|
||||
hex2B this is another line
|
||||
hex2C this is another line
|
||||
hex2D this is another line
|
||||
hex2E this is another line
|
||||
hex2F this is another line
|
||||
hex30 this is line is a multiple of 16
|
||||
hex31 this is another line
|
||||
hex32 this is another line
|
||||
hex33 this is another line
|
||||
hex34 this is another line
|
||||
hex35 this is another line
|
||||
hex36 this is another line
|
||||
hex37 this is another line
|
||||
hex38 this is another line
|
||||
hex39 this is another line
|
||||
hex3A this is another line
|
||||
hex3B this is another line
|
||||
hex3C this is another line
|
||||
hex3D this is another line
|
||||
hex3E this is another line
|
||||
hex3F this is another line
|
||||
hex40 this is line is a multiple of 16
|
||||
hex41 this is another line
|
||||
hex42 this is another line
|
||||
hex43 this is another line
|
||||
hex44 this is another line
|
||||
hex45 this is another line
|
||||
hex46 this is another line
|
||||
hex47 this is another line
|
||||
hex48 this is another line
|
||||
hex49 this is another line
|
||||
hex4A this is another line
|
||||
hex4B this is another line
|
||||
hex4C this is another line
|
||||
hex4D this is another line
|
||||
hex4E this is another line
|
||||
hex4F this is another line
|
||||
hex50 this is line is a multiple of 16
|
||||
hex51 this is another line
|
||||
hex52 this is another line
|
||||
hex53 this is another line
|
||||
hex54 this is another line
|
||||
hex55 this is another line
|
||||
hex56 this is another line
|
||||
hex57 this is another line
|
||||
hex58 this is another line
|
||||
hex59 this is another line
|
||||
hex5A this is another line
|
||||
hex5B this is another line
|
||||
hex5C this is another line
|
||||
hex5D this is another line
|
||||
hex5E this is another line
|
||||
hex5F this is another line
|
||||
hex60 this is line is a multiple of 16
|
||||
hex61 this is another line
|
||||
hex62 this is another line
|
||||
hex63 this is another line
|
||||
hex64 this is another line
|
||||
hex65 this is another line
|
||||
hex66 this is another line
|
||||
hex67 this is another line
|
||||
hex68 this is another line
|
||||
hex69 this is another line
|
||||
hex6A this is another line
|
||||
hex6B this is another line
|
||||
hex6C this is another line
|
||||
hex6D this is another line
|
||||
hex6E this is another line
|
||||
hex6F this is another line
|
||||
EOF
|
||||
test_todo_session 'check line number padding, out to 3 digits' <<EOF
|
||||
>>> todo.sh ls
|
||||
001 hex00 this is one line
|
||||
002 hex01 this is another line
|
||||
003 hex02 this is another line
|
||||
004 hex03 this is another line
|
||||
005 hex04 this is another line
|
||||
006 hex05 this is another line
|
||||
007 hex06 this is another line
|
||||
008 hex07 this is another line
|
||||
009 hex08 this is another line
|
||||
010 hex09 this is another line
|
||||
011 hex0A this is another line
|
||||
012 hex0B this is another line
|
||||
013 hex0C this is another line
|
||||
014 hex0D this is another line
|
||||
015 hex0E this is another line
|
||||
016 hex0F this is another line
|
||||
017 hex10 this is line is a multiple of 16
|
||||
018 hex11 this is another line
|
||||
019 hex12 this is another line
|
||||
020 hex13 this is another line
|
||||
021 hex14 this is another line
|
||||
022 hex15 this is another line
|
||||
023 hex16 this is another line
|
||||
024 hex17 this is another line
|
||||
025 hex18 this is another line
|
||||
026 hex19 this is another line
|
||||
027 hex1A this is another line
|
||||
028 hex1B this is another line
|
||||
029 hex1C this is another line
|
||||
030 hex1D this is another line
|
||||
031 hex1E this is another line
|
||||
032 hex1F this is another line
|
||||
033 hex20 this is line is a multiple of 16
|
||||
034 hex21 this is another line
|
||||
035 hex22 this is another line
|
||||
036 hex23 this is another line
|
||||
037 hex24 this is another line
|
||||
038 hex25 this is another line
|
||||
039 hex26 this is another line
|
||||
040 hex27 this is another line
|
||||
041 hex28 this is another line
|
||||
042 hex29 this is another line
|
||||
043 hex2A this is another line
|
||||
044 hex2B this is another line
|
||||
045 hex2C this is another line
|
||||
046 hex2D this is another line
|
||||
047 hex2E this is another line
|
||||
048 hex2F this is another line
|
||||
049 hex30 this is line is a multiple of 16
|
||||
050 hex31 this is another line
|
||||
051 hex32 this is another line
|
||||
052 hex33 this is another line
|
||||
053 hex34 this is another line
|
||||
054 hex35 this is another line
|
||||
055 hex36 this is another line
|
||||
056 hex37 this is another line
|
||||
057 hex38 this is another line
|
||||
058 hex39 this is another line
|
||||
059 hex3A this is another line
|
||||
060 hex3B this is another line
|
||||
061 hex3C this is another line
|
||||
062 hex3D this is another line
|
||||
063 hex3E this is another line
|
||||
064 hex3F this is another line
|
||||
065 hex40 this is line is a multiple of 16
|
||||
066 hex41 this is another line
|
||||
067 hex42 this is another line
|
||||
068 hex43 this is another line
|
||||
069 hex44 this is another line
|
||||
070 hex45 this is another line
|
||||
071 hex46 this is another line
|
||||
072 hex47 this is another line
|
||||
073 hex48 this is another line
|
||||
074 hex49 this is another line
|
||||
075 hex4A this is another line
|
||||
076 hex4B this is another line
|
||||
077 hex4C this is another line
|
||||
078 hex4D this is another line
|
||||
079 hex4E this is another line
|
||||
080 hex4F this is another line
|
||||
081 hex50 this is line is a multiple of 16
|
||||
082 hex51 this is another line
|
||||
083 hex52 this is another line
|
||||
084 hex53 this is another line
|
||||
085 hex54 this is another line
|
||||
086 hex55 this is another line
|
||||
087 hex56 this is another line
|
||||
088 hex57 this is another line
|
||||
089 hex58 this is another line
|
||||
090 hex59 this is another line
|
||||
091 hex5A this is another line
|
||||
092 hex5B this is another line
|
||||
093 hex5C this is another line
|
||||
094 hex5D this is another line
|
||||
095 hex5E this is another line
|
||||
096 hex5F this is another line
|
||||
097 hex60 this is line is a multiple of 16
|
||||
098 hex61 this is another line
|
||||
099 hex62 this is another line
|
||||
100 hex63 this is another line
|
||||
101 hex64 this is another line
|
||||
102 hex65 this is another line
|
||||
103 hex66 this is another line
|
||||
104 hex67 this is another line
|
||||
105 hex68 this is another line
|
||||
106 hex69 this is another line
|
||||
107 hex6A this is another line
|
||||
108 hex6B this is another line
|
||||
109 hex6C this is another line
|
||||
110 hex6D this is another line
|
||||
111 hex6E this is another line
|
||||
112 hex6F this is another line
|
||||
--
|
||||
TODO: 112 of 112 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check that blank lines are ignored.
|
||||
#
|
||||
|
||||
# Less than 10
|
||||
cat > todo.txt <<EOF
|
||||
hex00 this is one line
|
||||
|
||||
hex02 this is another line
|
||||
hex03 this is another line
|
||||
hex04 this is another line
|
||||
hex05 this is another line
|
||||
hex06 this is another line
|
||||
hex07 this is another line
|
||||
EOF
|
||||
test_todo_session 'check that blank lines are ignored for less than 10 items' <<EOF
|
||||
>>> todo.sh ls
|
||||
1 hex00 this is one line
|
||||
3 hex02 this is another line
|
||||
4 hex03 this is another line
|
||||
5 hex04 this is another line
|
||||
6 hex05 this is another line
|
||||
7 hex06 this is another line
|
||||
8 hex07 this is another line
|
||||
--
|
||||
TODO: 7 of 7 tasks shown
|
||||
EOF
|
||||
|
||||
# More than 10
|
||||
cat > todo.txt <<EOF
|
||||
hex00 this is one line
|
||||
|
||||
hex02 this is another line
|
||||
hex03 this is another line
|
||||
hex04 this is another line
|
||||
hex05 this is another line
|
||||
hex06 this is another line
|
||||
hex07 this is another line
|
||||
hex08 this is another line
|
||||
hex09 this is another line
|
||||
EOF
|
||||
test_todo_session 'check that blank lines are ignored for blank lines whose ID begins with `0` (one blank)' <<EOF
|
||||
>>> todo.sh ls
|
||||
01 hex00 this is one line
|
||||
03 hex02 this is another line
|
||||
04 hex03 this is another line
|
||||
05 hex04 this is another line
|
||||
06 hex05 this is another line
|
||||
07 hex06 this is another line
|
||||
08 hex07 this is another line
|
||||
09 hex08 this is another line
|
||||
10 hex09 this is another line
|
||||
--
|
||||
TODO: 9 of 9 tasks shown
|
||||
EOF
|
||||
cat > todo.txt <<EOF
|
||||
hex00 this is one line
|
||||
|
||||
hex02 this is another line
|
||||
hex03 this is another line
|
||||
hex04 this is another line
|
||||
hex05 this is another line
|
||||
|
||||
hex07 this is another line
|
||||
hex08 this is another line
|
||||
hex09 this is another line
|
||||
EOF
|
||||
test_todo_session 'check that blank lines are ignored for blank lines whose ID begins with `0` (many blanks)' <<EOF
|
||||
>>> todo.sh ls
|
||||
01 hex00 this is one line
|
||||
03 hex02 this is another line
|
||||
04 hex03 this is another line
|
||||
05 hex04 this is another line
|
||||
06 hex05 this is another line
|
||||
08 hex07 this is another line
|
||||
09 hex08 this is another line
|
||||
10 hex09 this is another line
|
||||
--
|
||||
TODO: 8 of 8 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
127
tests/t1310-listcon.sh
Executable file
127
tests/t1310-listcon.sh
Executable file
@@ -0,0 +1,127 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='listcon functionality
|
||||
|
||||
This test checks basic context listing functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
item 1
|
||||
item 2
|
||||
item 3
|
||||
EOF
|
||||
test_expect_success 'listcon no contexts' '
|
||||
todo.sh listcon > output && ! test -s output
|
||||
'
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(A) @1 -- Some context 1 task, whitespace, one char
|
||||
(A) @c2 -- Some context 2 task, whitespace, two char
|
||||
@con03 -- Some context 3 task, no whitespace
|
||||
@con04 -- Some context 4 task, no whitespace
|
||||
@con05@con06 -- weird context
|
||||
EOF
|
||||
test_todo_session 'Single context per line' <<EOF
|
||||
>>> todo.sh listcon
|
||||
@1
|
||||
@c2
|
||||
@con03
|
||||
@con04
|
||||
@con05@con06
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
@con01 -- Some context 1 task
|
||||
@con02 -- Some context 2 task
|
||||
@con02 @con03 -- Multi-context task
|
||||
EOF
|
||||
test_todo_session 'Multi-context per line' <<EOF
|
||||
>>> todo.sh listcon
|
||||
@con01
|
||||
@con02
|
||||
@con03
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
@con01 -- Some context 1 task
|
||||
@con02 -- Some context 2 task
|
||||
@con02 ginatrapani@gmail.com -- Some context 2 task
|
||||
EOF
|
||||
test_todo_session 'listcon e-mail address test' <<EOF
|
||||
>>> todo.sh listcon
|
||||
@con01
|
||||
@con02
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +roses @outside +shared
|
||||
(C) notice the sunflowers +sunflowers @garden +shared +landscape
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'listcon with project' <<EOF
|
||||
>>> todo.sh listcon +landscape
|
||||
@garden
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) +math (@school or @home) integrate @x and @y
|
||||
(C) say thanks @GinaTrapani w:@OtherContributors
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'listcon with default configuration' <<EOF
|
||||
>>> todo.sh listcon
|
||||
@GinaTrapani
|
||||
@home)
|
||||
@x
|
||||
@y
|
||||
EOF
|
||||
test_todo_session 'listcon limiting to multi-character sequences' <<EOF
|
||||
>>> TODOTXT_SIGIL_VALID_PATTERN='.\{2,\}' todo.sh listcon
|
||||
@GinaTrapani
|
||||
@home)
|
||||
EOF
|
||||
test_todo_session 'listcon allowing w: marker before contexts' <<EOF
|
||||
>>> TODOTXT_SIGIL_BEFORE_PATTERN='\(w:\)\{0,1\}' todo.sh listcon
|
||||
@GinaTrapani
|
||||
@OtherContributors
|
||||
@home)
|
||||
@x
|
||||
@y
|
||||
EOF
|
||||
test_todo_session 'listcon allowing parentheses around contexts' <<EOF
|
||||
>>> TODOTXT_SIGIL_BEFORE_PATTERN='(\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN=')\{0,1\}' todo.sh listcon
|
||||
@GinaTrapani
|
||||
@home
|
||||
@school
|
||||
@x
|
||||
@y
|
||||
EOF
|
||||
test_todo_session 'listcon with all customizations combined' <<EOF
|
||||
>>> TODOTXT_SIGIL_VALID_PATTERN='.\{2,\}' TODOTXT_SIGIL_BEFORE_PATTERN='\(w:\)\{0,1\}\((\)\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN=')\{0,1\}' todo.sh listcon
|
||||
@GinaTrapani
|
||||
@OtherContributors
|
||||
@home
|
||||
@school
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
@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
|
||||
147
tests/t1320-listproj.sh
Executable file
147
tests/t1320-listproj.sh
Executable file
@@ -0,0 +1,147 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='listproj functionality
|
||||
|
||||
This test checks basic project listing functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
item 1
|
||||
item 2
|
||||
item 3
|
||||
EOF
|
||||
test_expect_success 'listproj no projects' '
|
||||
todo.sh listproj > output && ! test -s output
|
||||
'
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(A) +1 -- Some project 1 task, whitespace, one char
|
||||
(A) +p2 -- Some project 2 task, whitespace, two char
|
||||
+prj03 -- Some project 3 task, no whitespace
|
||||
+prj04 -- Some project 4 task, no whitespace
|
||||
+prj05+prj06 -- weird project
|
||||
EOF
|
||||
test_todo_session 'Single project per line' <<EOF
|
||||
>>> todo.sh listproj
|
||||
+1
|
||||
+p2
|
||||
+prj03
|
||||
+prj04
|
||||
+prj05+prj06
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
+prj01 -- Some project 1 task
|
||||
+prj02 -- Some project 2 task
|
||||
+prj02 +prj03 -- Multi-project task
|
||||
EOF
|
||||
test_todo_session 'Multi-project per line' <<EOF
|
||||
>>> todo.sh listproj
|
||||
+prj01
|
||||
+prj02
|
||||
+prj03
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
+prj01 -- Some project 1 task
|
||||
+prj02 -- Some project 2 task
|
||||
+prj02 ginatrapani+todo@gmail.com -- Some project 2 task
|
||||
EOF
|
||||
test_todo_session 'listproj embedded + test' <<EOF
|
||||
>>> todo.sh listproj
|
||||
+prj01
|
||||
+prj02
|
||||
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
|
||||
|
||||
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'
|
||||
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
|
||||
184
tests/t1330-ls-highlighting.sh
Executable file
184
tests/t1330-ls-highlighting.sh
Executable file
@@ -0,0 +1,184 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='list highlighting
|
||||
|
||||
This test checks the highlighting (with colors) of prioritized tasks.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
TEST_TODO_=todo.cfg
|
||||
|
||||
#
|
||||
# check the highlighting of prioritized tasks
|
||||
#
|
||||
cat > todo.txt <<EOF
|
||||
(A) @con01 +prj01 -- Some project 01 task, pri A
|
||||
(B) @con02 +prj02 -- Some project 02 task, pri B
|
||||
(C) @con01 +prj01 -- Some project 01 task, pri C
|
||||
(D) @con02 +prj02 -- Some project 02 task, pri D
|
||||
(E) @con01 +prj01 -- Some project 01 task, pri E
|
||||
(Z) @con02 +prj02 -- Some project 02 task, pri Z
|
||||
@con01 +prj01 -- Some project 01 task, no priority
|
||||
@con02 +prj02 -- Some project 02 task, no priority
|
||||
EOF
|
||||
test_todo_session 'default highlighting' <<EOF
|
||||
>>> todo.sh ls
|
||||
[1;33m1 (A) @con01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[0;32m2 (B) @con02 +prj02 -- Some project 02 task, pri B[0m
|
||||
[1;34m3 (C) @con01 +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;37m4 (D) @con02 +prj02 -- Some project 02 task, pri D[0m
|
||||
[1;37m5 (E) @con01 +prj01 -- Some project 01 task, pri E[0m
|
||||
[1;37m6 (Z) @con02 +prj02 -- Some project 02 task, pri Z[0m
|
||||
7 @con01 +prj01 -- Some project 01 task, no priority
|
||||
8 @con02 +prj02 -- Some project 02 task, no priority
|
||||
--
|
||||
TODO: 8 of 8 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check changing the color definitions into something other than ANSI color
|
||||
# escape sequences
|
||||
#
|
||||
TEST_TODO_CUSTOM=todo-custom.cfg
|
||||
cat todo.cfg > "$TEST_TODO_CUSTOM"
|
||||
cat >> "$TEST_TODO_CUSTOM" <<'EOF'
|
||||
export YELLOW='${color yellow}'
|
||||
export GREEN='${color green}'
|
||||
export LIGHT_BLUE='${color LightBlue}'
|
||||
export WHITE='${color white}'
|
||||
export DEFAULT='${color}'
|
||||
export PRI_A=$YELLOW
|
||||
export PRI_B=$GREEN
|
||||
export PRI_C=$LIGHT_BLUE
|
||||
export PRI_X=$WHITE
|
||||
EOF
|
||||
test_todo_session 'customized highlighting' <<'EOF'
|
||||
>>> todo.sh -d "$TEST_TODO_CUSTOM" ls
|
||||
${color yellow}1 (A) @con01 +prj01 -- Some project 01 task, pri A${color}
|
||||
${color green}2 (B) @con02 +prj02 -- Some project 02 task, pri B${color}
|
||||
${color LightBlue}3 (C) @con01 +prj01 -- Some project 01 task, pri C${color}
|
||||
${color white}4 (D) @con02 +prj02 -- Some project 02 task, pri D${color}
|
||||
${color white}5 (E) @con01 +prj01 -- Some project 01 task, pri E${color}
|
||||
${color white}6 (Z) @con02 +prj02 -- Some project 02 task, pri Z${color}
|
||||
7 @con01 +prj01 -- Some project 01 task, no priority
|
||||
8 @con02 +prj02 -- Some project 02 task, no priority
|
||||
--
|
||||
TODO: 8 of 8 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check defining highlightings for more priorities than the default A, B, C
|
||||
#
|
||||
TEST_TODO_ADDITIONAL=todo-additional.cfg
|
||||
cat todo.cfg > "$TEST_TODO_ADDITIONAL"
|
||||
cat >> "$TEST_TODO_ADDITIONAL" <<'EOF'
|
||||
export PRI_E=$BROWN
|
||||
export PRI_Z=$LIGHT_PURPLE
|
||||
EOF
|
||||
test_todo_session 'additional highlighting pri E+Z' <<'EOF'
|
||||
>>> todo.sh -d "$TEST_TODO_ADDITIONAL" ls
|
||||
[1;33m1 (A) @con01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[0;32m2 (B) @con02 +prj02 -- Some project 02 task, pri B[0m
|
||||
[1;34m3 (C) @con01 +prj01 -- Some project 01 task, pri C[0m
|
||||
[1;37m4 (D) @con02 +prj02 -- Some project 02 task, pri D[0m
|
||||
[0;33m5 (E) @con01 +prj01 -- Some project 01 task, pri E[0m
|
||||
[1;35m6 (Z) @con02 +prj02 -- Some project 02 task, pri Z[0m
|
||||
7 @con01 +prj01 -- Some project 01 task, no priority
|
||||
8 @con02 +prj02 -- Some project 02 task, no priority
|
||||
--
|
||||
TODO: 8 of 8 tasks shown
|
||||
EOF
|
||||
|
||||
# check changing the fallback highlighting for undefined priorities
|
||||
#
|
||||
TEST_TODO_PRI_X=todo-pri-x.cfg
|
||||
cat todo.cfg > "$TEST_TODO_PRI_X"
|
||||
cat >> "$TEST_TODO_PRI_X" <<'EOF'
|
||||
export PRI_X=$BROWN
|
||||
EOF
|
||||
test_todo_session 'different highlighting for pri X' <<'EOF'
|
||||
>>> todo.sh -d "$TEST_TODO_PRI_X" ls
|
||||
[1;33m1 (A) @con01 +prj01 -- Some project 01 task, pri A[0m
|
||||
[0;32m2 (B) @con02 +prj02 -- Some project 02 task, pri B[0m
|
||||
[1;34m3 (C) @con01 +prj01 -- Some project 01 task, pri C[0m
|
||||
[0;33m4 (D) @con02 +prj02 -- Some project 02 task, pri D[0m
|
||||
[0;33m5 (E) @con01 +prj01 -- Some project 01 task, pri E[0m
|
||||
[0;33m6 (Z) @con02 +prj02 -- Some project 02 task, pri Z[0m
|
||||
7 @con01 +prj01 -- Some project 01 task, no priority
|
||||
8 @con02 +prj02 -- Some project 02 task, no priority
|
||||
--
|
||||
TODO: 8 of 8 tasks shown
|
||||
EOF
|
||||
|
||||
# check highlighting of done (but not yet archived) tasks
|
||||
#
|
||||
cat > todo.txt <<EOF
|
||||
(A) smell the uppercase Roses +flowers @outside
|
||||
remove1
|
||||
notice the sunflowers
|
||||
remove2
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'highlighting of done tasks' <<EOF
|
||||
>>> todo.sh -a do 2
|
||||
2 x 2009-02-13 remove1
|
||||
TODO: 2 marked as done.
|
||||
|
||||
>>> todo.sh list
|
||||
[1;33m1 (A) smell the uppercase Roses +flowers @outside[0m
|
||||
3 notice the sunflowers
|
||||
4 remove2
|
||||
5 stop
|
||||
[0;37m2 x 2009-02-13 remove1[0m
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
|
||||
>>> todo.sh -a do 4
|
||||
4 x 2009-02-13 remove2
|
||||
TODO: 4 marked as done.
|
||||
|
||||
>>> todo.sh list
|
||||
[1;33m1 (A) smell the uppercase Roses +flowers @outside[0m
|
||||
3 notice the sunflowers
|
||||
5 stop
|
||||
[0;37m2 x 2009-02-13 remove1[0m
|
||||
[0;37m4 x 2009-02-13 remove2[0m
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
EOF
|
||||
|
||||
# check highlighting with hidden contexts/projects
|
||||
#
|
||||
cat > todo.txt <<EOF
|
||||
(A) +project at the beginning, with priority
|
||||
(B) with priority, ending in a +project
|
||||
(C) @context at the beginning, with priority
|
||||
(Z) with priority, ending in a @context
|
||||
EOF
|
||||
test_todo_session 'highlighting with hidden contexts/projects' <<EOF
|
||||
>>> todo.sh -+ -@ list
|
||||
[1;33m1 (A) at the beginning, with priority[0m
|
||||
[0;32m2 (B) with priority, ending in a[0m
|
||||
[1;34m3 (C) at the beginning, with priority[0m
|
||||
[1;37m4 (Z) with priority, ending in a[0m
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
# check that priorities are only matched at the start of the task
|
||||
#
|
||||
cat > todo.txt <<EOF
|
||||
(D) some prioritized task
|
||||
not prioritized
|
||||
should not be seen as PRIORITIZE(D) task
|
||||
EOF
|
||||
test_todo_session 'highlighting priority position' <<EOF
|
||||
>>> todo.sh ls
|
||||
[1;37m1 (D) some prioritized task[0m
|
||||
2 not prioritized
|
||||
3 should not be seen as PRIORITIZE(D) task
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
64
tests/t1340-listescapes.sh
Executable file
64
tests/t1340-listescapes.sh
Executable file
@@ -0,0 +1,64 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='list with escape sequences
|
||||
|
||||
This test checks listing of tasks that have embedded escape sequences in them.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
#
|
||||
# check aborted list output on \c escape sequence
|
||||
#
|
||||
cat > todo.txt <<'EOF'
|
||||
first todo
|
||||
second todo run C:\WINDOWS\sysnative\cscript.exe
|
||||
third todo
|
||||
EOF
|
||||
|
||||
test_todo_session 'aborted list output on backslash-c' <<'EOF'
|
||||
>>> todo.sh ls
|
||||
1 first todo
|
||||
2 second todo run C:\WINDOWS\sysnative\cscript.exe
|
||||
3 third todo
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh ls 2
|
||||
2 second todo run C:\WINDOWS\sysnative\cscript.exe
|
||||
--
|
||||
TODO: 1 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check various escape sequences
|
||||
#
|
||||
cat > todo.txt <<'EOF'
|
||||
first todo with \\, \a and \t
|
||||
second todo with \r\n line break
|
||||
third todo with \x42\x55\x47 and \033[0;31m color codes \033[0;30m
|
||||
EOF
|
||||
|
||||
test_todo_session 'various escape sequences' <<'EOF'
|
||||
>>> todo.sh ls
|
||||
1 first todo with \\, \a and \t
|
||||
2 second todo with \r\n line break
|
||||
3 third todo with \x42\x55\x47 and \033[0;31m color codes \033[0;30m
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
#
|
||||
# check embedding of actual color sequence
|
||||
#
|
||||
cat > todo.txt <<'EOF'
|
||||
A task with [0;31m actual color [0;30m
|
||||
EOF
|
||||
|
||||
test_todo_session 'embedding of actual color sequence' <<'EOF'
|
||||
>>> todo.sh ls
|
||||
1 A task with [0;31m actual color [0;30m
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
150
tests/t1350-listall.sh
Executable file
150
tests/t1350-listall.sh
Executable file
@@ -0,0 +1,150 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='listall functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
smell the uppercase Roses +flowers @outside
|
||||
x 2011-08-08 tend the garden @outside
|
||||
notice the sunflowers
|
||||
x 2011-12-26 go outside +wakeup
|
||||
(A) stop
|
||||
EOF
|
||||
cat > done.txt <<EOF
|
||||
x 2011-12-01 eat breakfast
|
||||
x 2011-12-05 smell the coffee +wakeup
|
||||
EOF
|
||||
|
||||
test_todo_session 'basic listall' <<EOF
|
||||
>>> todo.sh -p listall
|
||||
5 (A) stop
|
||||
3 notice the sunflowers
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
2 x 2011-08-08 tend the garden @outside
|
||||
0 x 2011-12-01 eat breakfast
|
||||
0 x 2011-12-05 smell the coffee +wakeup
|
||||
4 x 2011-12-26 go outside +wakeup
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
DONE: 2 of 2 tasks shown
|
||||
total 7 of 7 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'listall highlighting' <<EOF
|
||||
>>> todo.sh listall
|
||||
[1;33m5 (A) stop[0m
|
||||
3 notice the sunflowers
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
[0;37m2 x 2011-08-08 tend the garden @outside[0m
|
||||
[0;37m0 x 2011-12-01 eat breakfast[0m
|
||||
[0;37m0 x 2011-12-05 smell the coffee +wakeup[0m
|
||||
[0;37m4 x 2011-12-26 go outside +wakeup[0m
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
DONE: 2 of 2 tasks shown
|
||||
total 7 of 7 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'listall nonverbose' <<EOF
|
||||
>>> TODOTXT_VERBOSE=0 todo.sh -p listall
|
||||
5 (A) stop
|
||||
3 notice the sunflowers
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
2 x 2011-08-08 tend the garden @outside
|
||||
0 x 2011-12-01 eat breakfast
|
||||
0 x 2011-12-05 smell the coffee +wakeup
|
||||
4 x 2011-12-26 go outside +wakeup
|
||||
EOF
|
||||
|
||||
test_todo_session 'listall filtering' <<EOF
|
||||
>>> todo.sh -p listall @outside
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
2 x 2011-08-08 tend the garden @outside
|
||||
--
|
||||
TODO: 2 of 5 tasks shown
|
||||
DONE: 0 of 2 tasks shown
|
||||
total 2 of 7 tasks shown
|
||||
|
||||
>>> todo.sh -p listall the
|
||||
3 notice the sunflowers
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
2 x 2011-08-08 tend the garden @outside
|
||||
0 x 2011-12-05 smell the coffee +wakeup
|
||||
--
|
||||
TODO: 3 of 5 tasks shown
|
||||
DONE: 1 of 2 tasks shown
|
||||
total 4 of 7 tasks shown
|
||||
|
||||
>>> todo.sh -p listall breakfast
|
||||
0 x 2011-12-01 eat breakfast
|
||||
--
|
||||
TODO: 0 of 5 tasks shown
|
||||
DONE: 1 of 2 tasks shown
|
||||
total 1 of 7 tasks shown
|
||||
|
||||
>>> todo.sh -p listall doesnotmatch
|
||||
--
|
||||
TODO: 0 of 5 tasks shown
|
||||
DONE: 0 of 2 tasks shown
|
||||
total 0 of 7 tasks shown
|
||||
EOF
|
||||
|
||||
cat >> done.txt <<EOF
|
||||
x 2010-01-01 old task 1
|
||||
x 2010-01-01 old task 2
|
||||
x 2010-01-01 old task 3
|
||||
x 2010-01-01 old task 4
|
||||
EOF
|
||||
test_todo_session 'listall number width' <<EOF
|
||||
>>> todo.sh -p listall
|
||||
5 (A) stop
|
||||
3 notice the sunflowers
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
0 x 2010-01-01 old task 1
|
||||
0 x 2010-01-01 old task 2
|
||||
0 x 2010-01-01 old task 3
|
||||
0 x 2010-01-01 old task 4
|
||||
2 x 2011-08-08 tend the garden @outside
|
||||
0 x 2011-12-01 eat breakfast
|
||||
0 x 2011-12-05 smell the coffee +wakeup
|
||||
4 x 2011-12-26 go outside +wakeup
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
DONE: 6 of 6 tasks shown
|
||||
total 11 of 11 tasks shown
|
||||
|
||||
>>> TODOTXT_VERBOSE=0 todo.sh add new task 1
|
||||
|
||||
>>> TODOTXT_VERBOSE=0 todo.sh add new task 2
|
||||
|
||||
>>> TODOTXT_VERBOSE=0 todo.sh add new task 3
|
||||
|
||||
>>> TODOTXT_VERBOSE=0 todo.sh add new task 4
|
||||
|
||||
>>> TODOTXT_VERBOSE=0 todo.sh add new task 5
|
||||
|
||||
>>> todo.sh -p listall
|
||||
05 (A) stop
|
||||
06 new task 1
|
||||
07 new task 2
|
||||
08 new task 3
|
||||
09 new task 4
|
||||
10 new task 5
|
||||
03 notice the sunflowers
|
||||
01 smell the uppercase Roses +flowers @outside
|
||||
00 x 2010-01-01 old task 1
|
||||
00 x 2010-01-01 old task 2
|
||||
00 x 2010-01-01 old task 3
|
||||
00 x 2010-01-01 old task 4
|
||||
02 x 2011-08-08 tend the garden @outside
|
||||
00 x 2011-12-01 eat breakfast
|
||||
00 x 2011-12-05 smell the coffee +wakeup
|
||||
04 x 2011-12-26 go outside +wakeup
|
||||
--
|
||||
TODO: 10 of 10 tasks shown
|
||||
DONE: 6 of 6 tasks shown
|
||||
total 16 of 16 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
90
tests/t1360-ls-project-context-highlighting.sh
Executable file
90
tests/t1360-ls-project-context-highlighting.sh
Executable file
@@ -0,0 +1,90 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='highlighting projects and contexts
|
||||
|
||||
This test checks the highlighting (with colors) of projects and contexts.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
# Prioritized tasks with projects and contexts
|
||||
cat > todo.txt <<EOF
|
||||
(A) prioritized @con01 context
|
||||
(B) prioritized +prj02 project
|
||||
(C) prioritized context at EOL @con03
|
||||
(D) prioritized project at EOL +prj04
|
||||
+prj05 non-prioritized project at BOL
|
||||
@con06 non-prioritized context at BOL
|
||||
multiple @con_ @texts and +pro_ +jects
|
||||
non-contexts: seti@home @ @* @(foo)
|
||||
non-projects: lost+found + +! +(bar)
|
||||
EOF
|
||||
|
||||
# config file specifying COLOR_PROJECT and COLOR_CONTEXT
|
||||
#
|
||||
TEST_TODO_LABEL_COLORS=todo-colors.cfg
|
||||
cat todo.cfg > "$TEST_TODO_LABEL_COLORS"
|
||||
|
||||
echo "export COLOR_CONTEXT='\\\\033[1m'" >>"$TEST_TODO_LABEL_COLORS"
|
||||
echo "export COLOR_PROJECT='\\\\033[2m'" >>"$TEST_TODO_LABEL_COLORS"
|
||||
|
||||
test_todo_session 'highlighting for contexts and projects' <<'EOF'
|
||||
>>> todo.sh -d "$TEST_TODO_LABEL_COLORS" ls
|
||||
[1;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
|
||||
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
|
||||
122
tests/t1400-prepend.sh
Executable file
122
tests/t1400-prepend.sh
Executable file
@@ -0,0 +1,122 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic prepend functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_todo_session 'prepend usage' <<EOF
|
||||
>>> todo.sh prepend B B
|
||||
usage: todo.sh prepend ITEM# "TEXT TO PREPEND"
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'basic prepend' <<EOF
|
||||
>>> todo.sh list
|
||||
[0;32m1 (B) smell the uppercase Roses +flowers @outside[0m
|
||||
2 notice the sunflowers
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
2 notice the sunflowers
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh prepend 2 test
|
||||
2 test notice the sunflowers
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
2 test notice the sunflowers
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh prepend 1 test
|
||||
1 (B) test smell the uppercase Roses +flowers @outside
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) test smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
2 test notice the sunflowers
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
EOF
|
||||
|
||||
test_todo_session 'prepend with &' <<EOF
|
||||
>>> todo.sh prepend 3 "no running & jumping now"
|
||||
3 no running & jumping now stop
|
||||
EOF
|
||||
|
||||
echo 'jump on hay' > todo.txt
|
||||
test_todo_session 'prepend with spaces' <<EOF
|
||||
>>> todo.sh prepend 1 "notice the three spaces and"
|
||||
1 notice the three spaces and jump on hay
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
smell the cows
|
||||
grow some corn
|
||||
thrash some hay
|
||||
chase the chickens
|
||||
EOF
|
||||
test_todo_session 'prepend with symbols' <<EOF
|
||||
>>> todo.sh prepend 1 "~@#$%^&*()-_=+[{]}|;:',<.>/?"
|
||||
1 ~@#$%^&*()-_=+[{]}|;:',<.>/? smell the cows
|
||||
|
||||
>>> todo.sh prepend 2 '\`!\\"'
|
||||
2 \`!\\" grow some corn
|
||||
|
||||
>>> todo.sh list
|
||||
4 chase the chickens
|
||||
3 thrash some hay
|
||||
2 \`!\\" grow some corn
|
||||
1 ~@#$%^&*()-_=+[{]}|;:',<.>/? smell the cows
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'prepend handling prepended date on add' <<EOF
|
||||
>>> todo.sh -t add "new task"
|
||||
1 2009-02-13 new task
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh prepend 1 "this is just a"
|
||||
1 2009-02-13 this is just a new task
|
||||
EOF
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'prepend handling priority and prepended date on add' <<EOF
|
||||
>>> todo.sh -t add "new task"
|
||||
1 2009-02-13 new task
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh pri 1 A
|
||||
1 (A) 2009-02-13 new task
|
||||
TODO: 1 prioritized (A).
|
||||
|
||||
>>> todo.sh prepend 1 "this is just a"
|
||||
1 (A) 2009-02-13 this is just a new task
|
||||
EOF
|
||||
|
||||
cat /dev/null > todo.txt
|
||||
test_todo_session 'prepend with prepended date keeps both' <<EOF
|
||||
>>> todo.sh -t add "new task"
|
||||
1 2009-02-13 new task
|
||||
TODO: 1 added.
|
||||
|
||||
>>> todo.sh prepend 1 "2010-07-04 this is just a"
|
||||
1 2009-02-13 2010-07-04 this is just a new task
|
||||
EOF
|
||||
|
||||
test_done
|
||||
88
tests/t1500-do.sh
Executable file
88
tests/t1500-do.sh
Executable file
@@ -0,0 +1,88 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='do functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
#DATE=`date '+%Y-%m-%d'`
|
||||
|
||||
test_todo_session 'do usage' <<EOF
|
||||
>>> todo.sh do B B
|
||||
usage: todo.sh do ITEM#[, ITEM#, ITEM#, ...]
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
test_todo_session 'do missing ITEM#' <<EOF
|
||||
>>> todo.sh do
|
||||
usage: todo.sh do ITEM#[, ITEM#, ITEM#, ...]
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
smell the uppercase Roses +flowers @outside
|
||||
notice the sunflowers
|
||||
stop
|
||||
remove1
|
||||
remove2
|
||||
remove3
|
||||
remove4
|
||||
EOF
|
||||
|
||||
test_todo_session 'basic do' <<EOF
|
||||
>>> todo.sh list
|
||||
2 notice the sunflowers
|
||||
4 remove1
|
||||
5 remove2
|
||||
6 remove3
|
||||
7 remove4
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
--
|
||||
TODO: 7 of 7 tasks shown
|
||||
|
||||
>>> todo.sh do 7,6
|
||||
7 x 2009-02-13 remove4
|
||||
TODO: 7 marked as done.
|
||||
6 x 2009-02-13 remove3
|
||||
TODO: 6 marked as done.
|
||||
x 2009-02-13 remove3
|
||||
x 2009-02-13 remove4
|
||||
TODO: $HOME/todo.txt archived.
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 notice the sunflowers
|
||||
4 remove1
|
||||
5 remove2
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
|
||||
>>> todo.sh do 5 4
|
||||
5 x 2009-02-13 remove2
|
||||
TODO: 5 marked as done.
|
||||
4 x 2009-02-13 remove1
|
||||
TODO: 4 marked as done.
|
||||
x 2009-02-13 remove1
|
||||
x 2009-02-13 remove2
|
||||
TODO: $HOME/todo.txt archived.
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 notice the sunflowers
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'fail multiple do attempts' <<EOF
|
||||
>>> todo.sh -a do 3
|
||||
3 x 2009-02-13 stop
|
||||
TODO: 3 marked as done.
|
||||
|
||||
>>> todo.sh -a do 3
|
||||
=== 1
|
||||
TODO: 3 is already marked done.
|
||||
EOF
|
||||
|
||||
test_done
|
||||
103
tests/t1600-append.sh
Executable file
103
tests/t1600-append.sh
Executable file
@@ -0,0 +1,103 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic append functionality
|
||||
|
||||
Ensure we can append items successfully.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
#
|
||||
# Set up the basic todo.txt
|
||||
#
|
||||
todo.sh add notice the daisies > /dev/null
|
||||
|
||||
test_todo_session 'append usage' <<EOF
|
||||
>>> todo.sh append adf asdfa
|
||||
=== 1
|
||||
usage: todo.sh append ITEM# "TEXT TO APPEND"
|
||||
EOF
|
||||
|
||||
test_todo_session 'append error' <<EOF
|
||||
>>> todo.sh append 10 "hej!"
|
||||
=== 1
|
||||
TODO: No task 10.
|
||||
EOF
|
||||
|
||||
test_todo_session 'basic append' <<EOF
|
||||
>>> todo.sh append 1 "smell the roses"
|
||||
1 notice the daisies smell the roses
|
||||
|
||||
>>> todo.sh list
|
||||
1 notice the daisies smell the roses
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'basic append with &' <<EOF
|
||||
>>> todo.sh append 1 "see the wasps & bees"
|
||||
1 notice the daisies smell the roses see the wasps & bees
|
||||
|
||||
>>> todo.sh list
|
||||
1 notice the daisies smell the roses see the wasps & bees
|
||||
--
|
||||
TODO: 1 of 1 tasks shown
|
||||
EOF
|
||||
|
||||
echo 'jump on hay' > todo.txt
|
||||
test_todo_session 'append with spaces' <<EOF
|
||||
>>> todo.sh append 1 "and notice the three spaces"
|
||||
1 jump on hay and notice the three spaces
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
smell the cows
|
||||
grow some corn
|
||||
thrash some hay
|
||||
chase the chickens
|
||||
EOF
|
||||
test_todo_session 'append with symbols' <<EOF
|
||||
>>> todo.sh append 1 "~@#$%^&*()-_=+[{]}|;:',<.>/?"
|
||||
1 smell the cows ~@#$%^&*()-_=+[{]}|;:',<.>/?
|
||||
|
||||
>>> todo.sh append 2 '\`!\\"'
|
||||
2 grow some corn \`!\\"
|
||||
|
||||
>>> todo.sh list
|
||||
4 chase the chickens
|
||||
2 grow some corn \`!\\"
|
||||
1 smell the cows ~@#$%^&*()-_=+[{]}|;:',<.>/?
|
||||
3 thrash some hay
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
notice the daisies
|
||||
EOF
|
||||
test_todo_session 'append of current sentence' <<EOF
|
||||
>>> todo.sh append 1 ", lilies and roses"
|
||||
1 notice the daisies, lilies and roses
|
||||
|
||||
>>> todo.sh append 1 "; see the wasps"
|
||||
1 notice the daisies, lilies and roses; see the wasps
|
||||
|
||||
>>> todo.sh append 1 "& bees"
|
||||
1 notice the daisies, lilies and roses; see the wasps & bees
|
||||
EOF
|
||||
|
||||
cp todo.cfg special-delimiters.cfg
|
||||
cat >> special-delimiters.cfg <<EOF
|
||||
export SENTENCE_DELIMITERS='*,.:;&'
|
||||
EOF
|
||||
test_todo_session 'append of current sentence SENTENCE_DELIMITERS' <<EOF
|
||||
>>> todo.sh -d special-delimiters.cfg append 1 "&beans"
|
||||
1 notice the daisies, lilies and roses; see the wasps & bees&beans
|
||||
|
||||
>>> todo.sh -d special-delimiters.cfg append 1 "%foo"
|
||||
1 notice the daisies, lilies and roses; see the wasps & bees&beans %foo
|
||||
|
||||
>>> todo.sh -d special-delimiters.cfg append 1 "*2"
|
||||
1 notice the daisies, lilies and roses; see the wasps & bees&beans %foo*2
|
||||
EOF
|
||||
|
||||
test_done
|
||||
98
tests/t1700-depri.sh
Executable file
98
tests/t1700-depri.sh
Executable file
@@ -0,0 +1,98 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic depriority functionality
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_todo_session 'depriority usage' <<EOF
|
||||
>>> todo.sh depri B B
|
||||
usage: todo.sh depri ITEM#[, ITEM#, ITEM#, ...]
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
test_todo_session 'depriority nonexistant item' <<EOF
|
||||
>>> todo.sh depri 42
|
||||
TODO: No task 42.
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'basic depriority' <<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
|
||||
|
||||
>>> todo.sh depri 1
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 deprioritized.
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
1 smell the uppercase Roses +flowers @outside
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
(C) stop
|
||||
EOF
|
||||
test_todo_session 'multiple depriority' <<EOF
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
3 (C) stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh depri 3 2
|
||||
3 stop
|
||||
TODO: 3 deprioritized.
|
||||
2 notice the sunflowers
|
||||
TODO: 2 deprioritized.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
2 notice the sunflowers
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'depriority of unprioritized task' <<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
|
||||
|
||||
>>> todo.sh depri 3 2
|
||||
=== 1
|
||||
TODO: 3 is not prioritized.
|
||||
2 notice the sunflowers
|
||||
TODO: 2 deprioritized.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
2 notice the sunflowers
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
202
tests/t1800-del.sh
Executable file
202
tests/t1800-del.sh
Executable file
@@ -0,0 +1,202 @@
|
||||
#!/bin/bash
|
||||
|
||||
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]
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
test_todo_session 'del nonexistant item' <<EOF
|
||||
>>> todo.sh -f del 42
|
||||
TODO: No task 42.
|
||||
=== 1
|
||||
|
||||
>>> todo.sh -f del 42 Roses
|
||||
TODO: No task 42.
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'basic del' <<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
|
||||
|
||||
>>> todo.sh -f 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
|
||||
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
|
||||
stop
|
||||
EOF
|
||||
test_todo_session 'del preserving line numbers' <<EOF
|
||||
>>> todo.sh -f del 1
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
TODO: 1 deleted.
|
||||
|
||||
>>> todo.sh -f del 1
|
||||
TODO: No task 1.
|
||||
=== 1
|
||||
|
||||
>>> todo.sh add A new task
|
||||
4 A new task
|
||||
TODO: 4 added.
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
4 A new task
|
||||
3 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh -f -n del 2
|
||||
2 (A) notice the sunflowers
|
||||
TODO: 2 deleted.
|
||||
|
||||
>>> todo.sh add Another new task
|
||||
3 Another new task
|
||||
TODO: 3 added.
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 A new task
|
||||
3 Another new task
|
||||
1 stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
(C) stop
|
||||
EOF
|
||||
test_todo_session 'basic del TERM' <<EOF
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
3 (C) stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh del 1 uppercase
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
TODO: Removed 'uppercase' from task.
|
||||
1 (B) smell the Roses +flowers @outside
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
1 (B) smell the Roses +flowers @outside
|
||||
3 (C) stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh del 1 "the Roses"
|
||||
1 (B) smell the Roses +flowers @outside
|
||||
TODO: Removed 'the Roses' from task.
|
||||
1 (B) smell +flowers @outside
|
||||
|
||||
>>> todo.sh del 1 m
|
||||
1 (B) smell +flowers @outside
|
||||
TODO: Removed 'm' from task.
|
||||
1 (B) sell +flowers @outside
|
||||
|
||||
>>> todo.sh del 1 @outside
|
||||
1 (B) sell +flowers @outside
|
||||
TODO: Removed '@outside' from task.
|
||||
1 (B) sell +flowers
|
||||
|
||||
>>> todo.sh del 1 sell
|
||||
1 (B) sell +flowers
|
||||
TODO: Removed 'sell' from task.
|
||||
1 (B) +flowers
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
(C) stop
|
||||
EOF
|
||||
test_todo_session 'del nonexistant TERM' <<EOF
|
||||
>>> todo.sh del 1 dung
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
TODO: 'dung' not found; no removal done.
|
||||
=== 1
|
||||
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
3 (C) stop
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
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
|
||||
35
tests/t1900-archive.sh
Executable file
35
tests/t1900-archive.sh
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='archive functionality
|
||||
|
||||
Ensure we can archive items successfully.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
one
|
||||
two
|
||||
three
|
||||
one
|
||||
x done
|
||||
four
|
||||
EOF
|
||||
|
||||
test_todo_session 'archive with duplicates' <<EOF
|
||||
>>> todo.sh archive
|
||||
x done
|
||||
TODO: $HOME/todo.txt archived.
|
||||
EOF
|
||||
|
||||
test_todo_session 'list after archive' <<EOF
|
||||
>>> todo.sh ls
|
||||
5 four
|
||||
1 one
|
||||
4 one
|
||||
3 three
|
||||
2 two
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
104
tests/t1910-deduplicate.sh
Executable file
104
tests/t1910-deduplicate.sh
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='deduplicate functionality
|
||||
|
||||
Ensure we can deduplicate items successfully.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
duplicated
|
||||
two
|
||||
x done
|
||||
duplicated
|
||||
double task
|
||||
double task
|
||||
three
|
||||
EOF
|
||||
|
||||
test_todo_session 'deduplicate and preserve line numbers' <<EOF
|
||||
>>> todo.sh deduplicate
|
||||
TODO: 2 duplicate task(s) removed
|
||||
|
||||
>>> todo.sh -p ls
|
||||
5 double task
|
||||
1 duplicated
|
||||
7 three
|
||||
2 two
|
||||
3 x done
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'deduplicate without duplicates' <<EOF
|
||||
>>> todo.sh deduplicate
|
||||
=== 1
|
||||
TODO: No duplicate tasks found
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
duplicated
|
||||
two
|
||||
x done
|
||||
duplicated
|
||||
double task
|
||||
double task
|
||||
three
|
||||
EOF
|
||||
test_todo_session 'deduplicate and delete lines' <<EOF
|
||||
>>> todo.sh -n deduplicate
|
||||
TODO: 2 duplicate task(s) removed
|
||||
|
||||
>>> todo.sh -p ls
|
||||
4 double task
|
||||
1 duplicated
|
||||
5 three
|
||||
2 two
|
||||
3 x done
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
one
|
||||
duplicated
|
||||
three
|
||||
duplicated
|
||||
duplicated
|
||||
six
|
||||
duplicated
|
||||
EOF
|
||||
test_todo_session 'deduplicate more than two occurrences' <<EOF
|
||||
>>> todo.sh deduplicate
|
||||
TODO: 3 duplicate task(s) removed
|
||||
|
||||
>>> todo.sh -p ls
|
||||
2 duplicated
|
||||
1 one
|
||||
6 six
|
||||
3 three
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
normal task
|
||||
a [1mbold[0m task
|
||||
something else
|
||||
a [1mbold[0m task
|
||||
something more
|
||||
EOF
|
||||
test_todo_session 'deduplicate with non-printable duplicates' <<EOF
|
||||
>>> todo.sh deduplicate
|
||||
TODO: 1 duplicate task(s) removed
|
||||
|
||||
>>> todo.sh -p ls
|
||||
2 a [1mbold[0m task
|
||||
1 normal task
|
||||
3 something else
|
||||
5 something more
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
test_done
|
||||
96
tests/t1950-report.sh
Executable file
96
tests/t1950-report.sh
Executable file
@@ -0,0 +1,96 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='report functionality
|
||||
|
||||
This test checks the reporting and the format of the report file.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
stop and think
|
||||
smell the coffee +wakeup
|
||||
make the coffee +wakeup
|
||||
visit http://example.com
|
||||
EOF
|
||||
|
||||
test_todo_session 'create new report' <<EOF
|
||||
>>> todo.sh report
|
||||
TODO: $HOME/todo.txt archived.
|
||||
2009-02-13T04:40:00 5 0
|
||||
TODO: Report file updated.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 make the coffee +wakeup
|
||||
3 smell the coffee +wakeup
|
||||
2 stop and think
|
||||
5 visit http://example.com
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'report of done tasks' <<EOF
|
||||
>>> todo.sh -A do 3
|
||||
3 x 2009-02-13 smell the coffee +wakeup
|
||||
TODO: 3 marked as done.
|
||||
x 2009-02-13 smell the coffee +wakeup
|
||||
TODO: $HOME/todo.txt archived.
|
||||
|
||||
>>> todo.sh report
|
||||
TODO: $HOME/todo.txt archived.
|
||||
2009-02-13T04:40:00 4 1
|
||||
TODO: Report file updated.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
3 make the coffee +wakeup
|
||||
2 stop and think
|
||||
4 visit http://example.com
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'report performs archiving' <<EOF
|
||||
>>> todo.sh -a do 3
|
||||
3 x 2009-02-13 make the coffee +wakeup
|
||||
TODO: 3 marked as done.
|
||||
|
||||
>>> todo.sh report
|
||||
x 2009-02-13 make the coffee +wakeup
|
||||
TODO: $HOME/todo.txt archived.
|
||||
2009-02-13T04:40:00 3 2
|
||||
TODO: Report file updated.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
2 stop and think
|
||||
3 visit http://example.com
|
||||
--
|
||||
TODO: 3 of 3 tasks shown
|
||||
|
||||
>>> todo.sh -p listfile done.txt
|
||||
2 x 2009-02-13 make the coffee +wakeup
|
||||
1 x 2009-02-13 smell the coffee +wakeup
|
||||
--
|
||||
DONE: 2 of 2 tasks shown
|
||||
EOF
|
||||
|
||||
test_todo_session 'report is unchanged when no changes' <<EOF
|
||||
>>> cat report.txt
|
||||
2009-02-13T04:40:00 5 0
|
||||
2009-02-13T04:40:00 4 1
|
||||
2009-02-13T04:40:00 3 2
|
||||
|
||||
>>> todo.sh report
|
||||
TODO: $HOME/todo.txt archived.
|
||||
2009-02-13T04:40:00 3 2
|
||||
TODO: Report file is up-to-date.
|
||||
|
||||
>>> cat report.txt
|
||||
2009-02-13T04:40:00 5 0
|
||||
2009-02-13T04:40:00 4 1
|
||||
2009-02-13T04:40:00 3 2
|
||||
EOF
|
||||
|
||||
test_done
|
||||
136
tests/t2000-multiline.sh
Executable file
136
tests/t2000-multiline.sh
Executable file
@@ -0,0 +1,136 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='Multi-line functionality'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
## Replace test
|
||||
# Create the expected file
|
||||
echo "1 smell the cheese
|
||||
TODO: Replaced task with:
|
||||
1 eat apples eat oranges drink milk">"$HOME/expect.multi"
|
||||
|
||||
test_expect_success 'multiline squash item replace' '
|
||||
(
|
||||
# Prepare single line todo file
|
||||
cat /dev/null > "$HOME/todo.txt"
|
||||
"$HOME/bin/todo.sh" add smell the cheese
|
||||
|
||||
# Run replace
|
||||
"$HOME/bin/todo.sh" replace 1 "eat apples
|
||||
eat oranges
|
||||
drink milk" > "$HOME/output.multi"
|
||||
|
||||
# Test output against expected
|
||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
)
|
||||
'
|
||||
|
||||
## Add test
|
||||
# Create the expected file
|
||||
echo "2 eat apples eat oranges drink milk
|
||||
TODO: 2 added.">"$HOME/expect.multi"
|
||||
|
||||
test_expect_success 'multiline squash item add' '
|
||||
(
|
||||
# Prepare single line todo file
|
||||
cat /dev/null > "$HOME/todo.txt"
|
||||
"$HOME/bin/todo.sh" add smell the cheese
|
||||
|
||||
# Run add
|
||||
"$HOME/bin/todo.sh" add "eat apples
|
||||
eat oranges
|
||||
drink milk" > "$HOME/output.multi"
|
||||
|
||||
# Test output against expected
|
||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
)
|
||||
'
|
||||
|
||||
## Append test
|
||||
# Create the expected file
|
||||
echo "1 smell the cheese eat apples eat oranges drink milk">"$HOME/expect.multi"
|
||||
|
||||
test_expect_success 'multiline squash item append' '
|
||||
(
|
||||
# Prepare single line todo file
|
||||
cat /dev/null > "$HOME/todo.txt"
|
||||
"$HOME/bin/todo.sh" add smell the cheese
|
||||
|
||||
# Run append
|
||||
"$HOME/bin/todo.sh" append 1 "eat apples
|
||||
eat oranges
|
||||
drink milk" > "$HOME/output.multi"
|
||||
|
||||
# Test output against expected
|
||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
)
|
||||
'
|
||||
|
||||
## Prepend test
|
||||
# Create the expected file
|
||||
echo "1 eat apples eat oranges drink milk smell the cheese">"$HOME/expect.multi"
|
||||
|
||||
test_expect_success 'multiline squash item prepend' '
|
||||
(
|
||||
# Prepare single line todo file
|
||||
cat /dev/null > "$HOME/todo.txt"
|
||||
"$HOME/bin/todo.sh" add smell the cheese
|
||||
|
||||
# Run prepend
|
||||
"$HOME/bin/todo.sh" prepend 1 "eat apples
|
||||
eat oranges
|
||||
drink milk" > "$HOME/output.multi"
|
||||
|
||||
# Test output against expected
|
||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
)
|
||||
'
|
||||
|
||||
## Multiple line addition
|
||||
# Create the expected file
|
||||
echo "2 eat apples
|
||||
TODO: 2 added." > "$HOME/expect.multi"
|
||||
echo "3 eat oranges
|
||||
TODO: 3 added." >>"$HOME/expect.multi"
|
||||
echo "4 drink milk
|
||||
TODO: 4 added." >>"$HOME/expect.multi"
|
||||
|
||||
test_expect_success 'actual multiline add' '
|
||||
(
|
||||
# Run addm
|
||||
"$HOME/bin/todo.sh" addm "eat apples
|
||||
eat oranges
|
||||
drink milk" > "$HOME/output.multi"
|
||||
|
||||
# Test output against expected
|
||||
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
)
|
||||
'
|
||||
|
||||
test_done
|
||||
43
tests/t2100-help.sh
Executable file
43
tests/t2100-help.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/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
|
||||
80
tests/t2120-shorthelp.sh
Executable file
80
tests/t2120-shorthelp.sh
Executable file
@@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='shorthelp functionality
|
||||
|
||||
This test covers the output of the -h option and the shorthelp action.
|
||||
'
|
||||
. ./actions-test-lib.sh
|
||||
. ./test-lib.sh
|
||||
|
||||
# Note: To avoid having to adapt the test whenever the actions change, only
|
||||
# check for the section headers.
|
||||
test_todo_session '-h output' <<EOF
|
||||
>>> todo.sh -h | sed '/^ [A-Z]/!d'
|
||||
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||
Actions:
|
||||
Actions can be added and overridden using scripts in the actions
|
||||
See "help" for more details.
|
||||
EOF
|
||||
|
||||
test_todo_session 'shorthelp output' <<EOF
|
||||
>>> todo.sh shorthelp | sed '/^ [A-Z]/!d'
|
||||
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||
Actions:
|
||||
Actions can be added and overridden using scripts in the actions
|
||||
See "help" for more details.
|
||||
EOF
|
||||
|
||||
make_action "foo"
|
||||
test_todo_session 'shorthelp output with custom action' <<EOF
|
||||
>>> todo.sh -v shorthelp | sed '/^ [A-Z]/!d'
|
||||
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||
Actions:
|
||||
Actions can be added and overridden using scripts in the actions
|
||||
Add-on Actions:
|
||||
See "help" for more details.
|
||||
EOF
|
||||
|
||||
# Verify that custom configuration is actually processed (when the -d option
|
||||
# precedes the -h option) by specifying a different actions directory and moving
|
||||
# our custom action there. The help output should mention the "Add-On Actions".
|
||||
set -o pipefail # So that the sed filter doesn't swallow todo.sh's exit code.
|
||||
mv todo.cfg custom.cfg
|
||||
mv .todo.actions.d custom.actions
|
||||
echo 'export TODO_ACTIONS_DIR=$HOME/custom.actions' >> custom.cfg
|
||||
|
||||
# Avoid the use of global config file, if it exists
|
||||
export TODOTXT_GLOBAL_CFG_FILE=global.cfg
|
||||
|
||||
test_todo_session '-h and fatal error without config' <<EOF
|
||||
>>> todo.sh -h 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
|
||||
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 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
|
||||
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 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
|
||||
Add-on Actions:
|
||||
See "help" for more details.
|
||||
EOF
|
||||
|
||||
test_done
|
||||
48
tests/t2200-no-done-report-files.sh
Executable file
48
tests/t2200-no-done-report-files.sh
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='todo.sh configuration with a sole todo.txt data file.
|
||||
|
||||
This test covers turning off done.txt and report.txt, and
|
||||
checks that no such empty files are created.
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > test.cfg <<EOF
|
||||
export TODO_DIR=.
|
||||
export TODO_FILE="\$TODO_DIR/todo.txt"
|
||||
export DONE_FILE=/dev/null
|
||||
export REPORT_FILE=/dev/null
|
||||
export TMP_FILE="\$TODO_DIR/todo.tmp"
|
||||
touch used_config
|
||||
EOF
|
||||
|
||||
test_todo_session 'invoke todo.sh' <<EOF
|
||||
>>> todo.sh -d test.cfg add notice the daisies
|
||||
1 notice the daisies
|
||||
TODO: 1 added.
|
||||
EOF
|
||||
|
||||
test_expect_success 'the todo file has been created' '[ -e todo.txt ]'
|
||||
test_expect_success 'no done file has been created' '[ ! -e done.txt ]'
|
||||
test_expect_success 'no report file has been created' '[ ! -e report.txt ]'
|
||||
|
||||
test_todo_session 'perform archive' <<EOF
|
||||
>>> todo.sh -A -d test.cfg do 1
|
||||
1 x 2009-02-13 notice the daisies
|
||||
TODO: 1 marked as done.
|
||||
x 2009-02-13 notice the daisies
|
||||
TODO: ./todo.txt archived.
|
||||
EOF
|
||||
|
||||
test_expect_success 'no done file has been created by the archiving' '[ ! -e done.txt ]'
|
||||
|
||||
test_todo_session 'perform report' <<EOF
|
||||
>>> todo.sh -d test.cfg report
|
||||
TODO: ./todo.txt archived.
|
||||
2009-02-13T04:40:00 0 0
|
||||
TODO: Report file updated.
|
||||
EOF
|
||||
|
||||
test_expect_success 'no report file has been created by the reporting' '[ ! -e report.txt ]'
|
||||
|
||||
test_done
|
||||
21
tests/t6000-completion.sh
Executable file
21
tests/t6000-completion.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/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
|
||||
26
tests/t6010-completion-contexts.sh
Executable file
26
tests/t6010-completion-contexts.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/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
|
||||
26
tests/t6020-completion-projects.sh
Executable file
26
tests/t6020-completion-projects.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/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
|
||||
26
tests/t6030-completion-tasks.sh
Executable file
26
tests/t6030-completion-tasks.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/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
|
||||
20
tests/t6040-completion-files.sh
Executable file
20
tests/t6040-completion-files.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/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
|
||||
91
tests/t6050-completion-addons.sh
Executable file
91
tests/t6050-completion-addons.sh
Executable file
@@ -0,0 +1,91 @@
|
||||
#!/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
|
||||
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
|
||||
42
tests/t6080-completion-path.sh
Executable file
42
tests/t6080-completion-path.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/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
|
||||
67
tests/t6090-completion-aliases.sh
Executable file
67
tests/t6090-completion-aliases.sh
Executable file
@@ -0,0 +1,67 @@
|
||||
#!/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 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='_uppercase_todo -d "$HOME/todo2.cfg"'
|
||||
_todo "$@"
|
||||
}
|
||||
|
||||
test_todo_completion 'all todo1 contexts' 'todo1 list @' '@garden @outdoor @outside'
|
||||
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
|
||||
19
tests/t6100-completion-help.sh
Executable file
19
tests/t6100-completion-help.sh
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/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
|
||||
93
tests/t8000-actions.sh
Executable file
93
tests/t8000-actions.sh
Executable file
@@ -0,0 +1,93 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='custom actions functionality
|
||||
|
||||
This test covers the contract between todo.sh and custom actions.
|
||||
'
|
||||
. ./actions-test-lib.sh
|
||||
. ./test-lib.sh
|
||||
|
||||
make_action "foo"
|
||||
test_todo_session 'executable action' <<EOF
|
||||
>>> todo.sh foo
|
||||
custom action foo
|
||||
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+ }t8000.2"
|
||||
fi
|
||||
test_todo_session 'nonexecutable action' <<EOF
|
||||
>>> todo.sh foo
|
||||
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||
Try 'todo.sh -h' for more information.
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
make_action "ls"
|
||||
test_todo_session 'overriding built-in action' <<EOF
|
||||
>>> todo.sh ls
|
||||
custom action ls
|
||||
|
||||
>>> todo.sh command ls
|
||||
--
|
||||
TODO: 0 of 0 tasks shown
|
||||
EOF
|
||||
|
||||
make_action "bad"
|
||||
echo "exit 42" >> .todo.actions.d/bad
|
||||
test_todo_session 'failing action' <<EOF
|
||||
>>> todo.sh bad
|
||||
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
|
||||
73
tests/t8010-listaddons.sh
Executable file
73
tests/t8010-listaddons.sh
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/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
|
||||
|
||||
invalidate_action .todo.actions.d/foo t8010.4
|
||||
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
|
||||
|
||||
invalidate_action .todo.actions.d/norris/norris t8010.8
|
||||
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
|
||||
167
tests/t9999-testsuite_example.sh
Executable file
167
tests/t9999-testsuite_example.sh
Executable file
@@ -0,0 +1,167 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='basic tests imported from previous framework
|
||||
'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat > todo.txt <<EOF
|
||||
(B) smell the uppercase Roses +flowers @outside
|
||||
(A) notice the sunflowers
|
||||
stop
|
||||
smell the coffee +wakeup
|
||||
EOF
|
||||
test_todo_session 'basic tests' <<EOF
|
||||
>>> todo.sh -p list
|
||||
2 (A) notice the sunflowers
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 smell the coffee +wakeup
|
||||
3 stop
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
|
||||
>>> todo.sh -p list +flowers
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
--
|
||||
TODO: 1 of 4 tasks shown
|
||||
|
||||
>>> todo.sh -p list flowers
|
||||
2 (A) notice the sunflowers
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
--
|
||||
TODO: 2 of 4 tasks shown
|
||||
|
||||
>>> todo.sh -p list flowers out
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
--
|
||||
TODO: 1 of 4 tasks shown
|
||||
|
||||
>>> todo.sh -a do 2
|
||||
2 x 2009-02-13 notice the sunflowers
|
||||
TODO: 2 marked as done.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 smell the coffee +wakeup
|
||||
3 stop
|
||||
2 x 2009-02-13 notice the sunflowers
|
||||
--
|
||||
TODO: 4 of 4 tasks shown
|
||||
|
||||
>>> todo.sh add "make the coffee +wakeup"
|
||||
5 make the coffee +wakeup
|
||||
TODO: 5 added.
|
||||
|
||||
>>> todo.sh -p list coffee
|
||||
5 make the coffee +wakeup
|
||||
4 smell the coffee +wakeup
|
||||
--
|
||||
TODO: 2 of 5 tasks shown
|
||||
|
||||
>>> todo.sh add "visit http://example.com"
|
||||
6 visit http://example.com
|
||||
TODO: 6 added.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
5 make the coffee +wakeup
|
||||
4 smell the coffee +wakeup
|
||||
3 stop
|
||||
6 visit http://example.com
|
||||
2 x 2009-02-13 notice the sunflowers
|
||||
--
|
||||
TODO: 6 of 6 tasks shown
|
||||
|
||||
>>> todo.sh archive
|
||||
x 2009-02-13 notice the sunflowers
|
||||
TODO: $HOME/todo.txt archived.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 make the coffee +wakeup
|
||||
3 smell the coffee +wakeup
|
||||
2 stop
|
||||
5 visit http://example.com
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
|
||||
>>> todo.sh report
|
||||
TODO: $HOME/todo.txt archived.
|
||||
2009-02-13T04:40:00 5 1
|
||||
TODO: Report file updated.
|
||||
|
||||
>>> todo.sh append g a
|
||||
usage: todo.sh append ITEM# "TEXT TO APPEND"
|
||||
=== 1
|
||||
|
||||
>>> todo.sh append 2 and think
|
||||
2 stop and think
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 make the coffee +wakeup
|
||||
3 smell the coffee +wakeup
|
||||
2 stop and think
|
||||
5 visit http://example.com
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
|
||||
>>> todo.sh append 10 "hej!"
|
||||
TODO: No task 10.
|
||||
=== 1
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 make the coffee +wakeup
|
||||
3 smell the coffee +wakeup
|
||||
2 stop and think
|
||||
5 visit http://example.com
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
|
||||
>>> todo.sh do 10
|
||||
TODO: No task 10.
|
||||
=== 1
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 make the coffee +wakeup
|
||||
3 smell the coffee +wakeup
|
||||
2 stop and think
|
||||
5 visit http://example.com
|
||||
--
|
||||
TODO: 5 of 5 tasks shown
|
||||
|
||||
>>> todo.sh add "the coffee +wakeup"
|
||||
6 the coffee +wakeup
|
||||
TODO: 6 added.
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 make the coffee +wakeup
|
||||
3 smell the coffee +wakeup
|
||||
2 stop and think
|
||||
6 the coffee +wakeup
|
||||
5 visit http://example.com
|
||||
--
|
||||
TODO: 6 of 6 tasks shown
|
||||
|
||||
>>> todo.sh prepend 6 "make"
|
||||
6 make the coffee +wakeup
|
||||
|
||||
>>> todo.sh -p list
|
||||
1 (B) smell the uppercase Roses +flowers @outside
|
||||
4 make the coffee +wakeup
|
||||
6 make the coffee +wakeup
|
||||
3 smell the coffee +wakeup
|
||||
2 stop and think
|
||||
5 visit http://example.com
|
||||
--
|
||||
TODO: 6 of 6 tasks shown
|
||||
|
||||
>>> todo.sh remdup
|
||||
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||
Try 'todo.sh -h' for more information.
|
||||
=== 1
|
||||
EOF
|
||||
|
||||
test_done
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
@@ -12,8 +12,10 @@ done,*)
|
||||
*' --tee '*|*' --va'*)
|
||||
mkdir -p test-results
|
||||
BASE=test-results/$(basename "$0" .sh)
|
||||
(TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
|
||||
echo $? > $BASE.exit) | tee $BASE.out
|
||||
(
|
||||
TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
|
||||
echo $? > $BASE.exit
|
||||
) | tee $BASE.out
|
||||
test "$(cat $BASE.exit)" = 0
|
||||
exit
|
||||
;;
|
||||
@@ -37,7 +39,9 @@ VISUAL=:
|
||||
unset CDPATH
|
||||
|
||||
# Protect ourselves from using predefined TODOTXT_CFG_FILE
|
||||
unset TODOTXT_CFG_FILE
|
||||
unset TODOTXT_CFG_FILE $(set|sed '/^TODOTXT_/!d;s/=.*//')
|
||||
# To prevent any damage if someone has still those exported somehow in his env:
|
||||
unset TODO_FILE DONE_FILE REPORT_FILE TMP_FILE
|
||||
|
||||
# Each test should start with something like this, after copyright notices:
|
||||
#
|
||||
@@ -168,25 +172,25 @@ 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 "$@" | sed -e 's/^/ /'
|
||||
echo "$@"
|
||||
test "$immediate" = "" || { trap - EXIT; exit 1; }
|
||||
}
|
||||
|
||||
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: $@"
|
||||
}
|
||||
|
||||
@@ -195,13 +199,14 @@ test_debug () {
|
||||
}
|
||||
|
||||
test_run_ () {
|
||||
eval >&3 2>&4 "$1"
|
||||
eval > output 2>&1 "$1"
|
||||
eval_ret="$?"
|
||||
cat >&3 output
|
||||
return 0
|
||||
}
|
||||
|
||||
test_skip () {
|
||||
test_count=$(($test_count+1))
|
||||
test_count=$((test_count + 1))
|
||||
to_skip=
|
||||
for skp in $SKIP_TESTS
|
||||
do
|
||||
@@ -256,6 +261,43 @@ test_expect_success () {
|
||||
echo >&3 ""
|
||||
}
|
||||
|
||||
test_expect_output () {
|
||||
test "$#" = 2 ||
|
||||
error "bug in the test script: not 2 parameters to test-expect-output"
|
||||
test_expect_code_and_output 0 "$@"
|
||||
}
|
||||
|
||||
test_expect_code_and_output () {
|
||||
test "$#" = 3 ||
|
||||
error "bug in the test script: not 3 parameters to test-expect-code-and-output"
|
||||
if ! test_skip "$@"
|
||||
then
|
||||
if [ "$1" = 0 ]; then
|
||||
say >&3 "expecting success and output: $3"
|
||||
else
|
||||
say >&3 "expecting exit code $1 and output: $3"
|
||||
fi
|
||||
test_run_ "$3"
|
||||
if [ "$?" = 0 -a "$eval_ret" = "$1" ]
|
||||
then
|
||||
cmp_output=$(test_cmp expect output)
|
||||
if [ "$?" = 0 ]
|
||||
then
|
||||
test_ok_ "$2"
|
||||
else
|
||||
test_failure_ "$2" "$3" "
|
||||
$cmp_output"
|
||||
fi
|
||||
else
|
||||
cmp_output=$(test_cmp expect output)
|
||||
test_failure_ "$2" "$3" "
|
||||
expected exit code $1, actual ${eval_ret}${cmp_output:+
|
||||
}${cmp_output}"
|
||||
fi
|
||||
fi
|
||||
echo >&3 ""
|
||||
}
|
||||
|
||||
test_expect_code () {
|
||||
test "$#" = 3 ||
|
||||
error "bug in the test script: not 3 parameters to test-expect-code"
|
||||
@@ -267,7 +309,8 @@ test_expect_code () {
|
||||
then
|
||||
test_ok_ "$2"
|
||||
else
|
||||
test_failure_ "$@"
|
||||
test_failure_ "$2" "$3" "
|
||||
expected exit code $1, actual ${eval_ret}"
|
||||
fi
|
||||
fi
|
||||
echo >&3 ""
|
||||
@@ -321,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
|
||||
@@ -371,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
|
||||
@@ -385,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
|
||||
@@ -393,7 +436,7 @@ test_done () {
|
||||
0)
|
||||
say_color pass "passed all $msg"
|
||||
|
||||
# Clean up this test.
|
||||
# Clean up this test.
|
||||
test -d "$remove_trash" &&
|
||||
cd "$(dirname "$remove_trash")" &&
|
||||
rm -rf "$(basename "$remove_trash")"
|
||||
@@ -407,9 +450,12 @@ test_done () {
|
||||
esac
|
||||
}
|
||||
|
||||
# Make sure we are testing the latest version.
|
||||
# Use -P to resolve symlinks in our working directory so that the pwd
|
||||
# in subprocesses equals our $PWD (for pathname comparisons).
|
||||
cd -P .
|
||||
|
||||
# Record our location for reference.
|
||||
TEST_DIRECTORY=$(pwd)
|
||||
PATH=$TEST_DIRECTORY/..:$PATH
|
||||
|
||||
# Test repository
|
||||
test="trash directory.$(basename "$0" .sh)"
|
||||
@@ -425,18 +471,220 @@ 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
|
||||
# Initialize the configuration file. Carefully quoted.
|
||||
sed -e 's|TODO_DIR=.*$|TODO_DIR="'"$TEST_DIRECTORY/$test"'"|' "$TEST_DIRECTORY/../todo.cfg" > todo.cfg
|
||||
|
||||
# Install latest todo.sh
|
||||
mkdir bin
|
||||
ln -s "$TEST_DIRECTORY/../todo.sh" bin/todo.sh
|
||||
|
||||
# Initialize a hack date script
|
||||
TODO_TEST_REAL_DATE=$(which date)
|
||||
TODO_TEST_TIME=1234500000
|
||||
export PATH TODO_TEST_REAL_DATE TODO_TEST_TIME
|
||||
|
||||
# Trying to detect the version of "date" on current system
|
||||
DATE_STYLE=unknown
|
||||
# on GNU systems (versions may vary):
|
||||
#date --version
|
||||
#date (GNU coreutils) 6.10
|
||||
#...
|
||||
if date --version 2>&1 | grep -q "GNU"; then
|
||||
DATE_STYLE=GNU
|
||||
# on Mac OS X 10.5:
|
||||
#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 "-jnR\?u"; then
|
||||
DATE_STYLE=Mac10.5
|
||||
# on Mac OS X 10.4:
|
||||
#date --version
|
||||
#date: illegal option -- -
|
||||
#usage: date [-nu] [-r seconds] [+format]
|
||||
# date [[[[[cc]yy]mm]dd]hh]mm[.ss]
|
||||
elif date --version 2>&1 | grep -q -e "-nu"; then
|
||||
DATE_STYLE=Mac10.4
|
||||
fi
|
||||
|
||||
case $DATE_STYLE in
|
||||
GNU)
|
||||
cat > bin/date <<-EOF
|
||||
#!/bin/sh
|
||||
exec "$TODO_TEST_REAL_DATE" -d @\$TODO_TEST_TIME \$@
|
||||
EOF
|
||||
chmod 755 bin/date
|
||||
;;
|
||||
Mac10.5)
|
||||
cat > bin/date <<-EOF
|
||||
#!/bin/sh
|
||||
exec "$TODO_TEST_REAL_DATE" -j -f %s \$TODO_TEST_TIME \$@
|
||||
EOF
|
||||
chmod 755 bin/date
|
||||
;;
|
||||
Mac10.4)
|
||||
cat > bin/date <<-EOF
|
||||
#!/bin/sh
|
||||
exec "$TODO_TEST_REAL_DATE" -r \$TODO_TEST_TIME \$@
|
||||
EOF
|
||||
chmod 755 bin/date
|
||||
;;
|
||||
*)
|
||||
echo "WARNING: Current date executable not recognized"
|
||||
echo "So today date will be used, expect false negative tests..."
|
||||
;;
|
||||
esac
|
||||
|
||||
# Ensure a correct PATH for testing.
|
||||
PATH=$owd/$root/bin:$PATH
|
||||
export PATH
|
||||
|
||||
cd "$owd"
|
||||
}
|
||||
|
||||
# Usage: test_tick [increment]
|
||||
test_tick () {
|
||||
TODO_TEST_TIME=$((TODO_TEST_TIME + ${1:-86400}))
|
||||
}
|
||||
|
||||
# Generate and run a series of tests based on a transcript.
|
||||
# Usage: test_todo_session "description" <<'EOF'
|
||||
# >>> command
|
||||
# output1
|
||||
# output2
|
||||
#
|
||||
# >>> command
|
||||
# === exit status
|
||||
# output3 with empty line (must be escaped here)
|
||||
# \
|
||||
# output5
|
||||
# EOF
|
||||
test_todo_session () {
|
||||
test "$#" = 1 ||
|
||||
error "bug in the test script: extra args to test_todo_session"
|
||||
subnum=1
|
||||
cmd=""
|
||||
status=0
|
||||
> expect
|
||||
while IFS= read -r line
|
||||
do
|
||||
case $line in
|
||||
">>> "*)
|
||||
test -z "$cmd" || error "bug in the test script: missing blank line separator in test_todo_session"
|
||||
cmd=${line#>>> }
|
||||
;;
|
||||
"=== "*)
|
||||
status=${line#=== }
|
||||
;;
|
||||
"")
|
||||
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))
|
||||
cmd=""
|
||||
status=0
|
||||
> expect
|
||||
fi
|
||||
;;
|
||||
\\)
|
||||
echo "" >> expect
|
||||
;;
|
||||
*)
|
||||
echo "$line" >> expect
|
||||
;;
|
||||
esac
|
||||
done
|
||||
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
|
||||
fi
|
||||
}
|
||||
|
||||
test_shell () {
|
||||
trap - EXIT
|
||||
export PS1='$(ret_val=$?; [ "$ret_val" != "0" ] && echo -e "=== $ret_val\n\n>>> "||echo "\n>>> ")'
|
||||
cat <<EOF
|
||||
Do your tests session here and
|
||||
don't forget to replace the hardcoded path with \$HOME in the transcript:
|
||||
$HOME/todo.txt => \$HOME/todo.txt
|
||||
EOF
|
||||
bash --noprofile --norc
|
||||
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"
|
||||
# Use -P to resolve symlinks in our working directory so that the cwd
|
||||
# Use -P to resolve symlinks in our working directory so that the pwd
|
||||
# in subprocesses equals our $PWD (for pathname comparisons).
|
||||
cd -P "$test" || exit 1
|
||||
|
||||
@@ -445,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%%-*}
|
||||
|
||||
6
tests/testshell.sh
Executable file
6
tests/testshell.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
test_description='Providing an interactive shell in the proper environment'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_shell
|
||||
65
todo.cfg
65
todo.cfg
@@ -1,14 +1,13 @@
|
||||
# === 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="C:/Documents and Settings/gina/My Documents"
|
||||
export TODO_DIR=${HOME:-$USERPROFILE}
|
||||
|
||||
# Your todo/done/report.txt locations
|
||||
export TODO_FILE="$TODO_DIR/todo.txt"
|
||||
export DONE_FILE="$TODO_DIR/done.txt"
|
||||
export REPORT_FILE="$TODO_DIR/report.txt"
|
||||
export TMP_FILE="$TODO_DIR/todo.tmp"
|
||||
|
||||
# You can customize your actions directory location
|
||||
#export TODO_ACTIONS_DIR="$HOME/.todo.actions.d"
|
||||
@@ -17,8 +16,13 @@ export TMP_FILE="$TODO_DIR/todo.tmp"
|
||||
|
||||
# === COLOR MAP ===
|
||||
|
||||
## If you have re-mapped your color codes, you may need to
|
||||
## Text coloring and formatting is done by inserting ANSI escape codes.
|
||||
## If you have re-mapped your color codes, or use the todo.txt
|
||||
## output in another output system (like Conky), you may need to
|
||||
## over-ride by uncommenting and editing these defaults.
|
||||
## If you change any of these here, you also need to uncomment
|
||||
## the defaults in the COLORS section below. Otherwise, todo.txt
|
||||
## will still use the defaults!
|
||||
|
||||
# export BLACK='\\033[0;30m'
|
||||
# export RED='\\033[0;31m'
|
||||
@@ -38,18 +42,61 @@ export TMP_FILE="$TODO_DIR/todo.tmp"
|
||||
# export WHITE='\\033[1;37m'
|
||||
# export DEFAULT='\\033[0m'
|
||||
|
||||
# === PRIORITY COLORS ===
|
||||
# === COLORS ===
|
||||
|
||||
## Priorities can be any upper-case letter.
|
||||
## Colors are supported for the first three.
|
||||
## Uncomment and edit to override these defaults.
|
||||
|
||||
## Reference the constants from the color map above,
|
||||
## or use $NONE to disable highlighting.
|
||||
#
|
||||
# Priorities can be any upper-case letter.
|
||||
# A,B,C are highlighted; you can add coloring for more.
|
||||
#
|
||||
# export PRI_A=$YELLOW # color for A priority
|
||||
# export PRI_B=$GREEN # color for B priority
|
||||
# export PRI_C=$LIGHT_BLUE # color for C priority
|
||||
# export PRI_X=$WHITE # color for rest of them
|
||||
# export PRI_D=... # define your own
|
||||
# export PRI_X=$WHITE # color unless explicitly defined
|
||||
|
||||
# There is highlighting for tasks that have been done,
|
||||
# but haven't been archived yet.
|
||||
#
|
||||
# export COLOR_DONE=$LIGHT_GREY
|
||||
|
||||
# There is highlighting for projects, contexts, dates, and item numbers.
|
||||
#
|
||||
# export COLOR_PROJECT=$RED
|
||||
# export COLOR_CONTEXT=$RED
|
||||
# export COLOR_DATE=$BLUE
|
||||
# export COLOR_NUMBER=$LIGHT_GREY
|
||||
|
||||
# There is highlighting for metadata key:value pairs e.g.
|
||||
# DUE:2006-08-01 or note:MYNOTE
|
||||
#
|
||||
# export COLOR_META=$CYAN
|
||||
|
||||
# ... and for date extensions (due:yyyy-mm-dd, t:yyyy-mm-dd and again:X)
|
||||
#
|
||||
# export COLOR_DATEEXT=$LIGHT_BLUE
|
||||
|
||||
# === BEHAVIOR ===
|
||||
|
||||
## 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
|
||||
# inserted, but before colorization, and before hiding of
|
||||
# priority, context, and project.
|
||||
#
|
||||
# export TODOTXT_SORT_COMMAND='env LC_COLLATE=C sort -f -k2'
|
||||
|
||||
# TODOTXT_FINAL_FILTER will filter list output after colorization,
|
||||
# priority hiding, context hiding, and project hiding. That is,
|
||||
# just before the list output is displayed.
|
||||
#
|
||||
# export TODOTXT_FINAL_FILTER='cat'
|
||||
|
||||
114
todo_completion
Executable file
114
todo_completion
Executable file
@@ -0,0 +1,114 @@
|
||||
# bash completion for todo.txt-cli
|
||||
|
||||
# Check for bash
|
||||
[ -z "$BASH_VERSION" ] && return
|
||||
|
||||
_todo()
|
||||
{
|
||||
local cur prev opts
|
||||
COMPREPLY=()
|
||||
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
|
||||
local -r OPTS="-@ -@@ -+ -++ -d -f -h -p -P -PP -a -n -t -v -vv -V -x"
|
||||
local -r COMMANDS="\
|
||||
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"
|
||||
local -r MOVE_COMMAND_PATTERN='move|mv'
|
||||
|
||||
local _todo_sh=${_todo_sh:-${COMP_WORDS[0]}}
|
||||
local completions
|
||||
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${_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
|
||||
case "$prev" in
|
||||
command)
|
||||
completions=$COMMANDS;;
|
||||
help)
|
||||
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null)";;
|
||||
-*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null) $OPTS";;
|
||||
*) 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
|
||||
|
||||
COMPREPLY=( $( compgen -W "$completions" -- $cur ))
|
||||
return 0
|
||||
}
|
||||
complete -F _todo todo.sh
|
||||
|
||||
# If you define an alias (e.g. "t") to todo.sh, you need to explicitly enable
|
||||
# completion for it, too:
|
||||
#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!
|
||||
|
||||
# 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='todo.sh -d "$HOME/todo-tweaked.cfg"'
|
||||
# _todo "$@"
|
||||
#}
|
||||
#complete -F _todo_tweak todo.sh
|
||||
Reference in New Issue
Block a user