Compare commits
147 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bf537934d7 | ||
|
|
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 | ||
|
|
4d3b7472ff | ||
|
|
680e93e737 | ||
|
|
477738828f | ||
|
|
b9f95633dc | ||
|
|
df1e2eb7cf | ||
|
|
a4e68f9c3f | ||
|
|
3028de42a8 | ||
|
|
8fceae171d | ||
|
|
9898e7df3f | ||
|
|
42e1a658d6 | ||
|
|
f1caecec4e | ||
|
|
078c69496f | ||
|
|
8567a90e4c | ||
|
|
55f45e8515 | ||
|
|
03ccc73703 | ||
|
|
a822560d44 | ||
|
|
d860c2c36e | ||
|
|
7f954d73ae | ||
|
|
8e864568a9 | ||
|
|
df4f9150cf | ||
|
|
5cc988102d | ||
|
|
3a0fd43270 | ||
|
|
1a6ff81e28 | ||
|
|
5491e458a2 | ||
|
|
5789f5b4c2 | ||
|
|
b17cb11ec6 | ||
|
|
0b3d9109de | ||
|
|
ad40ef0f18 | ||
|
|
31216fe365 | ||
|
|
7f5c8fb3e1 | ||
|
|
3e7b60abcd | ||
|
|
cc3e5f73aa | ||
|
|
52604ebf78 | ||
|
|
bbe153b9bb | ||
|
|
ec54a032cb | ||
|
|
758cdc5551 | ||
|
|
02dc030225 | ||
|
|
7b769b2eea | ||
|
|
39ee9ab045 | ||
|
|
1e5902d0e2 | ||
|
|
3df7497287 | ||
|
|
07bb979d43 | ||
|
|
7e04849a4f | ||
|
|
f8b2646b92 | ||
|
|
02980ae7ee | ||
|
|
12bbf8fe67 | ||
|
|
ab78607506 | ||
|
|
6be78ca5fa | ||
|
|
9ab77253db | ||
|
|
cf3c5312bf | ||
|
|
37a7bb0e8a | ||
|
|
ed8e8e24d9 | ||
|
|
d6f00ca42f | ||
|
|
a03a3bf66b | ||
|
|
448cecb91d | ||
|
|
ee59233c36 | ||
|
|
f55f5e8b5f | ||
|
|
d508ed9dee | ||
|
|
62f3313ff9 | ||
|
|
6bc374c5f2 | ||
|
|
87959a8aa8 | ||
|
|
3e9d40ebd7 | ||
|
|
6bc05000d9 | ||
|
|
717f052f13 | ||
|
|
4ee8c332ed | ||
|
|
88caf44e9e | ||
|
|
db66767170 | ||
|
|
f8f8e83c40 | ||
|
|
2648bb047c | ||
|
|
bbff2d13bb | ||
|
|
e4c7979888 | ||
|
|
47c7ba75b3 | ||
|
|
2bd2e9f7bd | ||
|
|
f37cedc7ca | ||
|
|
7b2c9f080a | ||
|
|
98646a575a | ||
|
|
e6649e6293 | ||
|
|
eb61752708 | ||
|
|
5683490c0e | ||
|
|
20e6892775 | ||
|
|
fd9b002ce1 | ||
|
|
7736e6b4fa | ||
|
|
586abe8282 | ||
|
|
25c6505007 | ||
|
|
9c6efe2ed7 | ||
|
|
7ecda8973b |
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
VERSION-FILE
|
||||||
|
tests/test-results
|
||||||
|
tests/trash\ directory.*
|
||||||
38
GEN-VERSION-FILE
Executable file
@@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Based on git's GIT-VERSION-GEN.
|
||||||
|
|
||||||
|
VF=VERSION-FILE
|
||||||
|
DEF_VER=v2.2
|
||||||
|
|
||||||
|
LF='
|
||||||
|
'
|
||||||
|
|
||||||
|
if test -d .git -o -f .git &&
|
||||||
|
VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
|
||||||
|
case "$VN" in
|
||||||
|
*$LF*) (exit 1) ;;
|
||||||
|
v[0-9]*)
|
||||||
|
git update-index -q --refresh
|
||||||
|
test -z "$(git diff-index --name-only HEAD --)" ||
|
||||||
|
VN="$VN-dirty" ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
VN=$(echo "$VN" | sed -e 's/-/./g');
|
||||||
|
else
|
||||||
|
VN="$DEF_VER"
|
||||||
|
fi
|
||||||
|
|
||||||
|
VN=$(expr "$VN" : v*'\(.*\)')
|
||||||
|
|
||||||
|
if test -r $VF
|
||||||
|
then
|
||||||
|
VC=$(sed -e 's/^VERSION=//' <$VF)
|
||||||
|
else
|
||||||
|
VC=unset
|
||||||
|
fi
|
||||||
|
test "$VN" = "$VC" || {
|
||||||
|
echo >&2 "VERSION=$VN"
|
||||||
|
echo "VERSION=$VN" >$VF
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
52
Makefile
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#
|
||||||
|
# Makefile for todo.txt
|
||||||
|
#
|
||||||
|
|
||||||
|
# Dynamically detect/generate version file as necessary
|
||||||
|
# This file will define a variable called VERSION.
|
||||||
|
.PHONY: .FORCE-VERSION-FILE
|
||||||
|
VERSION-FILE: .FORCE-VERSION-FILE
|
||||||
|
@./GEN-VERSION-FILE
|
||||||
|
-include VERSION-FILE
|
||||||
|
|
||||||
|
# Maybe this will include the version in it.
|
||||||
|
todo.sh: VERSION-FILE
|
||||||
|
|
||||||
|
# For packaging
|
||||||
|
DISTFILES := todo.cfg
|
||||||
|
|
||||||
|
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)/
|
||||||
|
gzip -f -9 $(DISTNAME).tar
|
||||||
|
zip -9r $(DISTNAME).zip $(DISTNAME)/
|
||||||
|
rm -r $(DISTNAME)
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -f $(DISTNAME).tar.gz $(DISTNAME).zip
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Testing
|
||||||
|
#
|
||||||
|
TESTS = $(wildcard tests/t[0-9][0-9][0-9][0-9]-*.sh)
|
||||||
|
#TEST_OPTIONS=--verbose
|
||||||
|
|
||||||
|
test-pre-clean:
|
||||||
|
rm -rf tests/test-results "tests/trash directory"*
|
||||||
|
|
||||||
|
aggregate-results: $(TESTS)
|
||||||
|
|
||||||
|
$(TESTS): test-pre-clean
|
||||||
|
-cd tests && sh $(notdir $@) $(TEST_OPTIONS)
|
||||||
|
|
||||||
|
test: aggregate-results
|
||||||
|
tests/aggregate-results.sh tests/test-results/t*-*
|
||||||
|
rm -rf tests/test-results
|
||||||
|
|
||||||
|
# Force tests to get run every time
|
||||||
|
.PHONY: test test-pre-clean aggregate-results $(TESTS)
|
||||||
26
README.textile
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
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://github.com/ginatrapani/todo.txt-cli/issues
|
||||||
686
css/bootstrap-responsive.css
vendored
@@ -1,686 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Bootstrap Responsive v2.0.2
|
|
||||||
*
|
|
||||||
* Copyright 2012 Twitter, Inc
|
|
||||||
* Licensed under the Apache License v2.0
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Designed and built with all the love in the world @twitter by @mdo and @fat.
|
|
||||||
*/
|
|
||||||
.clearfix {
|
|
||||||
*zoom: 1;
|
|
||||||
}
|
|
||||||
.clearfix:before,
|
|
||||||
.clearfix:after {
|
|
||||||
display: table;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
.clearfix:after {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
.hide-text {
|
|
||||||
overflow: hidden;
|
|
||||||
text-indent: 100%;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.input-block-level {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
min-height: 28px;
|
|
||||||
/* Make inputs at least the height of their button counterpart */
|
|
||||||
|
|
||||||
/* Makes inputs behave like true block-level elements */
|
|
||||||
|
|
||||||
-webkit-box-sizing: border-box;
|
|
||||||
-moz-box-sizing: border-box;
|
|
||||||
-ms-box-sizing: border-box;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.hidden {
|
|
||||||
display: none;
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
.visible-phone {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.visible-tablet {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.visible-desktop {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.hidden-phone {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.hidden-tablet {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.hidden-desktop {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
.visible-phone {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.hidden-phone {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.hidden-desktop {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.visible-desktop {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: 768px) and (max-width: 979px) {
|
|
||||||
.visible-tablet {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.hidden-tablet {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.hidden-desktop {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.visible-desktop {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (max-width: 480px) {
|
|
||||||
.nav-collapse {
|
|
||||||
-webkit-transform: translate3d(0, 0, 0);
|
|
||||||
}
|
|
||||||
.page-header h1 small {
|
|
||||||
display: block;
|
|
||||||
line-height: 18px;
|
|
||||||
}
|
|
||||||
input[type="checkbox"],
|
|
||||||
input[type="radio"] {
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
}
|
|
||||||
.form-horizontal .control-group > label {
|
|
||||||
float: none;
|
|
||||||
width: auto;
|
|
||||||
padding-top: 0;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
.form-horizontal .controls {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
.form-horizontal .control-list {
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
.form-horizontal .form-actions {
|
|
||||||
padding-left: 10px;
|
|
||||||
padding-right: 10px;
|
|
||||||
}
|
|
||||||
.modal {
|
|
||||||
position: absolute;
|
|
||||||
top: 10px;
|
|
||||||
left: 10px;
|
|
||||||
right: 10px;
|
|
||||||
width: auto;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.modal.fade.in {
|
|
||||||
top: auto;
|
|
||||||
}
|
|
||||||
.modal-header .close {
|
|
||||||
padding: 10px;
|
|
||||||
margin: -10px;
|
|
||||||
}
|
|
||||||
.carousel-caption {
|
|
||||||
position: static;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
body {
|
|
||||||
padding-left: 20px;
|
|
||||||
padding-right: 20px;
|
|
||||||
}
|
|
||||||
.navbar-fixed-top {
|
|
||||||
margin-left: -20px;
|
|
||||||
margin-right: -20px;
|
|
||||||
}
|
|
||||||
.container {
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
.row-fluid {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.row {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
.row > [class*="span"],
|
|
||||||
.row-fluid > [class*="span"] {
|
|
||||||
float: none;
|
|
||||||
display: block;
|
|
||||||
width: auto;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.thumbnails [class*="span"] {
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
input[class*="span"],
|
|
||||||
select[class*="span"],
|
|
||||||
textarea[class*="span"],
|
|
||||||
.uneditable-input {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
min-height: 28px;
|
|
||||||
/* Make inputs at least the height of their button counterpart */
|
|
||||||
|
|
||||||
/* Makes inputs behave like true block-level elements */
|
|
||||||
|
|
||||||
-webkit-box-sizing: border-box;
|
|
||||||
-moz-box-sizing: border-box;
|
|
||||||
-ms-box-sizing: border-box;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.input-prepend input[class*="span"],
|
|
||||||
.input-append input[class*="span"] {
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: 768px) and (max-width: 979px) {
|
|
||||||
.row {
|
|
||||||
margin-left: -20px;
|
|
||||||
*zoom: 1;
|
|
||||||
}
|
|
||||||
.row:before,
|
|
||||||
.row:after {
|
|
||||||
display: table;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
.row:after {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
[class*="span"] {
|
|
||||||
float: left;
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
.container,
|
|
||||||
.navbar-fixed-top .container,
|
|
||||||
.navbar-fixed-bottom .container {
|
|
||||||
width: 724px;
|
|
||||||
}
|
|
||||||
.span12 {
|
|
||||||
width: 724px;
|
|
||||||
}
|
|
||||||
.span11 {
|
|
||||||
width: 662px;
|
|
||||||
}
|
|
||||||
.span10 {
|
|
||||||
width: 600px;
|
|
||||||
}
|
|
||||||
.span9 {
|
|
||||||
width: 538px;
|
|
||||||
}
|
|
||||||
.span8 {
|
|
||||||
width: 476px;
|
|
||||||
}
|
|
||||||
.span7 {
|
|
||||||
width: 414px;
|
|
||||||
}
|
|
||||||
.span6 {
|
|
||||||
width: 352px;
|
|
||||||
}
|
|
||||||
.span5 {
|
|
||||||
width: 290px;
|
|
||||||
}
|
|
||||||
.span4 {
|
|
||||||
width: 228px;
|
|
||||||
}
|
|
||||||
.span3 {
|
|
||||||
width: 166px;
|
|
||||||
}
|
|
||||||
.span2 {
|
|
||||||
width: 104px;
|
|
||||||
}
|
|
||||||
.span1 {
|
|
||||||
width: 42px;
|
|
||||||
}
|
|
||||||
.offset12 {
|
|
||||||
margin-left: 764px;
|
|
||||||
}
|
|
||||||
.offset11 {
|
|
||||||
margin-left: 702px;
|
|
||||||
}
|
|
||||||
.offset10 {
|
|
||||||
margin-left: 640px;
|
|
||||||
}
|
|
||||||
.offset9 {
|
|
||||||
margin-left: 578px;
|
|
||||||
}
|
|
||||||
.offset8 {
|
|
||||||
margin-left: 516px;
|
|
||||||
}
|
|
||||||
.offset7 {
|
|
||||||
margin-left: 454px;
|
|
||||||
}
|
|
||||||
.offset6 {
|
|
||||||
margin-left: 392px;
|
|
||||||
}
|
|
||||||
.offset5 {
|
|
||||||
margin-left: 330px;
|
|
||||||
}
|
|
||||||
.offset4 {
|
|
||||||
margin-left: 268px;
|
|
||||||
}
|
|
||||||
.offset3 {
|
|
||||||
margin-left: 206px;
|
|
||||||
}
|
|
||||||
.offset2 {
|
|
||||||
margin-left: 144px;
|
|
||||||
}
|
|
||||||
.offset1 {
|
|
||||||
margin-left: 82px;
|
|
||||||
}
|
|
||||||
.row-fluid {
|
|
||||||
width: 100%;
|
|
||||||
*zoom: 1;
|
|
||||||
}
|
|
||||||
.row-fluid:before,
|
|
||||||
.row-fluid:after {
|
|
||||||
display: table;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
.row-fluid:after {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
.row-fluid > [class*="span"] {
|
|
||||||
float: left;
|
|
||||||
margin-left: 2.762430939%;
|
|
||||||
}
|
|
||||||
.row-fluid > [class*="span"]:first-child {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
.row-fluid > .span12 {
|
|
||||||
width: 99.999999993%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span11 {
|
|
||||||
width: 91.436464082%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span10 {
|
|
||||||
width: 82.87292817100001%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span9 {
|
|
||||||
width: 74.30939226%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span8 {
|
|
||||||
width: 65.74585634900001%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span7 {
|
|
||||||
width: 57.182320438000005%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span6 {
|
|
||||||
width: 48.618784527%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span5 {
|
|
||||||
width: 40.055248616%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span4 {
|
|
||||||
width: 31.491712705%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span3 {
|
|
||||||
width: 22.928176794%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span2 {
|
|
||||||
width: 14.364640883%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span1 {
|
|
||||||
width: 5.801104972%;
|
|
||||||
}
|
|
||||||
input,
|
|
||||||
textarea,
|
|
||||||
.uneditable-input {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
input.span12, textarea.span12, .uneditable-input.span12 {
|
|
||||||
width: 714px;
|
|
||||||
}
|
|
||||||
input.span11, textarea.span11, .uneditable-input.span11 {
|
|
||||||
width: 652px;
|
|
||||||
}
|
|
||||||
input.span10, textarea.span10, .uneditable-input.span10 {
|
|
||||||
width: 590px;
|
|
||||||
}
|
|
||||||
input.span9, textarea.span9, .uneditable-input.span9 {
|
|
||||||
width: 528px;
|
|
||||||
}
|
|
||||||
input.span8, textarea.span8, .uneditable-input.span8 {
|
|
||||||
width: 466px;
|
|
||||||
}
|
|
||||||
input.span7, textarea.span7, .uneditable-input.span7 {
|
|
||||||
width: 404px;
|
|
||||||
}
|
|
||||||
input.span6, textarea.span6, .uneditable-input.span6 {
|
|
||||||
width: 342px;
|
|
||||||
}
|
|
||||||
input.span5, textarea.span5, .uneditable-input.span5 {
|
|
||||||
width: 280px;
|
|
||||||
}
|
|
||||||
input.span4, textarea.span4, .uneditable-input.span4 {
|
|
||||||
width: 218px;
|
|
||||||
}
|
|
||||||
input.span3, textarea.span3, .uneditable-input.span3 {
|
|
||||||
width: 156px;
|
|
||||||
}
|
|
||||||
input.span2, textarea.span2, .uneditable-input.span2 {
|
|
||||||
width: 94px;
|
|
||||||
}
|
|
||||||
input.span1, textarea.span1, .uneditable-input.span1 {
|
|
||||||
width: 32px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (max-width: 979px) {
|
|
||||||
body {
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
.navbar-fixed-top {
|
|
||||||
position: static;
|
|
||||||
margin-bottom: 18px;
|
|
||||||
}
|
|
||||||
.navbar-fixed-top .navbar-inner {
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
.navbar .container {
|
|
||||||
width: auto;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.navbar .brand {
|
|
||||||
padding-left: 10px;
|
|
||||||
padding-right: 10px;
|
|
||||||
margin: 0 0 0 -5px;
|
|
||||||
}
|
|
||||||
.navbar .nav-collapse {
|
|
||||||
clear: left;
|
|
||||||
}
|
|
||||||
.navbar .nav {
|
|
||||||
float: none;
|
|
||||||
margin: 0 0 9px;
|
|
||||||
}
|
|
||||||
.navbar .nav > li {
|
|
||||||
float: none;
|
|
||||||
}
|
|
||||||
.navbar .nav > li > a {
|
|
||||||
margin-bottom: 2px;
|
|
||||||
}
|
|
||||||
.navbar .nav > .divider-vertical {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.navbar .nav .nav-header {
|
|
||||||
color: #999999;
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
.navbar .nav > li > a,
|
|
||||||
.navbar .dropdown-menu a {
|
|
||||||
padding: 6px 15px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #999999;
|
|
||||||
-webkit-border-radius: 3px;
|
|
||||||
-moz-border-radius: 3px;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
.navbar .dropdown-menu li + li a {
|
|
||||||
margin-bottom: 2px;
|
|
||||||
}
|
|
||||||
.navbar .nav > li > a:hover,
|
|
||||||
.navbar .dropdown-menu a:hover {
|
|
||||||
background-color: #222222;
|
|
||||||
}
|
|
||||||
.navbar .dropdown-menu {
|
|
||||||
position: static;
|
|
||||||
top: auto;
|
|
||||||
left: auto;
|
|
||||||
float: none;
|
|
||||||
display: block;
|
|
||||||
max-width: none;
|
|
||||||
margin: 0 15px;
|
|
||||||
padding: 0;
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
-webkit-border-radius: 0;
|
|
||||||
-moz-border-radius: 0;
|
|
||||||
border-radius: 0;
|
|
||||||
-webkit-box-shadow: none;
|
|
||||||
-moz-box-shadow: none;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
.navbar .dropdown-menu:before,
|
|
||||||
.navbar .dropdown-menu:after {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.navbar .dropdown-menu .divider {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.navbar-form,
|
|
||||||
.navbar-search {
|
|
||||||
float: none;
|
|
||||||
padding: 9px 15px;
|
|
||||||
margin: 9px 0;
|
|
||||||
border-top: 1px solid #222222;
|
|
||||||
border-bottom: 1px solid #222222;
|
|
||||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
|
|
||||||
-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
|
|
||||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
|
|
||||||
}
|
|
||||||
.navbar .nav.pull-right {
|
|
||||||
float: none;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
.navbar-static .navbar-inner {
|
|
||||||
padding-left: 10px;
|
|
||||||
padding-right: 10px;
|
|
||||||
}
|
|
||||||
.btn-navbar {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.nav-collapse {
|
|
||||||
overflow: hidden;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: 980px) {
|
|
||||||
.nav-collapse.collapse {
|
|
||||||
height: auto !important;
|
|
||||||
overflow: visible !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
.row {
|
|
||||||
margin-left: -30px;
|
|
||||||
*zoom: 1;
|
|
||||||
}
|
|
||||||
.row:before,
|
|
||||||
.row:after {
|
|
||||||
display: table;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
.row:after {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
[class*="span"] {
|
|
||||||
float: left;
|
|
||||||
margin-left: 30px;
|
|
||||||
}
|
|
||||||
.container,
|
|
||||||
.navbar-fixed-top .container,
|
|
||||||
.navbar-fixed-bottom .container {
|
|
||||||
width: 1170px;
|
|
||||||
}
|
|
||||||
.span12 {
|
|
||||||
width: 1170px;
|
|
||||||
}
|
|
||||||
.span11 {
|
|
||||||
width: 1070px;
|
|
||||||
}
|
|
||||||
.span10 {
|
|
||||||
width: 970px;
|
|
||||||
}
|
|
||||||
.span9 {
|
|
||||||
width: 870px;
|
|
||||||
}
|
|
||||||
.span8 {
|
|
||||||
width: 770px;
|
|
||||||
}
|
|
||||||
.span7 {
|
|
||||||
width: 670px;
|
|
||||||
}
|
|
||||||
.span6 {
|
|
||||||
width: 570px;
|
|
||||||
}
|
|
||||||
.span5 {
|
|
||||||
width: 470px;
|
|
||||||
}
|
|
||||||
.span4 {
|
|
||||||
width: 370px;
|
|
||||||
}
|
|
||||||
.span3 {
|
|
||||||
width: 270px;
|
|
||||||
}
|
|
||||||
.span2 {
|
|
||||||
width: 170px;
|
|
||||||
}
|
|
||||||
.span1 {
|
|
||||||
width: 70px;
|
|
||||||
}
|
|
||||||
.offset12 {
|
|
||||||
margin-left: 1230px;
|
|
||||||
}
|
|
||||||
.offset11 {
|
|
||||||
margin-left: 1130px;
|
|
||||||
}
|
|
||||||
.offset10 {
|
|
||||||
margin-left: 1030px;
|
|
||||||
}
|
|
||||||
.offset9 {
|
|
||||||
margin-left: 930px;
|
|
||||||
}
|
|
||||||
.offset8 {
|
|
||||||
margin-left: 830px;
|
|
||||||
}
|
|
||||||
.offset7 {
|
|
||||||
margin-left: 730px;
|
|
||||||
}
|
|
||||||
.offset6 {
|
|
||||||
margin-left: 630px;
|
|
||||||
}
|
|
||||||
.offset5 {
|
|
||||||
margin-left: 530px;
|
|
||||||
}
|
|
||||||
.offset4 {
|
|
||||||
margin-left: 430px;
|
|
||||||
}
|
|
||||||
.offset3 {
|
|
||||||
margin-left: 330px;
|
|
||||||
}
|
|
||||||
.offset2 {
|
|
||||||
margin-left: 230px;
|
|
||||||
}
|
|
||||||
.offset1 {
|
|
||||||
margin-left: 130px;
|
|
||||||
}
|
|
||||||
.row-fluid {
|
|
||||||
width: 100%;
|
|
||||||
*zoom: 1;
|
|
||||||
}
|
|
||||||
.row-fluid:before,
|
|
||||||
.row-fluid:after {
|
|
||||||
display: table;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
.row-fluid:after {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
.row-fluid > [class*="span"] {
|
|
||||||
float: left;
|
|
||||||
margin-left: 2.564102564%;
|
|
||||||
}
|
|
||||||
.row-fluid > [class*="span"]:first-child {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
.row-fluid > .span12 {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span11 {
|
|
||||||
width: 91.45299145300001%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span10 {
|
|
||||||
width: 82.905982906%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span9 {
|
|
||||||
width: 74.358974359%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span8 {
|
|
||||||
width: 65.81196581200001%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span7 {
|
|
||||||
width: 57.264957265%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span6 {
|
|
||||||
width: 48.717948718%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span5 {
|
|
||||||
width: 40.170940171000005%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span4 {
|
|
||||||
width: 31.623931624%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span3 {
|
|
||||||
width: 23.076923077%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span2 {
|
|
||||||
width: 14.529914530000001%;
|
|
||||||
}
|
|
||||||
.row-fluid > .span1 {
|
|
||||||
width: 5.982905983%;
|
|
||||||
}
|
|
||||||
input,
|
|
||||||
textarea,
|
|
||||||
.uneditable-input {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
input.span12, textarea.span12, .uneditable-input.span12 {
|
|
||||||
width: 1160px;
|
|
||||||
}
|
|
||||||
input.span11, textarea.span11, .uneditable-input.span11 {
|
|
||||||
width: 1060px;
|
|
||||||
}
|
|
||||||
input.span10, textarea.span10, .uneditable-input.span10 {
|
|
||||||
width: 960px;
|
|
||||||
}
|
|
||||||
input.span9, textarea.span9, .uneditable-input.span9 {
|
|
||||||
width: 860px;
|
|
||||||
}
|
|
||||||
input.span8, textarea.span8, .uneditable-input.span8 {
|
|
||||||
width: 760px;
|
|
||||||
}
|
|
||||||
input.span7, textarea.span7, .uneditable-input.span7 {
|
|
||||||
width: 660px;
|
|
||||||
}
|
|
||||||
input.span6, textarea.span6, .uneditable-input.span6 {
|
|
||||||
width: 560px;
|
|
||||||
}
|
|
||||||
input.span5, textarea.span5, .uneditable-input.span5 {
|
|
||||||
width: 460px;
|
|
||||||
}
|
|
||||||
input.span4, textarea.span4, .uneditable-input.span4 {
|
|
||||||
width: 360px;
|
|
||||||
}
|
|
||||||
input.span3, textarea.span3, .uneditable-input.span3 {
|
|
||||||
width: 260px;
|
|
||||||
}
|
|
||||||
input.span2, textarea.span2, .uneditable-input.span2 {
|
|
||||||
width: 160px;
|
|
||||||
}
|
|
||||||
input.span1, textarea.span1, .uneditable-input.span1 {
|
|
||||||
width: 60px;
|
|
||||||
}
|
|
||||||
.thumbnails {
|
|
||||||
margin-left: -30px;
|
|
||||||
}
|
|
||||||
.thumbnails > li {
|
|
||||||
margin-left: 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
584
css/bootstrap.min.css
vendored
126
css/style.css
@@ -1,126 +0,0 @@
|
|||||||
body {
|
|
||||||
padding-top:50px;
|
|
||||||
color:#777;
|
|
||||||
background:#666;
|
|
||||||
}
|
|
||||||
body, p, li, input, button, select, textarea {
|
|
||||||
font-family:;'Open Sans', sans-serif;
|
|
||||||
}
|
|
||||||
body, p, li {
|
|
||||||
font-size:14px;
|
|
||||||
line-height:20px;
|
|
||||||
}
|
|
||||||
h1, h2, h3 {letter-spacing: -1px;}
|
|
||||||
|
|
||||||
/* Links */
|
|
||||||
a {color:#18D;}
|
|
||||||
a:hover {color:#26B;}
|
|
||||||
|
|
||||||
/* Titles */
|
|
||||||
h1 {font-family:Courier;color: #196DB5;font-size:26px;font-weight:300;text-shadow: 0 1px -1px white;}
|
|
||||||
h1 a {color:white;}
|
|
||||||
h1 a:hover {color:white;text-decoration:none;}
|
|
||||||
h2 {color: #555;font-size:22px;font-weight:300;margin-bottom:10px;text-shadow: 0 1px -1px white;}
|
|
||||||
h3 {font-weight:normal;color:#444;margin-bottom: 10px;}
|
|
||||||
h4 {color: #444;margin-bottom: 2px;margin-top:10px;line-height:20px;}
|
|
||||||
h5 {color: #444;line-height:20px;}
|
|
||||||
h6 {line-height:20px; color:#AAA;}
|
|
||||||
.bold {font-weight:bold;}
|
|
||||||
.italic {font-style:italic;}
|
|
||||||
|
|
||||||
/* Hero unit */
|
|
||||||
.hero-unit {
|
|
||||||
background:#666;
|
|
||||||
border-bottom: 1px solid white;
|
|
||||||
-webkit-border-radius: 0;
|
|
||||||
-moz-border-radius:0;
|
|
||||||
border-radius: 0;
|
|
||||||
margin: 0;
|
|
||||||
margin-top:-50px;
|
|
||||||
padding:0;
|
|
||||||
}
|
|
||||||
.hero-unit .container {
|
|
||||||
padding: 40px 0 30px 0;
|
|
||||||
text-shadow:0 -1px 1px black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero-unit h1{color:#E9E9E9;font-size:40px;margin-top:12px;letter-spacing:-2px;text-shadow: 0 -1px -1px black;}
|
|
||||||
.hero-unit h2, .hero-unit h4 {color:#fff;line-height:24px;text-shadow: 0 -1px -1px black;}
|
|
||||||
.hero-unit h1 > img {vertical-align:top;}
|
|
||||||
.hero-unit ul.unstyled li {border-bottom:1px solid #000;border-top:1px solid #2B2B2B;padding:15px 0 15px 15px;}
|
|
||||||
.hero-unit ul.unstyled li:first-child {border-top:0;}
|
|
||||||
.hero-unit ul.unstyled, .hero-unit hr {border-bottom:1px solid #2B2B2B;}
|
|
||||||
.hero-unit .buttons {
|
|
||||||
margin: 10px -15px 0 -15px;
|
|
||||||
padding:20px 0;
|
|
||||||
}
|
|
||||||
.hero-unit hr {border-top:1px solid #000;}
|
|
||||||
.hero-unit .buttons a, .hero-unit iframe {vertical-align:middle;}
|
|
||||||
.hero-unit .divider-vertical {
|
|
||||||
height:20px;
|
|
||||||
width:1px;
|
|
||||||
display:inline-block;
|
|
||||||
background-color:black;
|
|
||||||
border-right:1px solid #333;
|
|
||||||
vertical-align:middle;
|
|
||||||
margin:0 6px;
|
|
||||||
}
|
|
||||||
.hero-unit .github-btn-large .gh-btn, .hero-unit .github-btn-large .gh-count {
|
|
||||||
padding: 2px 10px 2px 8px !important;
|
|
||||||
font-size: 15px !important;
|
|
||||||
}
|
|
||||||
.hero-unit .btn-large {
|
|
||||||
padding: 3px 10px 3px 6px;
|
|
||||||
line-height: 22px;
|
|
||||||
}
|
|
||||||
.hero-unit .stitched {
|
|
||||||
outline: 1px dashed #444;
|
|
||||||
outline-offset: -5px;
|
|
||||||
background: #2B2B2B;
|
|
||||||
border-radius: 4px 4px 4px 4px;
|
|
||||||
-webkit-border-radius: 4px;
|
|
||||||
-moz-border-radius:4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Section */
|
|
||||||
.section {
|
|
||||||
background: white;
|
|
||||||
margin: -20px -20px 35px -20px;
|
|
||||||
padding:19px;
|
|
||||||
border:1px solid #DDD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*Footer*/
|
|
||||||
.footer {
|
|
||||||
background: #151515;
|
|
||||||
padding: 20px 10px 10px 10px;
|
|
||||||
box-shadow: inset 0 15px 10px rgba(0,0,0,0.6);
|
|
||||||
-webkit-box-shadow: inset 0 15px 10px rgba(0,0,0,0.6);
|
|
||||||
-moz-box-shadow:inset 0 15px 10px rgba(0,0,0,0.6);
|
|
||||||
color:#999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a {
|
|
||||||
color:#eee;
|
|
||||||
font-weight:normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Footer bottom */
|
|
||||||
.footer.footer-btm {
|
|
||||||
background:#151515;
|
|
||||||
border-top: 1px solid #222;
|
|
||||||
color:#999;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Responsive */
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
height: auto;
|
|
||||||
border: 0;
|
|
||||||
-ms-interpolation-mode: bicubic;
|
|
||||||
}
|
|
||||||
|
|
||||||
.above-footer {
|
|
||||||
background:#eee;
|
|
||||||
max-width:100%;
|
|
||||||
}
|
|
||||||
BIN
favicon.ico
|
Before Width: | Height: | Size: 4.2 KiB |
BIN
favicon.png
|
Before Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 206 KiB |
261
index.html
@@ -1,261 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<title>Todo.txt: Future-proof task tracking in a file you control</title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
||||||
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/>
|
|
||||||
<link rel="stylesheet" type="text/css" href="css/bootstrap-responsive.css"/>
|
|
||||||
<link rel="stylesheet" type="text/css" href="css/style.css"/>
|
|
||||||
<link href="http://fonts.googleapis.com/css?family=Open+Sans:400,600,700" rel="stylesheet" type="text/css" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<meta name="description" content="Track your tasks and projects in a plain text file, todo.txt. A todo.txt is software and operating system agnostic; it's searchable, portable, lightweight and easily manipulated." />
|
|
||||||
<meta name="keywords" content="Todo.txt, To do list" />
|
|
||||||
<meta name="robots" content="all,follow" />
|
|
||||||
<meta name="author" content="Gina Trapani" />
|
|
||||||
<link rel="shortcut icon" href="favicon.png" />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body id="body">
|
|
||||||
<div class="above-footer">
|
|
||||||
<div class="hero-unit">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="span7">
|
|
||||||
<a href="" title="Todo.txt"><img src="images/todotxt_logo_2012.png" alt="Todo.txt" width="100" style="float:left;margin-right:10px"/></a>
|
|
||||||
<h1><a href="">Todo.txt</a></h1>
|
|
||||||
<h2>If you want to get it done, first write it down.</h2>
|
|
||||||
<br style="clear:both">
|
|
||||||
</div>
|
|
||||||
<span class="hidden-phone">
|
|
||||||
<div class="span3">
|
|
||||||
<a href="http://itunes.apple.com/us/app/todo.txt-touch/id491342186?ls=1&mt=8" title="Download on the App Store">
|
|
||||||
<img alt="Download on App Store" src="images/download-on-app-store.png" style="float:right"/>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="span2">
|
|
||||||
<a href="http://play.google.com/store/apps/details?id=com.todotxt.todotxttouch" title="Get it on Google Play">
|
|
||||||
<img alt="Android app on Google Play" src="https://play.google.com/intl/en_us/badges/images/apps/en-play-badge-border.png" width="203" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="container content">
|
|
||||||
<div class="section">
|
|
||||||
<div class="row">
|
|
||||||
<div class="span12">
|
|
||||||
<span class="hidden-phone"><img src="images/todotxt-apps_lrg.png" alt="Todo.txt apps" width="768" style="float:right;margin-bottom:5px"/></span>
|
|
||||||
<h3>If you have a file called todo.txt on your computer right now, you're in the right place.</h3>
|
|
||||||
<p>So many power users try dozens of complicated todo list software applications, only to go right back to their trusty todo.txt file.</p>
|
|
||||||
|
|
||||||
<p>But it's not easy to open todo.txt, make a change, and save it—especially on your touchscreen device and at the command line. Todo.txt apps solve that problem.</p>
|
|
||||||
|
|
||||||
<h3>Simplicity is todo.txt's core value.</h3>
|
|
||||||
|
|
||||||
<p>You're not going to find many checkboxes, drop-downs, reminders, or date pickers here.</p>
|
|
||||||
|
|
||||||
<p>Todo.txt apps are minimal, todo.txt-focused editors which help you manage your tasks with as few keystrokes and taps possible.</p></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="section">
|
|
||||||
<div class="row">
|
|
||||||
<div class="span4">
|
|
||||||
<h2>On Your Phone and Tablet</h2>
|
|
||||||
<span class="hidden-phone"><p><img src="images/mobileappsheader.png" alt="Todo.txt mobile apps" /></p></span>
|
|
||||||
<p>Your todo.txt file isn't useful if it's not always at your fingertips. The Todo.txt mobile apps make it easy to view and update your tasks on the go.</p>
|
|
||||||
<p>Currently connected to <a href="http://dropbox.com">Dropbox</a>, Todo.txt Touch helps you manage your todo.txt on your touchscreen mobile device and automatically syncs your changes to all your computers.</p>
|
|
||||||
<h4>iPhone, iPod touch, and iPad users:</h4>
|
|
||||||
<p>
|
|
||||||
<a href="http://itunes.apple.com/us/app/todo.txt-touch/id491342186?ls=1&mt=8" title="Download on the App Store">
|
|
||||||
<img alt="Download on App Store" src="images/download-on-app-store.png" />
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<h4>Android users:</h4>
|
|
||||||
<p>
|
|
||||||
<a href="http://play.google.com/store/apps/details?id=com.todotxt.todotxttouch" title="Get it on Google Play">
|
|
||||||
<img alt="Android app on Google Play" src="https://play.google.com/intl/en_us/badges/images/apps/en-play-badge.png" width="203" />
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p>Also available in <a href="http://www.amazon.com/o/ASIN/B004MNQTVU/ref=nosim/lifehackerboo-20">the Amazon Appstore</a>.
|
|
||||||
</div>
|
|
||||||
<div class="span4">
|
|
||||||
<h2>At the Command Line</h2>
|
|
||||||
<p>With a simple but powerful shell script called todo.sh, you can interact with todo.txt at the command line for quick and easy, Unix-y access.</p>
|
|
||||||
<p><span class="hidden-phone"><iframe src="http://player.vimeo.com/video/3263629?byline=0&portrait=0" width="100%" height="320" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe></span></p>
|
|
||||||
<p>The Todo.txt CLI supports archiving completed tasks to done.txt and priority/context tab autocompletion.</p><br>
|
|
||||||
<p><a href="http://github.com/ginatrapani/todo.txt-cli/releases" class="btn-large btn-success" title="Download Todo.txt CLI">Download Todo.txt CLI »</a></p><br>
|
|
||||||
<p>Find out more:</p>
|
|
||||||
<p><ul>
|
|
||||||
<li><a href="http://wiki.github.com/ginatrapani/todo.txt-cli">Documentation</a>—everything you need to know about how to use Todo.txt CLI</li>
|
|
||||||
<li><a href="http://groups.yahoo.com/group/todotxt/">Mailing List</a>—ask the Todo.txt community</li>
|
|
||||||
</ul>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="span4">
|
|
||||||
<h2>In Any Text Editor</h2>
|
|
||||||
<p>Countless productivity apps and sites store your tasks in their own proprietary database and file format. But you can work with your todo.txt file in every text editor ever made, regardless of operating system or vendor.</p>
|
|
||||||
<p>The todo.txt format is <a href="https://github.com/ginatrapani/todo.txt-cli/wiki/The-Todo.txt-Format">a simple set of rules</a> that make todo.txt both human and machine-readable. The format supports priorities, creation and completion dates, projects and contexts. That's all you need to be productive. <a href="todo.txt">See an example Todo.txt file</a>.</p><br>
|
|
||||||
<span class="hidden-tablet">
|
|
||||||
<h3>What Users Are Saying</h3>
|
|
||||||
<p>
|
|
||||||
<strong>The easiest to-do list I ever used.</strong> -<a href="https://play.google.com/store/apps/details?id=com.todotxt.todotxttouch&reviewId=bGc6QU9xcFRPR1UzN3RldEpIX05yTjhtQ0tyb3lEREd0SHhuY0RzaXVzU2FweVp2Z3JPQ2ZuNmNSMXltaWV2dHFCMk1HcUlRNDRJU0R1bTQ5dDJtMXBqMmow">Dennis</a>
|
|
||||||
<p>
|
|
||||||
<strong>Brilliant... the "cool" factor is off the charts.</strong> -<a href="https://play.google.com/store/apps/details?id=com.todotxt.todotxttouch&reviewId=bGc6QU9xcFRPSERJa1czRmcwaUtYT0lCa2RLZmlhWGlVZ1ppNGc1RWFzVERQT05paWZaRlBHMUZtRE0zQzJHVzhBRENiWEVHX3RrbGxMQ1ktcm1oSmFpazM0">John</a>
|
|
||||||
<p>
|
|
||||||
<strong>So simple, yet also very versatile and flexible. I love it!</strong> -<a href="https://play.google.com/store/apps/details?id=com.todotxt.todotxttouch&reviewId=bGc6QU9xcFRPR2p1QjdWRkZuUGdXN1hwYmNMTUJ5eGFoWDZPcTltemV5a1BkRWYwV3VSdGZ5WXhaWlA1WFNkajczS3dVa2dCRko1d2d1R1EwazdEZ0hXaGtn">mschooler93</a>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<strong>Extremely useful and well executed.</strong> -<a href="https://play.google.com/store/apps/details?id=com.todotxt.todotxttouch&reviewId=bGc6QU9xcFRPR1BpeV9OTXZsNE5wcXZKcWNMN1l1WWhROExia2dadkZNVjdqcGthSFhRQmZreEhVTEV3dENwRm1wSmQxc2dLT0FINUFHbWplem1EX01CLU13">nemof</a>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<strong>No frills, highly effective and convenient.</strong> -<a href="https://play.google.com/store/apps/details?id=com.todotxt.todotxttouch&reviewId=bGc6QU9xcFRPRUFjYkZRRG53RlBJYVNiYl83Vm5wbVZZOW5FQ01GQ2IyV2s5OFNCMDRwbFFac1NEUDJHeVVOSnFFWFpFVVJpaUVHZU1EXzR3elhwN2VtanJR">Will</a>
|
|
||||||
</p>
|
|
||||||
<br/><br/>
|
|
||||||
</span>
|
|
||||||
<h3>Developers</h3>
|
|
||||||
<p>Todo.txt CLI and Todo.txt Touch are proudly open source. Browse the source code for the <a href="https://github.com/ginatrapani/todo.txt-cli">CLI</a>, <a href="https://github.com/ginatrapani/todo.txt-touch-ios">iOS</a>, and <a href="https://github.com/ginatrapani/todo.txt-touch">Android</a>.</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="section">
|
|
||||||
<div class="row">
|
|
||||||
<div class="span12">
|
|
||||||
<h2>Community Apps: Todo.txt on <em>your</em> favorite device or platform.</h2>
|
|
||||||
<p>In addition to the official Todo.txt apps, community members have built more apps and add-ons that work with Todo.txt.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="span3">
|
|
||||||
<h3>Desktop</h3>
|
|
||||||
|
|
||||||
<h4><a href="http://benrhughes.com/todotxt.net/">Todotxt.net</a></h4>
|
|
||||||
<p>A minimalist, keyboard-driven Windows GUI for your todo.txt file, by <a href="http://benrhughes.com/">Ben Hughes</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://mjdescy.github.io/TodoTxtMac/">TodoTxtMac</a></h4>
|
|
||||||
<p>TodoTxtMac is a minimalist, keyboard-driven to-do manager for Mac OS X (10.8 Mountain Lion and higher), by <a href="https://github.com/mjdescy">mjdescy</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="http://nerdur.com/todour.html">Todour</a></h4>
|
|
||||||
<p>Todour is an application for handling todo.txt files on the Mac and Windows, by Sverrir Valgeirsson.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://launchpad.net/~ximilian/+archive/ppa">DoStuff</a></h4>
|
|
||||||
<p>"A todo.txt client for humans" on Ubuntu (<a href="http://2buntu.com/1197/review-dostuff-a-todotxt-client-for-humans/">screenshots and video clip</a>), by ximilian.</p>
|
|
||||||
|
|
||||||
<h4><a href="http://burnsoftware.wordpress.com/daytasks/">DayTasks</a></h4>
|
|
||||||
<p>A fast, simple, and efficient todo.txt-compatible task list for Ubuntu, by Zach Burnham.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/mNantern/QTodoTxt">QTodoTxt</a></h4>
|
|
||||||
<p>A fast, cross-platform todo.txt GUI written in Python, by Matthieu Nantern.</p>
|
|
||||||
|
|
||||||
<h4><a href="http://jdotxt.chschmid.com">jdotxt</a></h4>
|
|
||||||
<p>An open-source, Java-based client for Windows, Mac OS X and Linux, by Christian M. Schmid.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/onovy/otodo">otodo</a></h4>
|
|
||||||
<p>Simple but powerfull TUI for todo.txt by Ondrej Novy.</p>
|
|
||||||
</div>
|
|
||||||
<div class="span3">
|
|
||||||
<h3>Web</h3>
|
|
||||||
|
|
||||||
<h4><a href="http://todotxttdi.com">Todotxttdi.com</a></h4>
|
|
||||||
<p>HTML5 Dropbox app with text-driven user interface (<a href="https://github.com/DavidPratten/todotxttdi">source</a>), by <a href="http://davidpratten.com">David Pratten</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="http://todo.martinsgill.co.uk">TodoTxtJs</a></h4>
|
|
||||||
<p>Interactive HTML5 todo.txt app with optional Dropbox integration (<a href="https://github.com/MartinSGill/TodoTxtJs">source</a>), by Martin Gill.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/bicarbon8/todoTxtWebUi">todoTxtWebUi</a></h4>
|
|
||||||
<p>A web UI to use with a todo.txt file (<a href="http://monsoonstudios.com/Code/todoTxt/">demo</a>), by <a href="https://github.com/bicarbon8">Jason Holt</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/infews/bulldog">Bulldog</a></h4>
|
|
||||||
<p>HTML5 task manager, built on todo.txt, by <a href="https://github.com/infews">Davis W. Frank</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/trestletech/Todo.txt">Todo.txt++</a></h4>
|
|
||||||
<p>A sleek, hosted, mobile-friendly web app with Dropbox synchronization, filtering, and searching. You can use it <a href ="https://www.todotxtpp.com">here</a></p>
|
|
||||||
|
|
||||||
<h4><a href="https://chrome.google.com/webstore/detail/mndijfcodpjlhgjcpcbhncjakaboedbl">Todo.txt for Chrome</a></h4>
|
|
||||||
<p>Chrome extension with Dropbox integration, and features such as pending task count, saved filters, and more, by <a href="https://c306.net/">Aditya Bhaskar</a>.</p>
|
|
||||||
</div>
|
|
||||||
<div class="span3">
|
|
||||||
<h3>Plugins and Add-ons</h3>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/freitass/todo.txt-vim">Vim plugin for todo.txt</a></h4>
|
|
||||||
<p>by <a href="https://github.com/freitass">Leandro Freitas</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://ifttt.com/recipes/42299">#todo.txt IFTTT Recipe</a></h4>
|
|
||||||
<p>Add items to your todo.txt file in Dropbox from Google Chat, by Nick Barrett.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/ginatrapani/todo.txt-cli/wiki/Todo.sh-Add-on-Directory">Todo.sh Add-on Directory</a></h4>
|
|
||||||
<p>A collection of add-ons, custom actions, and filters that enhance the Todo.txt CLI script, authored by community members.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/dertuxmalwieder/SublimeTodoTxt">Sublime Text todo.txt syntax highlighting</a></h4>
|
|
||||||
<p>by <a href="https://github.com/dertuxmalwieder">Cthulhux</a></p>
|
|
||||||
|
|
||||||
<h4><a href="https://addons.mozilla.org/en-US/thunderbird/addon/todotxt-extension/">Todo.txt Thunderbird Extension</a></h4>
|
|
||||||
<p>by <a href="https://github.com/rkokkelk/todo.txt-ext">Roy Kokkelkoren</a></p>
|
|
||||||
</div>
|
|
||||||
<div class="span3">
|
|
||||||
<h3>Mobile</h3>
|
|
||||||
|
|
||||||
<h4><a href="http://www.windowsphone.com/en-US/apps/50b1ca07-7e23-4963-a0ba-1536e6913543">Todo.txt for Windows Phone 7</a></h4>
|
|
||||||
<p>Todo.txt for Windows Phone 7 is a task manager based on the todo.txt file format, by <a href="https://github.com/hartez">E.Z. Hart</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="http://monkeystew.org/apps/">Todo.txt Enyo</a></h4>
|
|
||||||
<p>A webOS application for managing your todo.txt file written using the EnyoJS framework, by <a href="https://github.com/thrrgilag">thrrgilag</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://play.google.com/store/apps/details?id=nl.mpcjanssen.todotxtholo">Simpletask</a></h4>
|
|
||||||
<p>Powerful todo.txt app for Android, by <a href="http://mpcjanssen.nl/">Mark Janssen</a>. Also available in a <a href="https://play.google.com/store/apps/details?id=nl.mpcjanssen.simpletask">cloudless</a> version.</p>
|
|
||||||
|
|
||||||
<h4><a href="https://play.google.com/store/apps/details?id=net.c306.ttsuper">Todo.txt for Android</a></h4>
|
|
||||||
<p>Todo.txt for Android - simple, efficient, integrated with Dropbox, includes home screen widgets. Supports 6.0 Marshmallow or higher, by <a href="https://c306.net">Aditya Bhaskar</a>.</p>
|
|
||||||
|
|
||||||
<h3>Developer Tools</h3>
|
|
||||||
|
|
||||||
<h4><a href="https://github.com/samwho/todo-txt-gem">Todo.txt Gem</a></h4>
|
|
||||||
<p>A RubyGem for parsing todo.txt files, by <a href="https://github.com/samwho">Sam Rose</a>.</p>
|
|
||||||
|
|
||||||
<h4><a href="http://search.cpan.org/~andrew/Text-Todo-v0.2.0/lib/Text/Todo.pm">Text::Todo</a></h4>
|
|
||||||
<p>Perl interface to todotxt files by Andrew Fresh.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="span4 offset8" align="right">
|
|
||||||
<a href="https://twitter.com/todotxt" class="twitter-follow-button" data-show-count="true" data-lang="en">Follow @todotxt</a><script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="footer">
|
|
||||||
<div class="fill">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<p>Unless otherwise noted, Todo.txt apps published herein are authored by <a href="http://ginatrapani.org/" title="Gina Trapani: The Official Site">Gina Trapani</a> in collaboration with <a href="https://github.com/ginatrapani/todo.txt-cli/contributors">Todo.txt</a> <a href="https://github.com/ginatrapani/todo.txt-touch-ios/contributors">community</a> <a href="https://github.com/ginatrapani/todo.txt-touch/contributors">members</a> and released under the <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License</a>.</p>
|
|
||||||
<p>Todo.txt's icon designed by <a href="http://twitter.com/eJohnR">John Rowley</a>.</p>
|
|
||||||
<p>The first version of the Todo.txt CLI script was originally <a href="http://lifehacker.com/software/top/geek-to-live--readerwritten-todotxt-manager-173018.php">published in 2006 on Lifehacker</a>.</p>
|
|
||||||
|
|
||||||
<p>All software comes as is with no warranty. Do back up your todo.txt before you read another word. Support is available on the <a href="http://groups.yahoo.com/group/todotxt/">Todo.txt community mailing list</a>.</p>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="footer footer-btm">
|
|
||||||
<div class="fill">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<p>Copyright © 2006-2016, <a href="http://ginatrapani.org/" title="Gina Trapani">Gina Trapani</a>.<a style="visibility:hidden;" href="https://plus.google.com/113612142759476883204?rel=author">Gina Trapani</a></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
|
|
||||||
</script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
_uacct = "UA-436966-1";
|
|
||||||
urchinTracker();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
2
tests/Makefile
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
test:
|
||||||
|
$(MAKE) -C .. test
|
||||||
258
tests/README
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
todo.sh tests
|
||||||
|
=============
|
||||||
|
|
||||||
|
This directory holds test scripts for todo.sh. The
|
||||||
|
first part of this short document describes how to run the tests
|
||||||
|
and read their output.
|
||||||
|
|
||||||
|
When fixing the tools or adding enhancements, you are strongly
|
||||||
|
encouraged to add tests in this directory to cover what you are
|
||||||
|
trying to fix or enhance. The later part of this short document
|
||||||
|
describes how your test scripts should be organized.
|
||||||
|
|
||||||
|
|
||||||
|
Running Tests
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The easiest way to run tests is to say "make test" from the top-level.
|
||||||
|
This runs all the tests.
|
||||||
|
|
||||||
|
rm -rf tests/test-results "tests/trash directory"*
|
||||||
|
cd tests && sh t0000-config.sh
|
||||||
|
* ok 1: no config file
|
||||||
|
* ok 2: config file (default location 1)
|
||||||
|
* ok 3: config file (default location 2)
|
||||||
|
* ok 4: config file (command line)
|
||||||
|
* ok 5: config file (env variable)
|
||||||
|
* passed all 5 test(s)
|
||||||
|
cd tests && sh t0001-null.sh
|
||||||
|
* ok 1: null ls
|
||||||
|
* passed all 1 test(s)
|
||||||
|
rm -rf tests/test-results
|
||||||
|
|
||||||
|
Or you can run each test individually from command line, like
|
||||||
|
this:
|
||||||
|
|
||||||
|
$ ./t0001-null.sh
|
||||||
|
* ok 1: null ls
|
||||||
|
* passed all 1 test(s)
|
||||||
|
|
||||||
|
You can pass --verbose (or -v), --debug (or -d), and --immediate
|
||||||
|
(or -i) command line argument to the test, or by setting GIT_TEST_OPTS
|
||||||
|
appropriately before running "make".
|
||||||
|
|
||||||
|
--verbose::
|
||||||
|
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.
|
||||||
|
|
||||||
|
--immediate::
|
||||||
|
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.
|
||||||
|
|
||||||
|
--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.
|
||||||
|
|
||||||
|
Skipping Tests
|
||||||
|
--------------
|
||||||
|
|
||||||
|
In some environments, certain tests have no way of succeeding
|
||||||
|
due to platform limitation, such as lack of 'unzip' program, or
|
||||||
|
filesystem that do not allow arbitrary sequence of non-NUL bytes
|
||||||
|
as pathnames.
|
||||||
|
|
||||||
|
You should be able to say something like
|
||||||
|
|
||||||
|
$ SKIP_TESTS=t0000.2 sh ./t0000-config.sh
|
||||||
|
|
||||||
|
and even:
|
||||||
|
|
||||||
|
$ SKIP_TESTS='t[0-4]??? t91?? t9200.8' make
|
||||||
|
|
||||||
|
to omit such tests. The value of the environment variable is a
|
||||||
|
SP separated list of patterns that tells which tests to skip,
|
||||||
|
and either can match the "t[0-9]{4}" part to skip the whole
|
||||||
|
test, or t[0-9]{4} followed by ".$number" to say which
|
||||||
|
particular test to skip.
|
||||||
|
|
||||||
|
Note that some tests in the existing test suite rely on previous
|
||||||
|
test item, so you cannot arbitrarily disable one and expect the
|
||||||
|
remainder of test to check what the test originally was intended
|
||||||
|
to check.
|
||||||
|
|
||||||
|
|
||||||
|
Naming Tests
|
||||||
|
------------
|
||||||
|
|
||||||
|
The test files are named as:
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Second digit tells the particular command we are testing.
|
||||||
|
|
||||||
|
Third digit (optionally) tells the particular switch or group of switches
|
||||||
|
we are testing.
|
||||||
|
|
||||||
|
If you create files under tests/ directory (i.e. here) that is not
|
||||||
|
the top-level test script, never name the file to match the above
|
||||||
|
pattern. The Makefile here considers all such files as the
|
||||||
|
top-level test script and tries to run all of them. A care is
|
||||||
|
especially needed if you are creating a common test library
|
||||||
|
file, similar to test-lib.sh, because such a library file may
|
||||||
|
not be suitable for standalone execution.
|
||||||
|
|
||||||
|
|
||||||
|
Writing Tests
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The test script is written as a shell script. It should start
|
||||||
|
with the standard "#!/bin/sh" with copyright notices, and an
|
||||||
|
assignment to variable 'test_description', like this:
|
||||||
|
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright (c) 2005 Junio C Hamano
|
||||||
|
#
|
||||||
|
|
||||||
|
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.'
|
||||||
|
|
||||||
|
|
||||||
|
Source 'test-lib.sh'
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
After assigning test_description, the test script should source
|
||||||
|
test-lib.sh like this:
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
This test harness library does the following things:
|
||||||
|
|
||||||
|
- If the script is invoked with command line argument --help
|
||||||
|
(or -h), it shows the test_description and exits.
|
||||||
|
|
||||||
|
- Creates an empty test directory with an empty todo file
|
||||||
|
database and chdir(2) into it. This directory is 't/trash directory'
|
||||||
|
if you must know, but I do not think you care.
|
||||||
|
|
||||||
|
- Defines standard test helper functions for your scripts to
|
||||||
|
use. These functions are designed to make all scripts behave
|
||||||
|
consistently when command line arguments --verbose (or -v),
|
||||||
|
--debug (or -d), and --immediate (or -i) is given.
|
||||||
|
|
||||||
|
|
||||||
|
End with test_done
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Your script will be a sequence of tests, using helper functions
|
||||||
|
from the test harness library. At the end of the script, call
|
||||||
|
'test_done'.
|
||||||
|
|
||||||
|
|
||||||
|
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_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
|
||||||
|
<script>. If it yields success, test is considered
|
||||||
|
successful. <message> should state what it is testing.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'git-write-tree should be able to write an empty tree.' \
|
||||||
|
'tree=$(git-write-tree)'
|
||||||
|
|
||||||
|
- test_expect_failure <message> <script>
|
||||||
|
|
||||||
|
This is NOT the opposite of test_expect_success, but is used
|
||||||
|
to mark a test that demonstrates a known breakage. Unlike
|
||||||
|
the usual test_expect_success tests, which say "ok" on
|
||||||
|
success and "FAIL" on failure, this will say "FIXED" on
|
||||||
|
success and "still broken" on failure. Failures from these
|
||||||
|
tests won't cause -i (immediate) to stop.
|
||||||
|
|
||||||
|
- test_debug <script>
|
||||||
|
|
||||||
|
This takes a single argument, <script>, and evaluates it only
|
||||||
|
when the test script is started with --debug command line
|
||||||
|
argument. This is primarily meant for use during the
|
||||||
|
development of a new test script.
|
||||||
|
|
||||||
|
- test_done
|
||||||
|
|
||||||
|
Your test script must have test_done at the end. Its purpose
|
||||||
|
is to summarize successes and failures in the test script and
|
||||||
|
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 occurences 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. It was specialized for todo.txt-cli
|
||||||
|
by Emil Sit and Philippe Teuwen.
|
||||||
34
tests/aggregate-results.sh
Executable file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
fixed=0
|
||||||
|
success=0
|
||||||
|
failed=0
|
||||||
|
broken=0
|
||||||
|
total=0
|
||||||
|
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
while read type value
|
||||||
|
do
|
||||||
|
case $type in
|
||||||
|
'')
|
||||||
|
continue ;;
|
||||||
|
fixed)
|
||||||
|
fixed=$(($fixed + $value)) ;;
|
||||||
|
success)
|
||||||
|
success=$(($success + $value)) ;;
|
||||||
|
failed)
|
||||||
|
failed=$(($failed + $value)) ;;
|
||||||
|
broken)
|
||||||
|
broken=$(($broken + $value)) ;;
|
||||||
|
total)
|
||||||
|
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
|
||||||
70
tests/t0000-config.sh
Executable file
@@ -0,0 +1,70 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='todo.sh configuration file location
|
||||||
|
|
||||||
|
This test just makes sure that todo.sh can find its
|
||||||
|
config files in the default locations and take arguments
|
||||||
|
to find it somewhere else.
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
# 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/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
|
||||||
|
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
|
||||||
|
Try 'todo.sh -h' for more information.
|
||||||
|
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"
|
||||||
|
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 &&
|
||||||
|
rm -f todo.cfg
|
||||||
|
'
|
||||||
|
|
||||||
|
rm -f used_config
|
||||||
|
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 (command line)' '
|
||||||
|
todo.sh -d test.cfg > output;
|
||||||
|
test_cmp expect output && test -f used_config
|
||||||
|
'
|
||||||
|
|
||||||
|
rm -f used_config
|
||||||
|
test_expect_success 'config file (env variable)' '
|
||||||
|
TODOTXT_CFG_FILE=test.cfg todo.sh > output;
|
||||||
|
test_cmp expect output && test -f used_config
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
||||||
101
tests/t0001-null.sh
Executable file
@@ -0,0 +1,101 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='todo.sh basic null functionality test.
|
||||||
|
|
||||||
|
This test just makes sure the basic commands work,
|
||||||
|
when there are no todos.
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# ls|list
|
||||||
|
#
|
||||||
|
cat > expect <<EOF
|
||||||
|
--
|
||||||
|
TODO: 0 of 0 tasks shown from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'null ls' '
|
||||||
|
todo.sh ls > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
test_expect_success 'null list' '
|
||||||
|
todo.sh list > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
test_expect_success 'null list filter' '
|
||||||
|
todo.sh list filter > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
#
|
||||||
|
# lsp|listpri
|
||||||
|
#
|
||||||
|
# Re-use expect from ls.
|
||||||
|
test_expect_success 'null lsp' '
|
||||||
|
todo.sh lsp > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
test_expect_success 'null listpri' '
|
||||||
|
todo.sh listpri > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
test_expect_success 'null listpri a' '
|
||||||
|
todo.sh listpri a > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
#
|
||||||
|
# lsa|listall
|
||||||
|
#
|
||||||
|
cat > expect <<EOF
|
||||||
|
--
|
||||||
|
TODO: 0 of 0 tasks shown from $HOME/todo.tmp
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'null lsa' '
|
||||||
|
todo.sh lsa > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
test_expect_success 'null list' '
|
||||||
|
todo.sh listall > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
test_expect_success 'null list filter' '
|
||||||
|
todo.sh listall filter > output && test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# lsc|listcon
|
||||||
|
#
|
||||||
|
test_expect_success 'null lsc' '
|
||||||
|
todo.sh lsc > output && ! test -s output
|
||||||
|
'
|
||||||
|
test_expect_success 'null listcon' '
|
||||||
|
todo.sh listcon > output && ! test -s output
|
||||||
|
'
|
||||||
|
|
||||||
|
#
|
||||||
|
# lsprj|listproj
|
||||||
|
#
|
||||||
|
test_expect_success 'null lsprj' '
|
||||||
|
todo.sh lsprj > output && ! test -s output
|
||||||
|
'
|
||||||
|
test_expect_success 'null listproj' '
|
||||||
|
todo.sh listproj > output && ! test -s output
|
||||||
|
'
|
||||||
|
|
||||||
|
#
|
||||||
|
# lf|listfile
|
||||||
|
#
|
||||||
|
cat > expect <<EOF
|
||||||
|
TODO: File does not exist.
|
||||||
|
EOF
|
||||||
|
# XXX really should give a better usage error message here.
|
||||||
|
test_expect_success 'null lf' '
|
||||||
|
todo.sh lf > output || test_cmp expect output
|
||||||
|
'
|
||||||
|
test_expect_success 'null listfile' '
|
||||||
|
todo.sh listfile > output || test_cmp expect output
|
||||||
|
'
|
||||||
|
cat > expect <<EOF
|
||||||
|
TODO: File foo.txt does not exist.
|
||||||
|
EOF
|
||||||
|
test_expect_success 'null listfile foo.txt' '
|
||||||
|
todo.sh listfile foo.txt > output || test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
||||||
72
tests/t1000-addlist.sh
Executable file
@@ -0,0 +1,72 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
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
|
||||||
|
TODO: 'notice the daisies' added on line 1.
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
1 notice the daisies
|
||||||
|
--
|
||||||
|
TODO: 1 of 1 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh add smell the roses
|
||||||
|
TODO: 'smell the roses' added on line 2.
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
1 notice the daisies
|
||||||
|
2 smell the roses
|
||||||
|
--
|
||||||
|
TODO: 2 of 2 tasks shown from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#
|
||||||
|
# Filter
|
||||||
|
#
|
||||||
|
test_todo_session 'basic list filtering' <<EOF
|
||||||
|
>>> todo.sh list daisies
|
||||||
|
1 notice the daisies
|
||||||
|
--
|
||||||
|
TODO: 1 of 2 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh list smell
|
||||||
|
2 smell the roses
|
||||||
|
--
|
||||||
|
TODO: 1 of 2 tasks shown from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'case-insensitive filtering' <<EOF
|
||||||
|
>>> todo.sh add smell the uppercase Roses
|
||||||
|
TODO: 'smell the uppercase Roses' added on line 3.
|
||||||
|
|
||||||
|
>>> todo.sh list roses
|
||||||
|
2 smell the roses
|
||||||
|
3 smell the uppercase Roses
|
||||||
|
--
|
||||||
|
TODO: 2 of 3 tasks shown from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'add with &' <<EOF
|
||||||
|
>>> todo.sh add "dig the garden & water the flowers"
|
||||||
|
TODO: 'dig the garden & water the flowers' added on line 4.
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
4 dig the garden & water the flowers
|
||||||
|
1 notice the daisies
|
||||||
|
2 smell the roses
|
||||||
|
3 smell the uppercase Roses
|
||||||
|
--
|
||||||
|
TODO: 4 of 4 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
69
tests/t1010-add-date.sh
Executable file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
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
|
||||||
|
TODO: '2009-02-13 notice the daisies' added on line 1.
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
1 2009-02-13 notice the daisies
|
||||||
|
--
|
||||||
|
TODO: 1 of 1 tasks shown from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_tick
|
||||||
|
|
||||||
|
test_todo_session 'cmd line second day' <<EOF
|
||||||
|
>>> todo.sh -t add smell the roses
|
||||||
|
TODO: '2009-02-14 smell the roses' added on line 2.
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
1 2009-02-13 notice the daisies
|
||||||
|
2 2009-02-14 smell the roses
|
||||||
|
--
|
||||||
|
TODO: 2 of 2 tasks shown from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_tick
|
||||||
|
|
||||||
|
test_todo_session 'cmd line third day' <<EOF
|
||||||
|
>>> todo.sh -t add mow the lawn
|
||||||
|
TODO: '2009-02-15 mow the lawn' added on line 3.
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
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
|
||||||
|
TODO: '2009-02-15 take out the trash' added on line 4.
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
88
tests/t1100-replace.sh
Executable file
@@ -0,0 +1,88 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
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
|
||||||
|
replaced with
|
||||||
|
1: smell the cows
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
1 smell the cows
|
||||||
|
--
|
||||||
|
TODO: 1 of 1 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh replace 1 smell the roses
|
||||||
|
1: smell the cows
|
||||||
|
replaced with
|
||||||
|
1: smell the roses
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
1 smell the roses
|
||||||
|
--
|
||||||
|
TODO: 1 of 1 tasks shown from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
smell the cows
|
||||||
|
grow some corn
|
||||||
|
thrash some hay
|
||||||
|
chase the chickens
|
||||||
|
EOF
|
||||||
|
test_todo_session 'replace in multi-item file' <<EOF
|
||||||
|
>>> todo.sh replace 1 smell the cheese
|
||||||
|
1: smell the cows
|
||||||
|
replaced with
|
||||||
|
1: smell the cheese
|
||||||
|
|
||||||
|
>>> todo.sh replace 3 jump on hay
|
||||||
|
3: thrash some hay
|
||||||
|
replaced with
|
||||||
|
3: jump on hay
|
||||||
|
|
||||||
|
>>> todo.sh replace 4 collect the eggs
|
||||||
|
4: chase the chickens
|
||||||
|
replaced with
|
||||||
|
4: collect the eggs
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'replace with priority' <<EOF
|
||||||
|
>>> todo.sh pri 4 a
|
||||||
|
4: (A) collect the eggs
|
||||||
|
TODO: 4 prioritized (A).
|
||||||
|
|
||||||
|
>>> todo.sh replace 4 "collect the bread"
|
||||||
|
4: (A) collect the eggs
|
||||||
|
replaced with
|
||||||
|
4: (A) collect the bread
|
||||||
|
EOF
|
||||||
|
test_todo_session 'replace with &' << EOF
|
||||||
|
>>> todo.sh replace 3 "thrash the hay & thresh the wheat"
|
||||||
|
3: jump on hay
|
||||||
|
replaced with
|
||||||
|
3: thrash the hay & thresh the wheat
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'replace error' << EOF
|
||||||
|
>>> todo.sh replace 10 "hej!"
|
||||||
|
=== 1
|
||||||
|
10: No such todo.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
89
tests/t1200-pri.sh
Executable file
@@ -0,0 +1,89 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
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
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh -p list
|
||||||
|
1 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
2 notice the sunflowers
|
||||||
|
3 stop
|
||||||
|
--
|
||||||
|
TODO: 3 of 3 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh pri 2 A
|
||||||
|
2: (A) notice the sunflowers
|
||||||
|
TODO: 2 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh pri 2 a
|
||||||
|
2: (A) notice the sunflowers
|
||||||
|
TODO: 2 prioritized (A).
|
||||||
|
|
||||||
|
>>> todo.sh -p listpri
|
||||||
|
2 (A) notice the sunflowers
|
||||||
|
1 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
--
|
||||||
|
TODO: 2 of 3 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh add "smell the coffee +wakeup"
|
||||||
|
TODO: 'smell the coffee +wakeup' added on line 4.
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
623
tests/t1300-ls.sh
Executable file
@@ -0,0 +1,623 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh -d "$TEST_TODO3_" -x ls
|
||||||
|
2 bar xxx
|
||||||
|
3 baz
|
||||||
|
1 foo
|
||||||
|
--
|
||||||
|
TODO: 3 of 3 tasks shown from $HOME/todo.txt
|
||||||
|
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 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 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 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 from $HOME/todo.txt
|
||||||
|
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 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 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 02 task, no priority
|
||||||
|
--
|
||||||
|
TODO: 10 of 20 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 02 task, no priority
|
||||||
|
--
|
||||||
|
TODO: 10 of 20 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 02 task, no priority
|
||||||
|
--
|
||||||
|
TODO: 10 of 20 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 02 task, no priority
|
||||||
|
--
|
||||||
|
TODO: 10 of 20 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 02 task, no priority
|
||||||
|
--
|
||||||
|
TODO: 10 of 20 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 02 task, no priority
|
||||||
|
--
|
||||||
|
TODO: 10 of 20 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 02 task, no priority
|
||||||
|
--
|
||||||
|
TODO: 10 of 20 tasks shown from $HOME/todo.txt
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
58
tests/t1310-listcon.sh
Executable file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
test_done
|
||||||
58
tests/t1320-listproj.sh
Executable file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
test_done
|
||||||
60
tests/t1400-prepend.sh
Executable file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='basic prepend functionality
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_todo_session 'prepend usage' <<EOF
|
||||||
|
>>> todo.sh prepend B B
|
||||||
|
usage: todo.sh prepend ITEM# "TEXT TO PREPEND"
|
||||||
|
=== 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
(B) smell the uppercase Roses +flowers @outside
|
||||||
|
notice the sunflowers
|
||||||
|
stop
|
||||||
|
EOF
|
||||||
|
test_todo_session 'basic prepend' <<EOF
|
||||||
|
>>> todo.sh list
|
||||||
|
[0;32m1 (B) smell the uppercase Roses +flowers @outside[0m
|
||||||
|
2 notice the sunflowers
|
||||||
|
3 stop
|
||||||
|
--
|
||||||
|
TODO: 3 of 3 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh -p list
|
||||||
|
1 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
2 notice the sunflowers
|
||||||
|
3 stop
|
||||||
|
--
|
||||||
|
TODO: 3 of 3 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'prepend with &' <<EOF
|
||||||
|
>>> todo.sh prepend 3 "no running & jumping now"
|
||||||
|
3: no running & jumping now stop
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
80
tests/t1500-do.sh
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='do functionality
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
#DATE=`date '+%Y-%m-%d'`
|
||||||
|
|
||||||
|
test_todo_session 'do usage' <<EOF
|
||||||
|
>>> todo.sh do B B
|
||||||
|
usage: todo.sh do ITEM#
|
||||||
|
=== 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
smell the uppercase Roses +flowers @outside
|
||||||
|
notice the sunflowers
|
||||||
|
stop
|
||||||
|
remove1
|
||||||
|
remove2
|
||||||
|
remove3
|
||||||
|
remove4
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'basic do' <<EOF
|
||||||
|
>>> todo.sh list
|
||||||
|
2 notice the sunflowers
|
||||||
|
4 remove1
|
||||||
|
5 remove2
|
||||||
|
6 remove3
|
||||||
|
7 remove4
|
||||||
|
1 smell the uppercase Roses +flowers @outside
|
||||||
|
3 stop
|
||||||
|
--
|
||||||
|
TODO: 7 of 7 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'fail multiple do attempts' <<EOF
|
||||||
|
>>> todo.sh -a do 3
|
||||||
|
3: x 2009-02-13 stop
|
||||||
|
TODO: 3 marked as done.
|
||||||
|
|
||||||
|
>>> todo.sh -a do 3
|
||||||
|
3 is already marked done
|
||||||
|
EOF
|
||||||
|
test_done
|
||||||
47
tests/t1600-append.sh
Executable file
@@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='basic append functionality
|
||||||
|
|
||||||
|
Ensure we can append items successfully.
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Set up the basic todo.txt
|
||||||
|
#
|
||||||
|
todo.sh add notice the daisies > /dev/null
|
||||||
|
|
||||||
|
test_todo_session 'append usage' <<EOF
|
||||||
|
>>> todo.sh append adf asdfa
|
||||||
|
=== 1
|
||||||
|
usage: todo.sh append ITEM# "TEXT TO APPEND"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'basic append' <<EOF
|
||||||
|
>>> todo.sh append 1 "smell the roses"
|
||||||
|
1: notice the daisies smell the roses
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
1 notice the daisies smell the roses
|
||||||
|
--
|
||||||
|
TODO: 1 of 1 tasks shown from $HOME/todo.txt
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
test_todo_session 'append error' << EOF
|
||||||
|
>>> todo.sh append 10 "hej!"
|
||||||
|
=== 1
|
||||||
|
10: No such todo.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
132
tests/t2000-multiline.sh
Executable file
@@ -0,0 +1,132 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='Multi-line functionality'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
## Replace test
|
||||||
|
# Create the expected file
|
||||||
|
echo "1: smell the cheese
|
||||||
|
replaced with
|
||||||
|
1: eat apples eat oranges drink milk">$HOME/expect.multi
|
||||||
|
|
||||||
|
test_expect_success 'multiline squash item replace' '
|
||||||
|
(
|
||||||
|
# Prepare single line todo file
|
||||||
|
cat /dev/null > $HOME/todo.txt
|
||||||
|
"$HOME/bin/todo.sh" add smell the cheese
|
||||||
|
|
||||||
|
# Run replace
|
||||||
|
"$HOME/bin/todo.sh" replace 1 "eat apples
|
||||||
|
eat oranges
|
||||||
|
drink milk" > $HOME/output.multi
|
||||||
|
|
||||||
|
# Test output against expected
|
||||||
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
## Add test
|
||||||
|
# Create the expected file
|
||||||
|
echo "TODO: 'eat apples eat oranges drink milk' added on line 2.">$HOME/expect.multi
|
||||||
|
|
||||||
|
test_expect_success 'multiline squash item add' '
|
||||||
|
(
|
||||||
|
# Prepare single line todo file
|
||||||
|
cat /dev/null > $HOME/todo.txt
|
||||||
|
"$HOME/bin/todo.sh" add smell the cheese
|
||||||
|
|
||||||
|
# Run add
|
||||||
|
"$HOME/bin/todo.sh" add "eat apples
|
||||||
|
eat oranges
|
||||||
|
drink milk" > $HOME/output.multi
|
||||||
|
|
||||||
|
# Test output against expected
|
||||||
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
## Append test
|
||||||
|
# Create the expected file
|
||||||
|
echo "1: smell the cheese eat apples eat oranges drink milk">$HOME/expect.multi
|
||||||
|
|
||||||
|
test_expect_success 'multiline squash item append' '
|
||||||
|
(
|
||||||
|
# Prepare single line todo file
|
||||||
|
cat /dev/null > $HOME/todo.txt
|
||||||
|
"$HOME/bin/todo.sh" add smell the cheese
|
||||||
|
|
||||||
|
# Run append
|
||||||
|
"$HOME/bin/todo.sh" append 1 "eat apples
|
||||||
|
eat oranges
|
||||||
|
drink milk" > $HOME/output.multi
|
||||||
|
|
||||||
|
# Test output against expected
|
||||||
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
## Prepend test
|
||||||
|
# Create the expected file
|
||||||
|
echo "1: eat apples eat oranges drink milk smell the cheese">$HOME/expect.multi
|
||||||
|
|
||||||
|
test_expect_success 'multiline squash item prepend' '
|
||||||
|
(
|
||||||
|
# Prepare single line todo file
|
||||||
|
cat /dev/null > $HOME/todo.txt
|
||||||
|
"$HOME/bin/todo.sh" add smell the cheese
|
||||||
|
|
||||||
|
# Run prepend
|
||||||
|
"$HOME/bin/todo.sh" prepend 1 "eat apples
|
||||||
|
eat oranges
|
||||||
|
drink milk" > $HOME/output.multi
|
||||||
|
|
||||||
|
# Test output against expected
|
||||||
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
## Multiple line addition
|
||||||
|
# Create the expected file
|
||||||
|
echo "TODO: 'eat apples' added on line 2." > $HOME/expect.multi
|
||||||
|
echo "TODO: 'eat oranges' added on line 3." >>$HOME/expect.multi
|
||||||
|
echo "TODO: 'drink milk' added on line 4." >> $HOME/expect.multi
|
||||||
|
|
||||||
|
test_expect_success 'actual multiline add' '
|
||||||
|
(
|
||||||
|
# Run addm
|
||||||
|
"$HOME/bin/todo.sh" addm "eat apples
|
||||||
|
eat oranges
|
||||||
|
drink milk" > $HOME/output.multi
|
||||||
|
|
||||||
|
# Test output against expected
|
||||||
|
diff "$HOME/output.multi" "$HOME/expect.multi"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
||||||
168
tests/t9999-testsuite_example.sh
Executable file
@@ -0,0 +1,168 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh -p list +flowers
|
||||||
|
1 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
--
|
||||||
|
TODO: 1 of 4 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh -p list flowers
|
||||||
|
2 (A) notice the sunflowers
|
||||||
|
1 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
--
|
||||||
|
TODO: 2 of 4 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh -p list flowers out
|
||||||
|
1 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
--
|
||||||
|
TODO: 1 of 4 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh add "make the coffee +wakeup"
|
||||||
|
TODO: 'make the coffee +wakeup' added on line 5.
|
||||||
|
|
||||||
|
>>> todo.sh -p list coffee
|
||||||
|
5 make the coffee +wakeup
|
||||||
|
4 smell the coffee +wakeup
|
||||||
|
--
|
||||||
|
TODO: 2 of 5 tasks shown from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh add "visit http://example.com"
|
||||||
|
TODO: 'visit http://example.com' added on line 6.
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh report
|
||||||
|
TODO: Report file updated.
|
||||||
|
2009-02-13-04:40:00 5 1
|
||||||
|
|
||||||
|
>>> todo.sh report
|
||||||
|
TODO: Report file updated.
|
||||||
|
2009-02-13-04:40:00 5 1
|
||||||
|
2009-02-13-04:40:00 5 1
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh append 10 "hej!"
|
||||||
|
10: No such todo.
|
||||||
|
=== 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh do 10
|
||||||
|
10: No such todo.
|
||||||
|
=== 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> todo.sh add "the coffee +wakeup"
|
||||||
|
TODO: 'the coffee +wakeup' added on line 6.
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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 from $HOME/todo.txt
|
||||||
|
|
||||||
|
>>> 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
|
||||||
609
tests/test-lib.sh
Normal file
@@ -0,0 +1,609 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright (c) 2005 Junio C Hamano
|
||||||
|
#
|
||||||
|
|
||||||
|
# if --tee was passed, write the output not only to the terminal, but
|
||||||
|
# additionally to the file test-results/$BASENAME.out, too.
|
||||||
|
case "$TEST_TEE_STARTED, $* " in
|
||||||
|
done,*)
|
||||||
|
# do not redirect again
|
||||||
|
;;
|
||||||
|
*' --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 "$(cat $BASE.exit)" = 0
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Keep the original TERM for say_color
|
||||||
|
ORIGINAL_TERM=$TERM
|
||||||
|
|
||||||
|
# For repeatability, reset the environment to known value.
|
||||||
|
LANG=C
|
||||||
|
LC_ALL=C
|
||||||
|
PAGER=cat
|
||||||
|
TZ=UTC
|
||||||
|
TERM=dumb
|
||||||
|
export LANG LC_ALL PAGER TERM TZ
|
||||||
|
EDITOR=:
|
||||||
|
VISUAL=:
|
||||||
|
|
||||||
|
# Protect ourselves from common misconfiguration to export
|
||||||
|
# CDPATH into the environment
|
||||||
|
unset CDPATH
|
||||||
|
|
||||||
|
# Protect ourselves from using predefined 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:
|
||||||
|
#
|
||||||
|
# test_description='Description of this test...
|
||||||
|
# This test checks if command xyzzy does the right thing...
|
||||||
|
# '
|
||||||
|
# . ./test-lib.sh
|
||||||
|
[ "x$ORIGINAL_TERM" != "xdumb" ] && (
|
||||||
|
TERM=$ORIGINAL_TERM &&
|
||||||
|
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
|
||||||
|
|
||||||
|
while test "$#" -ne 0
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
-d|--d|--de|--deb|--debu|--debug)
|
||||||
|
debug=t; shift ;;
|
||||||
|
-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
|
||||||
|
immediate=t; shift ;;
|
||||||
|
-l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
|
||||||
|
TODOTXT_TEST_LONG=t; export TODOTXT_TEST_LONG; shift ;;
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
help=t; shift ;;
|
||||||
|
-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
|
||||||
|
verbose=t; shift ;;
|
||||||
|
-q|--q|--qu|--qui|--quie|--quiet)
|
||||||
|
quiet=t; shift ;;
|
||||||
|
--no-color)
|
||||||
|
color=; shift ;;
|
||||||
|
--no-python)
|
||||||
|
# noop now...
|
||||||
|
shift ;;
|
||||||
|
--tee)
|
||||||
|
shift ;; # was handled already
|
||||||
|
*)
|
||||||
|
break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$color"; then
|
||||||
|
say_color () {
|
||||||
|
(
|
||||||
|
TERM=$ORIGINAL_TERM
|
||||||
|
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
|
||||||
|
|
||||||
|
error () {
|
||||||
|
say_color error "error: $*"
|
||||||
|
trap - EXIT
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
say () {
|
||||||
|
say_color info "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
test "${test_description}" != "" ||
|
||||||
|
error "Test script did not set test_description."
|
||||||
|
|
||||||
|
if test "$help" = "t"
|
||||||
|
then
|
||||||
|
echo "$test_description"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec 5>&1
|
||||||
|
if test "$verbose" = "t"
|
||||||
|
then
|
||||||
|
exec 4>&2 3>&1
|
||||||
|
else
|
||||||
|
exec 4>/dev/null 3>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
test_failure=0
|
||||||
|
test_count=0
|
||||||
|
test_fixed=0
|
||||||
|
test_broken=0
|
||||||
|
test_success=0
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo >&5 "FATAL: Unexpected exit with code $?"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
trap 'die' EXIT
|
||||||
|
|
||||||
|
# The semantics of the editor variables are that of invoking
|
||||||
|
# sh -c "$EDITOR \"$@\"" files ...
|
||||||
|
#
|
||||||
|
# If our trash directory contains shell metacharacters, they will be
|
||||||
|
# interpreted if we just set $EDITOR directly, so do a little dance with
|
||||||
|
# environment variables to work around this.
|
||||||
|
#
|
||||||
|
# In particular, quoting isn't enough, as the path may contain the same quote
|
||||||
|
# that we're using.
|
||||||
|
test_set_editor () {
|
||||||
|
FAKE_EDITOR="$1"
|
||||||
|
export FAKE_EDITOR
|
||||||
|
VISUAL='"$FAKE_EDITOR"'
|
||||||
|
export VISUAL
|
||||||
|
}
|
||||||
|
|
||||||
|
# You are not expected to call test_ok_ and test_failure_ directly, use
|
||||||
|
# the text_expect_* functions instead.
|
||||||
|
|
||||||
|
test_ok_ () {
|
||||||
|
test_success=$(($test_success + 1))
|
||||||
|
say_color "" " ok $test_count: $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_failure_ () {
|
||||||
|
test_failure=$(($test_failure + 1))
|
||||||
|
say_color error "FAIL $test_count: $1"
|
||||||
|
shift
|
||||||
|
echo "$@" | sed -e 's/^/ /'
|
||||||
|
test "$immediate" = "" || { trap - EXIT; exit 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
test_known_broken_ok_ () {
|
||||||
|
test_fixed=$(($test_fixed+1))
|
||||||
|
say_color "" " FIXED $test_count: $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_known_broken_failure_ () {
|
||||||
|
test_broken=$(($test_broken+1))
|
||||||
|
say_color skip " still broken $test_count: $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_debug () {
|
||||||
|
test "$debug" = "" || eval "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_run_ () {
|
||||||
|
eval >&3 2>&4 "$1"
|
||||||
|
eval_ret="$?"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
test_skip () {
|
||||||
|
test_count=$(($test_count+1))
|
||||||
|
to_skip=
|
||||||
|
for skp in $SKIP_TESTS
|
||||||
|
do
|
||||||
|
case $this_test.$test_count in
|
||||||
|
$skp)
|
||||||
|
to_skip=t
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
case "$to_skip" in
|
||||||
|
t)
|
||||||
|
say_color skip >&3 "skipping test: $@"
|
||||||
|
say_color skip "skip $test_count: $1"
|
||||||
|
: true
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
false
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_failure () {
|
||||||
|
test "$#" = 2 ||
|
||||||
|
error "bug in the test script: not 2 parameters to test-expect-failure"
|
||||||
|
if ! test_skip "$@"
|
||||||
|
then
|
||||||
|
say >&3 "checking known breakage: $2"
|
||||||
|
test_run_ "$2"
|
||||||
|
if [ "$?" = 0 -a "$eval_ret" = 0 ]
|
||||||
|
then
|
||||||
|
test_known_broken_ok_ "$1"
|
||||||
|
else
|
||||||
|
test_known_broken_failure_ "$1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo >&3 ""
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_success () {
|
||||||
|
test "$#" = 2 ||
|
||||||
|
error "bug in the test script: not 2 parameters to test-expect-success"
|
||||||
|
if ! test_skip "$@"
|
||||||
|
then
|
||||||
|
say >&3 "expecting success: $2"
|
||||||
|
test_run_ "$2"
|
||||||
|
if [ "$?" = 0 -a "$eval_ret" = 0 ]
|
||||||
|
then
|
||||||
|
test_ok_ "$1"
|
||||||
|
else
|
||||||
|
test_failure_ "$@"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo >&3 ""
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_code () {
|
||||||
|
test "$#" = 3 ||
|
||||||
|
error "bug in the test script: not 3 parameters to test-expect-code"
|
||||||
|
if ! test_skip "$@"
|
||||||
|
then
|
||||||
|
say >&3 "expecting exit code $1: $3"
|
||||||
|
test_run_ "$3"
|
||||||
|
if [ "$?" = 0 -a "$eval_ret" = "$1" ]
|
||||||
|
then
|
||||||
|
test_ok_ "$2"
|
||||||
|
else
|
||||||
|
test_failure_ "$@"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo >&3 ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# test_external runs external test scripts that provide continuous
|
||||||
|
# test output about their progress, and succeeds/fails on
|
||||||
|
# zero/non-zero exit code. It outputs the test output on stdout even
|
||||||
|
# in non-verbose mode, and announces the external script with "* run
|
||||||
|
# <n>: ..." before running it. When providing relative paths, keep in
|
||||||
|
# mind that all scripts run in "trash directory".
|
||||||
|
# Usage: test_external description command arguments...
|
||||||
|
# Example: test_external 'Perl API' perl ../path/to/test.pl
|
||||||
|
test_external () {
|
||||||
|
test "$#" -eq 3 ||
|
||||||
|
error >&5 "bug in the test script: not 3 parameters to test_external"
|
||||||
|
descr="$1"
|
||||||
|
shift
|
||||||
|
if ! test_skip "$descr" "$@"
|
||||||
|
then
|
||||||
|
# Announce the script to reduce confusion about the
|
||||||
|
# test output that follows.
|
||||||
|
say_color "" " run $test_count: $descr ($*)"
|
||||||
|
# Run command; redirect its stderr to &4 as in
|
||||||
|
# test_run_, but keep its stdout on our stdout even in
|
||||||
|
# non-verbose mode.
|
||||||
|
"$@" 2>&4
|
||||||
|
if [ "$?" = 0 ]
|
||||||
|
then
|
||||||
|
test_ok_ "$descr"
|
||||||
|
else
|
||||||
|
test_failure_ "$descr" "$@"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Like test_external, but in addition tests that the command generated
|
||||||
|
# no output on stderr.
|
||||||
|
test_external_without_stderr () {
|
||||||
|
# The temporary file has no (and must have no) security
|
||||||
|
# implications.
|
||||||
|
tmp="$TMPDIR"; if [ -z "$tmp" ]; then tmp=/tmp; fi
|
||||||
|
stderr="$tmp/todotxt-external-stderr.$$.tmp"
|
||||||
|
test_external "$@" 4> "$stderr"
|
||||||
|
[ -f "$stderr" ] || error "Internal error: $stderr disappeared."
|
||||||
|
descr="no stderr: $1"
|
||||||
|
shift
|
||||||
|
say >&3 "expecting no stderr from previous command"
|
||||||
|
if [ ! -s "$stderr" ]; then
|
||||||
|
rm "$stderr"
|
||||||
|
test_ok_ "$descr"
|
||||||
|
else
|
||||||
|
if [ "$verbose" = t ]; then
|
||||||
|
output=`echo; echo Stderr is:; cat "$stderr"`
|
||||||
|
else
|
||||||
|
output=
|
||||||
|
fi
|
||||||
|
# rm first in case test_failure exits.
|
||||||
|
rm "$stderr"
|
||||||
|
test_failure_ "$descr" "$@" "$output"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# This is not among top-level (test_expect_success | test_expect_failure)
|
||||||
|
# but is a prefix that can be used in the test script, like:
|
||||||
|
#
|
||||||
|
# test_expect_success 'complain and die' '
|
||||||
|
# do something &&
|
||||||
|
# do something else &&
|
||||||
|
# test_must_fail git checkout ../outerspace
|
||||||
|
# '
|
||||||
|
#
|
||||||
|
# Writing this as "! git checkout ../outerspace" is wrong, because
|
||||||
|
# the failure could be due to a segv. We want a controlled failure.
|
||||||
|
|
||||||
|
test_must_fail () {
|
||||||
|
"$@"
|
||||||
|
test $? -gt 0 -a $? -le 129 -o $? -gt 192
|
||||||
|
}
|
||||||
|
|
||||||
|
# test_cmp is a helper function to compare actual and expected output.
|
||||||
|
# You can use it like:
|
||||||
|
#
|
||||||
|
# test_expect_success 'foo works' '
|
||||||
|
# echo expected >expected &&
|
||||||
|
# foo >actual &&
|
||||||
|
# test_cmp expected actual
|
||||||
|
# '
|
||||||
|
#
|
||||||
|
# This could be written as either "cmp" or "diff -u", but:
|
||||||
|
# - cmp's output is not nearly as easy to read as diff -u
|
||||||
|
# - not all diff versions understand "-u"
|
||||||
|
|
||||||
|
test_cmp() {
|
||||||
|
diff -u "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_done () {
|
||||||
|
trap - EXIT
|
||||||
|
test_results_dir="$TEST_DIRECTORY/test-results"
|
||||||
|
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
|
||||||
|
|
||||||
|
if test "$test_fixed" != 0
|
||||||
|
then
|
||||||
|
say_color pass "fixed $test_fixed known breakage(s)"
|
||||||
|
fi
|
||||||
|
if test "$test_broken" != 0
|
||||||
|
then
|
||||||
|
say_color error "still have $test_broken known breakage(s)"
|
||||||
|
msg="remaining $(($test_count-$test_broken)) test(s)"
|
||||||
|
else
|
||||||
|
msg="$test_count test(s)"
|
||||||
|
fi
|
||||||
|
case "$test_failure" in
|
||||||
|
0)
|
||||||
|
say_color pass "passed all $msg"
|
||||||
|
|
||||||
|
# Clean up this test.
|
||||||
|
test -d "$remove_trash" &&
|
||||||
|
cd "$(dirname "$remove_trash")" &&
|
||||||
|
rm -rf "$(basename "$remove_trash")"
|
||||||
|
|
||||||
|
exit 0 ;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
say_color error "failed $test_failure among $msg"
|
||||||
|
exit 1 ;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
# Test repository
|
||||||
|
test="trash directory.$(basename "$0" .sh)"
|
||||||
|
test ! -z "$debug" || remove_trash="$TEST_DIRECTORY/$test"
|
||||||
|
rm -fr "$test" || {
|
||||||
|
trap - EXIT
|
||||||
|
echo >&5 "FATAL: Cannot prepare test area"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Most tests can use the created repository, but some may need to create more.
|
||||||
|
# Usage: test_init_todo <directory>
|
||||||
|
test_init_todo () {
|
||||||
|
test "$#" = 1 ||
|
||||||
|
error "bug in the test script: not 1 parameter to test_init_todo"
|
||||||
|
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
|
||||||
|
|
||||||
|
# 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 "-jnu"; 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
|
||||||
|
# output4
|
||||||
|
# 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 read 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 [ ! -z "$cmd" ]; then
|
||||||
|
if [ $status = 0 ]; then
|
||||||
|
test_expect_success "$1 $subnum" "$cmd > output && test_cmp expect output"
|
||||||
|
else
|
||||||
|
test_expect_success "$1 $subnum" "$cmd > output || test $? = $status && test_cmp expect output"
|
||||||
|
fi
|
||||||
|
|
||||||
|
subnum=$(($subnum + 1))
|
||||||
|
cmd=""
|
||||||
|
status=0
|
||||||
|
> expect
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo $line >> expect
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if [ ! -z "$cmd" ]; then
|
||||||
|
if [ $status = 0 ]; then
|
||||||
|
test_expect_success "$1 $subnum" "$cmd > output && test_cmp expect output"
|
||||||
|
else
|
||||||
|
test_expect_success "$1 $subnum" "$cmd > output || test $? = $status && test_cmp expect output"
|
||||||
|
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_init_todo "$test"
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Since todo.sh refers to the home directory often,
|
||||||
|
# make sure we don't accidentally grab the tester's config
|
||||||
|
# but use something specified by the framework.
|
||||||
|
HOME=$(pwd)
|
||||||
|
export HOME
|
||||||
|
|
||||||
|
this_test=${0##*/}
|
||||||
|
this_test=${this_test%%-*}
|
||||||
|
for skp in $SKIP_TESTS
|
||||||
|
do
|
||||||
|
to_skip=
|
||||||
|
for skp in $SKIP_TESTS
|
||||||
|
do
|
||||||
|
case "$this_test" in
|
||||||
|
$skp)
|
||||||
|
to_skip=t
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
case "$to_skip" in
|
||||||
|
t)
|
||||||
|
say_color skip >&3 "skipping test $this_test altogether"
|
||||||
|
say_color skip "skip all tests in $this_test"
|
||||||
|
test_done
|
||||||
|
esac
|
||||||
|
done
|
||||||
6
tests/testshell.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='Providing an interactive shell in the proper environment'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_shell
|
||||||
66
todo.cfg
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# === EDIT FILE LOCATIONS BELOW ===
|
||||||
|
|
||||||
|
# Your todo.txt directory
|
||||||
|
#export TODO_DIR="/Users/gina/Documents/todo"
|
||||||
|
export TODO_DIR="C:/Documents and Settings/gina/My Documents"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
|
# == EDIT FILE LOCATIONS ABOVE ===
|
||||||
|
|
||||||
|
# === COLOR MAP ===
|
||||||
|
|
||||||
|
## If you have re-mapped your color codes, you may need to
|
||||||
|
## over-ride by uncommenting and editing these defaults.
|
||||||
|
|
||||||
|
# export BLACK='\\033[0;30m'
|
||||||
|
# export RED='\\033[0;31m'
|
||||||
|
# export GREEN='\\033[0;32m'
|
||||||
|
# export BROWN='\\033[0;33m'
|
||||||
|
# export BLUE='\\033[0;34m'
|
||||||
|
# export PURPLE='\\033[0;35m'
|
||||||
|
# export CYAN='\\033[0;36m'
|
||||||
|
# export LIGHT_GREY='\\033[0;37m'
|
||||||
|
# export DARK_GREY='\\033[1;30m'
|
||||||
|
# export LIGHT_RED='\\033[1;31m'
|
||||||
|
# export LIGHT_GREEN='\\033[1;32m'
|
||||||
|
# export YELLOW='\\033[1;33m'
|
||||||
|
# export LIGHT_BLUE='\\033[1;34m'
|
||||||
|
# export LIGHT_PURPLE='\\033[1;35m'
|
||||||
|
# export LIGHT_CYAN='\\033[1;36m'
|
||||||
|
# export WHITE='\\033[1;37m'
|
||||||
|
# export DEFAULT='\\033[0m'
|
||||||
|
|
||||||
|
# === PRIORITY COLORS ===
|
||||||
|
|
||||||
|
## Priorities can be any upper-case letter.
|
||||||
|
## Colors are supported for the first three.
|
||||||
|
## Uncomment and edit to override these defaults.
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# === BEHAVIOR ===
|
||||||
|
|
||||||
|
## 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'
|
||||||
8
todo.txt
@@ -1,8 +0,0 @@
|
|||||||
(A) Call Mom @Phone +Family
|
|
||||||
(A) Schedule annual checkup +Health
|
|
||||||
(B) Outline chapter 5 +Novel @Computer
|
|
||||||
(C) Add cover sheets @Office +TPSReports
|
|
||||||
Plan backyard herb garden @Home
|
|
||||||
Pick up milk @GroceryStore
|
|
||||||
Research self-publishing services +Novel @Computer
|
|
||||||
x Download Todo.txt mobile app @Phone
|
|
||||||