Fix/noeol (#295)
* Handle missing EOL in todo.txt This can happen easily with certain editors (such as Mousepad) that do not automatically add a newline character at the end of a file. In _addto(), ensure a trailing newline via sed (taken from https://unix.stackexchange.com/a/31955/18876). Fixes #294 * Tests: Add basic coverage of move * Handle missing EOL in todo.txt for move, too This can happen easily with certain editors (such as Mousepad) that do not automatically add a newline character at the end of a file. * Refactoring: Extract fixMissingEndOfLine() * FIX: Compatibility: sed \+ multi not supported on MacOS Use the POSIX \{1,\} instead. Co-authored-by: Ali Karbassi <ali@karbassi.com>
This commit is contained in:
@@ -110,4 +110,17 @@ TODO: 1 added.
|
|||||||
--
|
--
|
||||||
TODO: 1 of 1 tasks shown
|
TODO: 1 of 1 tasks shown
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
echo -n 'this is a first task without newline' > todo.txt
|
||||||
|
test_todo_session 'add to file without EOL' <<EOF
|
||||||
|
>>> todo.sh add "a second task"
|
||||||
|
2 a second task
|
||||||
|
TODO: 2 added.
|
||||||
|
|
||||||
|
>>> todo.sh list
|
||||||
|
2 a second task
|
||||||
|
1 this is a first task without newline
|
||||||
|
--
|
||||||
|
TODO: 2 of 2 tasks shown
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|||||||
74
tests/t1850-move.sh
Executable file
74
tests/t1850-move.sh
Executable file
@@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
test_description='basic move functionality
|
||||||
|
'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
cat > todo.txt <<EOF
|
||||||
|
(B) smell the uppercase Roses +flowers @outside
|
||||||
|
(A) notice the sunflowers
|
||||||
|
EOF
|
||||||
|
cat > done.txt <<EOF
|
||||||
|
x 2009-02-13 make the coffee +wakeup
|
||||||
|
x 2009-02-13 smell the coffee +wakeup
|
||||||
|
EOF
|
||||||
|
test_todo_session 'basic move with implicit source' <<EOF
|
||||||
|
>>> todo.sh -f move 1 done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
|
||||||
|
1 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
TODO: 1 moved from 'todo.txt' to 'done.txt'.
|
||||||
|
|
||||||
|
>>> todo.sh -p ls
|
||||||
|
2 (A) notice the sunflowers
|
||||||
|
--
|
||||||
|
TODO: 1 of 1 tasks shown
|
||||||
|
|
||||||
|
>>> todo.sh -p listfile done.txt
|
||||||
|
3 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
1 x 2009-02-13 make the coffee +wakeup
|
||||||
|
2 x 2009-02-13 smell the coffee +wakeup
|
||||||
|
--
|
||||||
|
DONE: 3 of 3 tasks shown
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_todo_session 'basic move with passed source' <<EOF
|
||||||
|
>>> todo.sh -f move 2 todo.txt done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
|
||||||
|
2 x 2009-02-13 smell the coffee +wakeup
|
||||||
|
TODO: 2 moved from 'done.txt' to 'todo.txt'.
|
||||||
|
|
||||||
|
>>> todo.sh -p ls
|
||||||
|
2 (A) notice the sunflowers
|
||||||
|
3 x 2009-02-13 smell the coffee +wakeup
|
||||||
|
--
|
||||||
|
TODO: 2 of 2 tasks shown
|
||||||
|
|
||||||
|
>>> todo.sh -p listfile done.txt
|
||||||
|
3 (B) smell the uppercase Roses +flowers @outside
|
||||||
|
1 x 2009-02-13 make the coffee +wakeup
|
||||||
|
--
|
||||||
|
DONE: 2 of 2 tasks shown
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo -n 'this is a first task without newline' > todo.txt
|
||||||
|
cat > done.txt <<EOF
|
||||||
|
x 2009-02-13 make the coffee +wakeup
|
||||||
|
x 2009-02-13 smell the coffee +wakeup
|
||||||
|
EOF
|
||||||
|
test_todo_session 'move to destination without EOL' <<EOF
|
||||||
|
>>> todo.sh -f move 2 todo.txt done.txt | sed "s#'[^']\{1,\}/\([^/']\{1,\}\)'#'\1'#g"
|
||||||
|
2 x 2009-02-13 smell the coffee +wakeup
|
||||||
|
TODO: 2 moved from 'done.txt' to 'todo.txt'.
|
||||||
|
|
||||||
|
>>> todo.sh -p ls
|
||||||
|
1 this is a first task without newline
|
||||||
|
2 x 2009-02-13 smell the coffee +wakeup
|
||||||
|
--
|
||||||
|
TODO: 2 of 2 tasks shown
|
||||||
|
|
||||||
|
>>> todo.sh -p listfile done.txt
|
||||||
|
1 x 2009-02-13 make the coffee +wakeup
|
||||||
|
--
|
||||||
|
DONE: 1 of 1 tasks shown
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_done
|
||||||
8
todo.sh
8
todo.sh
@@ -466,6 +466,12 @@ replaceOrPrepend()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fixMissingEndOfLine()
|
||||||
|
{
|
||||||
|
# Parameters: $1: todo file; empty means $TODO_FILE.
|
||||||
|
sed -i.bak -e '$a\' "${1:-$TODO_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
uppercasePriority()
|
uppercasePriority()
|
||||||
{
|
{
|
||||||
# Precondition: $input contains task text for which to uppercase priority.
|
# Precondition: $input contains task text for which to uppercase priority.
|
||||||
@@ -809,6 +815,7 @@ _addto() {
|
|||||||
input=$(echo -n "($TODOTXT_PRIORITY_ON_ADD) " ; echo "$input")
|
input=$(echo -n "($TODOTXT_PRIORITY_ON_ADD) " ; echo "$input")
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
fixMissingEndOfLine "$file"
|
||||||
echo "$input" >> "$file"
|
echo "$input" >> "$file"
|
||||||
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
|
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
|
||||||
TASKNUM=$(sed -n '$ =' "$file")
|
TASKNUM=$(sed -n '$ =' "$file")
|
||||||
@@ -1339,6 +1346,7 @@ case $action in
|
|||||||
# leave blank line behind (preserves line numbers)
|
# leave blank line behind (preserves line numbers)
|
||||||
sed -i.bak -e "${item}s/^.*//" "$src"
|
sed -i.bak -e "${item}s/^.*//" "$src"
|
||||||
fi
|
fi
|
||||||
|
fixMissingEndOfLine "$dest"
|
||||||
echo "$todo" >> "$dest"
|
echo "$todo" >> "$dest"
|
||||||
|
|
||||||
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
|
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user