* ENH: Allow to customize what can be before / inside / after +project and @context
I noticed that todo.sh mistakenly picks up some random stuff as projects and contexts. The todo.txt specification is very lenient in what makes those (allowing any length of non-whitespace characters), but in practice, every user has its own idea of the set of used words. This change allows (expert) users to tweak the pattern (via TODOTXT_SIGIL_VALID_PATTERN), to be able to reduce the amount of "false positives" that listproj and listcon show.
Additionally, there's a (mainly unspecified) extension mechanism in the form of key:value, which often is used to implement custom "markers", like w:something to make a task blocked and waiting for "something". It would be nice to be able to refer to @contexts (and maybe also +projects), but the default syntax (which requires whitespace around those) doesn't allow it, and these context then don't show up in searches, which is unfortunate. The added TODOTXT_SIGIL_BEFORE_PATTERN and TODOTXT_SIGIL_AFTER_PATTERN allow to tweak the syntax to accommodate this.
The implementation just exchanges grep with a corresponding sed pipeline step, which shouldn't negatively affect the performance at all (as sed is one of the main commands used thoughout the script), but which allows for the additional matching flexibility.
* FIX: Compatibility: sed \? multi not supported on MacOS
Use the POSIX \{0,1\} instead.
* FIX: Compatibility: sed \| multi not supported on MacOS
Concatenate both alternatives as optional matches; this is only an approximation but satisfies the test case here. It would probably be better if the entire sed code used extended regular expression syntax (-E) instead of basic ones (-e), but that change would also affect all add-ons. As this is an optional customization feature, uses who really need this either also have to work around, or supply a GNU sed port on MacOS.
* FIX: Compatibility: sed \+ multi not supported on MacOS
Use the POSIX \{1,\} instead.
Co-authored-by: Ali Karbassi <ali@karbassi.com>
150 lines
3.2 KiB
Bash
Executable File
150 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
|
|
test_description='listproj functionality
|
|
|
|
This test checks basic project listing functionality
|
|
'
|
|
. ./test-lib.sh
|
|
|
|
cat > todo.txt <<EOF
|
|
item 1
|
|
item 2
|
|
item 3
|
|
EOF
|
|
test_expect_success 'listproj no projects' '
|
|
todo.sh listproj > output && ! test -s output
|
|
'
|
|
|
|
cat > todo.txt <<EOF
|
|
(A) +1 -- Some project 1 task, whitespace, one char
|
|
(A) +p2 -- Some project 2 task, whitespace, two char
|
|
+prj03 -- Some project 3 task, no whitespace
|
|
+prj04 -- Some project 4 task, no whitespace
|
|
+prj05+prj06 -- weird project
|
|
EOF
|
|
test_todo_session 'Single project per line' <<EOF
|
|
>>> todo.sh listproj
|
|
+1
|
|
+p2
|
|
+prj03
|
|
+prj04
|
|
+prj05+prj06
|
|
EOF
|
|
|
|
cat > todo.txt <<EOF
|
|
+prj01 -- Some project 1 task
|
|
+prj02 -- Some project 2 task
|
|
+prj02 +prj03 -- Multi-project task
|
|
EOF
|
|
test_todo_session 'Multi-project per line' <<EOF
|
|
>>> todo.sh listproj
|
|
+prj01
|
|
+prj02
|
|
+prj03
|
|
EOF
|
|
|
|
cat > todo.txt <<EOF
|
|
+prj01 -- Some project 1 task
|
|
+prj02 -- Some project 2 task
|
|
+prj02 ginatrapani+todo@gmail.com -- Some project 2 task
|
|
EOF
|
|
test_todo_session 'listproj embedded + test' <<EOF
|
|
>>> todo.sh listproj
|
|
+prj01
|
|
+prj02
|
|
EOF
|
|
|
|
cat > todo.txt <<EOF
|
|
(B) smell the uppercase Roses +roses @outside +shared
|
|
(C) notice the sunflowers +sunflowers @garden +shared +landscape
|
|
stop
|
|
EOF
|
|
test_todo_session 'basic listproj' <<EOF
|
|
>>> todo.sh listproj
|
|
+landscape
|
|
+roses
|
|
+shared
|
|
+sunflowers
|
|
EOF
|
|
|
|
test_todo_session 'listproj with context' <<EOF
|
|
>>> todo.sh listproj @garden
|
|
+landscape
|
|
+shared
|
|
+sunflowers
|
|
EOF
|
|
|
|
cat > todo.txt <<EOF
|
|
(B) give a +1 to this project
|
|
(C) notice the sunflowers +sunflowers [+gardening] [+landscape]
|
|
stop
|
|
EOF
|
|
test_todo_session 'listproj with default configuration' <<EOF
|
|
>>> todo.sh listproj
|
|
+1
|
|
+sunflowers
|
|
EOF
|
|
test_todo_session 'listproj limiting to alphabetic characters' <<EOF
|
|
>>> TODOTXT_SIGIL_VALID_PATTERN='[a-zA-Z]\{1,\}' todo.sh listproj
|
|
+sunflowers
|
|
EOF
|
|
test_todo_session 'listproj allowing brackets around projects' <<EOF
|
|
>>> TODOTXT_SIGIL_BEFORE_PATTERN='\[\{0,1\}' TODOTXT_SIGIL_AFTER_PATTERN='\]\{0,1\}' todo.sh listproj
|
|
+1
|
|
+gardening
|
|
+landscape
|
|
+sunflowers
|
|
EOF
|
|
|
|
cat > todo.txt <<EOF
|
|
(B) smell the uppercase Roses +roses @outside +shared
|
|
(C) notice the sunflowers +sunflowers @garden +shared +landscape
|
|
stop
|
|
EOF
|
|
TEST_TODO_CUSTOM=todo-custom.cfg
|
|
cat todo.cfg > "$TEST_TODO_CUSTOM"
|
|
cat >> "$TEST_TODO_CUSTOM" <<'EOF'
|
|
export DEFAULT='</color>'
|
|
export PRI_B='<color type=green>'
|
|
export PRI_C='<color type=blue>'
|
|
export TODOTXT_FINAL_FILTER='grep -i roses'
|
|
EOF
|
|
test_todo_session 'listproj with context special cases' <<EOF
|
|
>>> todo.sh -+ -d "$TEST_TODO_CUSTOM" listproj @garden
|
|
+landscape
|
|
+shared
|
|
+sunflowers
|
|
EOF
|
|
|
|
|
|
cat > todo.txt <<EOF
|
|
+prj01 -- Some project 1 task
|
|
EOF
|
|
cat > done.txt <<EOF
|
|
x 2012-02-21 +done01 -- Special project 1 done task
|
|
x 2012-02-21 +done02 -- Some project 2 done task
|
|
EOF
|
|
test_todo_session 'listproj from done tasks' <<'EOF'
|
|
>>> TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh listproj
|
|
+done01
|
|
+done02
|
|
EOF
|
|
test_todo_session 'listproj from done tasks with filtering' <<'EOF'
|
|
>>> TODOTXT_SOURCEVAR=\$DONE_FILE todo.sh listproj Special
|
|
+done01
|
|
EOF
|
|
test_todo_session 'listproj from combined open + done tasks' <<'EOF'
|
|
>>> TODOTXT_SOURCEVAR='("$TODO_FILE" "$DONE_FILE")' todo.sh listproj
|
|
+done01
|
|
+done02
|
|
+prj01
|
|
EOF
|
|
|
|
test_todo_session 'listproj with GREP_OPTIONS disruption' <<'EOF'
|
|
>>> GREP_OPTIONS=-n todo.sh listproj
|
|
+prj01
|
|
EOF
|
|
|
|
test_done
|