Replaced Grep Loop, Fixed Sed Bug, Some Small Changes

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.
This commit is contained in:
David A. Harding
2009-03-12 22:23:59 -04:00
parent f55f5e8b5f
commit ee59233c36

84
todo.sh
View File

@@ -516,15 +516,17 @@ case $action in
;; ;;
"listfile" | "lf" ) "listfile" | "lf" )
shift ## was "listfile", new $1 is filename
## If the file starts with a "/" use absolute path. Otherwise, make ## If the file starts with a "/" use absolute path. Otherwise, make
## it relative to $TODO_DIR ## it relative to $TODO_DIR
if [ "${2:0:1}" == / ] if [ "${1:0:1}" == / ]
then then
## Absolute path ## Absolute path
src="$2" src="$1"
else else
## Relative path ## Relative path
src="$TODO_DIR/$2" src="$TODO_DIR/$1"
fi fi
## Ensure the file exits before proceeding ## Ensure the file exits before proceeding
@@ -533,57 +535,22 @@ case $action in
echo "TODO: File $src does not exist." echo "TODO: File $src does not exist."
fi fi
## Get our search arguments, if any
shift ## was file name, new $1 is first search term
for search_term in "$@"
do
filter_command="${filter_command:-} ${filter_command:+|} \
grep -i \"$search_term\" "
done
## Figure out how much padding we need to use ## Figure out how much padding we need to use
## We need one level of padding for each power of 10 $LINES uses ## We need one level of padding for each power of 10 $LINES uses
LINES=$( wc -l "$src" | sed 's/ .*//' ) LINES=$( wc -l "$src" | sed 's/ .*//' )
i=0 PADDING=${#LINES}
## 6 places will pad tasks numbered less than 99,999, thus correctly
## displaying up to 999,999 tasks. Anyone who's done a million tasks
## should send me an email with your secret.
for i in $( seq 1 6 )
do
if [ ! $(( $LINES / 10 ** $i )) -gt 0 ]
then
break
fi
done
PADDING=$i
unset i LINES
item="${3:-}"
if [ -z "$item" ]; then
## No search pattern specified, operate on whole file
echo -e "$(
sed = "$src" \
| sed "N; s/^/ /; s/ *\(.\{$PADDING,\}\)\n/\1 /" \
| sed '''
s/^ /00000/;
s/^ /0000/;
s/^ /000/;
s/^ /00/;
s/^ /0/;
''' \
| sort -f -k2 \
| sed '''
/^[0-9]\{'$PADDING'\} x /! {
s/\(.*(A).*\)/'$PRI_A'\1 '$DEFAULT'/g;
s/\(.*(B).*\)/'$PRI_B'\1 '$DEFAULT'/g;
s/\(.*(C).*\)/'$PRI_C'\1 '$DEFAULT'/g;
s/\(.*([D-Z]).*\)/'$PRI_X'\1 '$DEFAULT'/g;
}
s/'${HIDE_PRIORITY_SUBSTITUTION:-^}'//g
s/'${HIDE_PROJECTS_SUBSTITUTION:-^}'//g
s/'${HIDE_CONTEXTS_SUBSTITUTION:-^}'//g
''' \
)"
if [ $TODOTXT_VERBOSE = 1 ]; then
echo "--"
NUMTASKS=$( sed '/./!d' "$src" | wc -l | sed 's/^[[:space:]]*\([0-9]*\).*/\1/')
echo "TODO: $NUMTASKS lines shown from $src"
fi
else
## Search pattern or patterns specified; parse the file and then ## Search pattern or patterns specified; parse the file and then
## grep for each pattern afterwords. ## grep for each pattern afterwords.
command=$( command=$(
sed = "$src" \ sed = "$src" \
| sed "N; s/^/ /; s/ *\(.\{$PADDING,\}\)\n/\1 /" \ | sed "N; s/^/ /; s/ *\(.\{$PADDING,\}\)\n/\1 /" \
@@ -603,15 +570,7 @@ case $action in
s/\(.*([D-Z]).*\)/'$PRI_X'\1 '$DEFAULT'/g; s/\(.*([D-Z]).*\)/'$PRI_X'\1 '$DEFAULT'/g;
} }
''' \ ''' \
| grep -i "$item" | eval ${filter_command:-cat} \
)
shift ## was "listfile"
shift ## was first search pattern
for i in "$@"
do
command=`echo "$command" | grep -i "$i" `
done
command=$( echo "$command" \
| sort -f -k2 \ | sort -f -k2 \
| sed ''' | sed '''
s/'${HIDE_PRIORITY_SUBSTITUTION:-^}'//g s/'${HIDE_PRIORITY_SUBSTITUTION:-^}'//g
@@ -620,7 +579,18 @@ case $action in
''' \ ''' \
) )
echo -e "$command" echo -e "$command"
if [ $TODOTXT_VERBOSE == 1 ]; then
echo "--"
NUMTASKS=$(
sed '/^$/d' "$src" \
| eval ${filter_command:-cat} \
| wc -l \
| sed 's/^[[:space:]]*\([0-9]*\).*/\1/' \
)
echo "TODO: $NUMTASKS of $LINES tasks shown from $src"
fi fi
cleanup cleanup
;; ;;