When generating the distribution files, prepare todo.sh
by subbing in the current version so that users will
get a proper version number.
Tries to detect VERSION-FILE for running from
the development directory but this doesn't work well
when $PWD is not the top of the git repo.
Signed-off-by: Emil Sit <sit@emilsit.net>
Borrowing slightly from git.git, derive a VERSION-FILE
from the current state of user's git working directory.
The VERSION is derived relative to the latest git annotated
tag object (using git-describe) and includable either in
shell scripts or in Makefiles.
The basic 'make dist' target generates a .tar.gz and a .zip
file named by the detected version.
Also include a basic clean target and dummy test target.
Signed-off-by: Emil Sit <sit@emilsit.net>
If a file had blank lines or was totally empty, _list would
result in an in-correct count of total items (either "" or
the number of lines, instead of the number of items). This
commit splits the filtering into three phases: line numbering,
filtering (optional), and post-processing, and then does
counting separately, if desired.
Signed-off-by: Emil Sit <sit@emilsit.net>
Signed-off-by: Gina Trapani <ginatrapani@gmail.com>
Put the old help message under a "help" command. The
short help message just lists the available commands and
should fit on a single screen.
Signed-off-by: Gina Trapani <ginatrapani@gmail.com>
The rewrite of ls functionality may have allowed blank but numbered
lines to creep into the ls display. Search for such lines and
exclude them.
Signed-off-by: Emil Sit <sit@emilsit.net>
Signed-off-by: Gina Trapani <ginatrapani@gmail.com>
Commit f55f5e8b5f introduced a known regression on Windows that
prevented users from using configuration files starting with C:\. The
following logic fixes this:
+ ## If the file starts with a "/" use absolute path. Otherwise,
+ ## try to find it in either $TODO_DIR or using a relative path
+ if [ "${1:0:1}" == / ]
+ then
+ ## Absolute path
+ src="$FILE"
+ elif [ -f "$TODO_DIR/$FILE" ]
+ then
+ ## Path relative to todo.sh directory
+ src="$TODO_DIR/$1"
+ elif [ -f "$FILE" ]
+ then
+ ## Path relative to current working directory
+ src="$FILE"
+ else
+ echo "TODO: File $FILE does not exist."
+ exit 1
+ fi
New _list function takes a filename and a list of search expressions.
We no longer use exec to call ourselves recursively.
Implemented several suggestions by Jacobo de Vera:
> 1. [lines 539-551]: [...] replace the for loop with simply this:
> PADDING=${#LINES}
> 2. [line 558]: As the script now supports a 6 digit number of tasks,
> the first substitution should add 5 spaces instead of 2
> 3. [lines 606-613]: The first search item is processed before the for
> loop, and the loop does the same for the rest. Wouldn't making this
> more general make the code more readable?
The changes for suggestion #3 let me add a new feature: when VERBOSE is
enabled, the summary line prints more info -- and it prints it on every
run:
$ todo.sh ls "buy a"
34 Buy a portable gas can @errands +safe
--
TODO: 1 of 49 tasks shown from /home/harding/var/git/todo/todo.txt
Also, generalizing and centralizing the code added a small but
measurable speed increase.
No new known regressions were introduced.
Essentially,
ls)
shift
exec "$TODO_SH" listfile "$TODO_FILE" "$@"
;;
lsa)
shift
cat "$TODO_FILE" "$DONE_FILE" > "$TMP_FILE"
exec $TODO_SH listfile "$TMP_FILE" "$@"
;;
lsp)
shift ## was "listpri"
shift ## was priority
exec $TODO_SH listfile "$TODO_FILE" "$pri" "$@"
;;;
Also adds the following features:
1. Numbers are padded with up to five zeros (but only the minimum
necessary), letting you list up to 999,999 tasks with the same
formatting.
2. All ls-family commands hide context, priority, and project when
the user sets those hide options.
3. Quoted arguments are passed on to grep as whole arguments,
enabling the following:
$ todo.sh ls buy a | head -n2
34 Buy a portable gas can
22 Buy door
$ todo.sh ls "buy a"
34 Buy a portable gas can
4. listfile can take an absolute path. Any filename starting with a
"/" will be treated as an absolute path; any other filename will
be treated as relative to $TODO_DIR. Since a leading "/" would be
striped by the operating system anyway under the old code, this
is fully backward compatible.
Contains the following regressions:
1. The ls verbose line count messages are more generic.
2. There is no verbose line count line for lspri.
3. I don't think listfile's absolute path feature will work on
Windows. If it doesn't, either this patch needs to be thrown
away, listall needs to be rewritten, or (my preference) $TMP_FILE
needs to set as relative to $TODO_DIR.
New action, "command", forces todo.sh to use builtins and ignore any
.todo.actions.d scripts. For example, if there is an executable
.todo.actions.d/ls:
## Run .todo.actions.d/ls
todo.sh ls
## Run builtin todo.sh ls
todo.sh command ls
This mimicks bash's behaviour:
## Use the default echo
harding@ziggy:~$ echo 'foo\nbar'
foo\nbar
## Alias the echo command to "echo -e"
harding@ziggy:~$ alias echo='echo -e'
harding@ziggy:~$ echo 'foo\nbar'
foo
bar
## Force bash to call the default echo command
harding@ziggy:~$ command echo 'foo\nbar'
foo\nbar
And replace tabs by spaces.
To illustrate the interest of this new variable, here is an action
to replace the original add to allow a priority to be set when adding.
The action itself relies on the original add, therefore the need for
this new envvar.
action=$1
shift
[ "$action" = "usage" ] && {
echo " add pri PRIORITY \"THING I NEED TO DO +project @context\""
echo " add an item and prioritize it in one step"
echo ""
exit
}
. $TODOTXT_CFG_FILE
TODOTXT_UNDEF_CUSTOM_ACTIONS=1
PRIORITY=false
if [ x"$1" = x"pri" -o x"$1" = x"p" ] && [[ x"$2" =~ x[a-zA-Z] ]]; then
PRIORITY=$2
shift
shift
fi
if $TODO_SH add "$@" && [ $PRIORITY != false ]; then
# figure out the line of what we just added, and "do" it
line=`wc -l "$TODO_FILE" | cut -d' ' -f1`
$TODO_SH pri "$line" $PRIORITY
fi
This patch does 2 things:
- Allowing environment variables corresponding to options (e.g. VERBOSE for -v)
to be predefined in the user environment instead of having to always use
the corresponding option.
- Adding namespace TODOTXT_ to those envvars to avoid clashes in user environment
todo.action.d scripts can call recursively todo.sh and this patch preserves
the options/envvars through the calls.
As a bonus, now the user can export in advance one of those variables in
his/her environment and it would have the same effect as using the todo.sh
corresponding option.
export TODOTXT_AUTO_ARCHIVE=0 is same as option -a
export TODOTXT_CFG_FILE=CONFIG_FILE is same as option -d CONFIG_FILE
export TODOTXT_FORCE=1 is same as option -f
export TODOTXT_PRESERVE_LINE_NUMBERS=0 is same as option -n
export TODOTXT_PLAIN=1 is same as option -p
export TODOTXT_DATE_ON_ADD=1 is same as option -t
export TODOTXT_VERBOSE=1 is same as option -v
Signed-off-by: Gina Trapani <ginatrapani@gmail.com>