A collection of shell scripts to make my live easier.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
3.8 KiB

#!/bin/bash
# File : timesheet.sh
#
# This generates timesheet data for my fedora ${TASK}s only
#exec 2>/dev/null
WHICH='/usr/bin/which'
DATE="$(${WHICH} date)"
PRINTF="$(${WHICH} printf)"
ECHO="$(${WHICH} echo)"
SED="$(${WHICH} sed)"
TASK="$(${WHICH} task)"
HEAD="$(${WHICH} head)"
ANSI2HTML="$(${WHICH} ansi2html)"
phrase="1-weeks-ago"
fmt="%Y-%m-%d"
start=$(${DATE} +$fmt -d $phrase)
end=$(${DATE} +$fmt)
filter=''
function usage()
{
echo "${0} [OPTIONS] [PROJECT]"
echo
echo "Get a timesheet for the past last week."
echo "The \"spent\" time is the whole time spent with this task."
echo
echo "OPTIONS:"
printf " %10s : %s\n" '-?' 'Get this help message.'
printf " %10s : %s\n" '-h' 'Write HTML instead of ansi console text.'
printf " %10s : %s\n" '-o path' 'Save the date under a file defined by'
printf " %10s %s\n" '' '"path" preceeded by the current date and time'
printf " %10s %s\n" '' 'and an ".html" suffix.'
echo
echo "PROJECT:"
echo " The project to create the timesheet for."
}
OUTFILE=''
TO_HTML=0
while getopts 'o:h?' opt
do
case $opt in
o)
OUTFILE="${OPTARG}";;
h)
TO_HTML=1;;
?)
usage
exit 0;;
*)
usage
exit 1;;
esac
done
shift $((${OPTIND} - 1))
test ${1} && filter="project.is:${1}"
function taskdata()
{
echo "$(${TASK} $@ | ${SED} '1,3d' | ${HEAD} -n -2)"
}
function display()
{
${ECHO}
${ECHO} -en "\033[4mproject \033[24m "
${ECHO} -en "\033[4mdescription \033[24m "
${ECHO} -en "\033[4mcompleted \033[24m "
${ECHO} -en "\033[4mentered \033[24m "
${ECHO} -e "\033[4mspent \033[24m"
for i in $*
do
project="$(taskdata uuid:${i} project)"
local description="$(taskdata uuid:${i} description)"
local end="$(taskdata uuid:${i} end)"
local entry="$(taskdata uuid:${i} entry)"
local times="$(${TASK} uuid:${i} info | ${SED} '/duration/{;s/.*duration: PT\(\([0-9]\+\)H\)\?\(\([0-9]\+\)M\)\?\(\([0-9]\+\)S\)\?.*/\2:\4:\6/;s/^:/0:/;s/::/:0:/;s/:$/:0/;p;};d')"
project="$(${PRINTF} "%.15s" "${project}")"
description="$(${PRINTF} "%.35s" "${description}")"
local years=0
local months=0
local days=0
local hours=0
local minutes=0
local seconds=0
for t in ${times}
do
ta=(${t//:/ })
hours=$((hours+$((10#${ta[0]}))))
minutes=$((minutes+$((10#${ta[1]}))))
seconds=$((seconds+$((10#${ta[2]}))))
done
minutes=$((minutes+$((seconds/60))))
seconds=$((seconds%60))
hours=$((hours+$((minutes/60))))
minutes=$((minutes%60))
${PRINTF} "% -15s % -35s % -10s % -10s %02d:%02d:%02d\n" \
"${project}" "${description}" "${end}" \
"${entry}" "${hours}" "${minutes}" "${seconds}"
done
${ECHO}
}
function timesheet()
{
${ECHO} " (generated at $(date))"
${ECHO}
${ECHO} -e "\033[1mTasks completed from $start to $end (back $phrase)\033[22m"
display $(taskdata uuid ${filter} end.after:$start)
${ECHO}
${ECHO} -e "\033[1mUpcoming tasks\033[22m"
display $(taskdata uuidnext ${filter})
${ECHO}
${ECHO} -e "\033[1mBlocked tasks\033[22m"
${TASK} blocked $filter rc._forcecolor=on
${ECHO}
${ECHO} -e "\033[1mBlocking tasks\033[22m"
${TASK} blocking $filter rc._forcecolor=on
${ECHO}
${ECHO} -e "\033[1mSummary\033[22m"
${TASK} summary $filter rc._forcecolor=on
${ECHO}
${ECHO} -e "\033[1mHistory\033[22m"
${TASK} history $filter rc._forcecolor=on
${TASK} ghistory $filter rc._forcecolor=on
${ECHO} -e "\n"
${TASK} burndown.daily rc._forcecolor=on
${ECHO} -e "\n"
${TASK} burndown rc._forcecolor=on
}
if [ ${OUTFILE} ]
then
OUTFILE="${OUTFILE}_$(${DATE} +"%Y-%m-%d_%H:%M:%S")"
if [ ${TO_HTML} -ne 0 ]
then
timesheet $@ | ${ANSI2HTML} >${OUTFILE}.html
else
timesheet $@ >${OUTFILE}
fi
else
if [ ${TO_HTML} -ne 0 ]
then
timesheet $@ | ${ANSI2HTML}
else
timesheet $@
fi
fi
# vim: set ft=sh ts=4 sw=4: