Commit 0246eab53716f897ac0f0fb670e0f1adde9e6678
1 parent
12d3d757
use task export and jq to get sorted uuids
Showing
3 changed files
with
120 additions
and
112 deletions
| 1 | +function todate() { | |
| 2 | + [[ $# -eq 0 ]] && return 1 | |
| 3 | + date -d ${1} +%Y-%m-%d | |
| 4 | +} | |
| 5 | + | |
| 1 | 6 | function tstodate() { |
| 2 | 7 | [[ $# -eq 0 ]] && return 1 |
| 3 | 8 | date -d @${1} +%Y-%m-%d |
| ... | ... | @@ -20,8 +25,8 @@ function extracttime() { |
| 20 | 25 | } |
| 21 | 26 | |
| 22 | 27 | function formattime() { |
| 23 | - days=${1%%:*} | |
| 24 | - printf "%03dd %s" ${days:-0} ${1#*:} | |
| 28 | + local DAYS=${1%%:*} | |
| 29 | + printf "%03dd %s" ${DAYS:-0} ${1#*:} | |
| 25 | 30 | } |
| 26 | 31 | |
| 27 | 32 | # vim: set et ts=4 sw=4: | ... | ... |
| 1 | -#!/bin/zsh | |
| 2 | - | |
| 3 | -function duration() { | |
| 4 | - [[ $# -eq 0 ]] && return 1 | |
| 5 | - task $1 info|\ | |
| 6 | - sed 's/\([^ ]*\) \([^ ]*\).*duration: \(\([0-9]*\)d \)\?\([^)]*\).*/\1_\2|\4:\5/;te;d;:e' | |
| 7 | -} | |
| 8 | - | |
| 9 | -function tasktimes() { | |
| 10 | - [[ $# -eq 0 ]] && return 1 | |
| 11 | - duration $1 | |
| 12 | -} | |
| 13 | - | |
| 14 | -function tasktimestotal() { | |
| 15 | - set -- $(duration $1) | |
| 16 | - | |
| 17 | - # == Total calculation == | |
| 18 | - DAYS=0 | |
| 19 | - TI=0 | |
| 20 | - for dur; do | |
| 21 | - # first skip key | |
| 22 | - key=${dur%%|*} | |
| 23 | - dur=${dur#*|} | |
| 24 | - | |
| 25 | - days=${dur%%:*} | |
| 26 | - DAYS=$((DAYS+${days:-0})) | |
| 27 | - | |
| 28 | - ti=$(printf "1970-01-01 %s" ${dur#*:}|xargs -d '\n' date +%s -u -d) | |
| 29 | - TI=$((TI+$ti)) | |
| 30 | - | |
| 31 | - if [[ $TI -ge 86400 ]]; then | |
| 32 | - # bigger than a day? | |
| 33 | - DAYS=$((DAYS+1)) | |
| 34 | - TI=$((TI-86400)) | |
| 35 | - fi | |
| 1 | +#!/bin/env sh | |
| 2 | + | |
| 3 | +function uuids() { | |
| 4 | + # This returns a space separated string of UUIDs fitting | |
| 5 | + # a given sort key and direction and using the provided | |
| 6 | + # filter. Currently only one key can be specified also theoretically | |
| 7 | + # jq could sort on multiple keys. | |
| 8 | + eval set -- $(getopt -o ads: -l asc,desc,sort-by: -- "$@") | |
| 9 | + | |
| 10 | + local DIR="." | |
| 11 | + local KEY="entry" | |
| 12 | + | |
| 13 | + while true; do | |
| 14 | + case "$1" in | |
| 15 | + -a|--asc) DIR="."; shift;; | |
| 16 | + -d|--desc) DIR="-."; shift;; | |
| 17 | + -s|--sort-by) KEY="$2"; shift 2;; | |
| 18 | + --) shift; break;; | |
| 19 | + *) echo "Internal error!"; exit 1;; | |
| 20 | + esac | |
| 36 | 21 | done |
| 37 | - TI="$(date -u -d@${TI} +%X)" | |
| 38 | - echo "${DAYS}:${TI}" | |
| 39 | - # == End Total Calculation == | |
| 40 | -} | |
| 41 | 22 | |
| 42 | -function taskdescription() { | |
| 43 | - [[ $# -eq 0 ]] && return 1 | |
| 44 | - task $1 _unique description | |
| 23 | + task "$@" export|\ | |
| 24 | + jq -r '.|=sort_by(.'${KEY}' | |
| 25 | + |explode | |
| 26 | + |map('${DIR}')) | |
| 27 | + |map(.uuid) | |
| 28 | + |join(" ")' | |
| 45 | 29 | } |
| 46 | 30 | |
| 47 | -function taskproject() { | |
| 31 | +function worktimes() { | |
| 48 | 32 | [[ $# -eq 0 ]] && return 1 |
| 49 | - task $1 _unique project | |
| 50 | -} | |
| 51 | 33 | |
| 52 | -function taskurgency() { | |
| 53 | - [[ $# -eq 0 ]] && return 1 | |
| 54 | - task $1 _urgency | cut -d\ -f 4 | |
| 55 | -} | |
| 34 | + local WHEN='\([^ ]*\) \([^ ]*\)' | |
| 35 | + local DUR='.*duration: \(\([0-9]*\)d \)\?\([^)]*\)' | |
| 36 | + local OUT='{"uuid":"'"$1"'","stop":"\1T\2Z","duration":"\4:\5"}' | |
| 37 | + local TIME DAYS | |
| 56 | 38 | |
| 57 | -function taskentry() { | |
| 58 | - [[ $# -eq 0 ]] && return 1 | |
| 59 | - task $1 _unique entry | |
| 39 | + echo '[' | |
| 40 | + task $1 info|\ | |
| 41 | + sed 's/'"${WHEN}${DUR}"'.*/'"${OUT}"'/;te;d;:e'|\ | |
| 42 | + while read TIME; do | |
| 43 | + DUR="$(echo "${TIME}"|jq -r '.duration')" | |
| 44 | + DAYS="${DUR%%:*}" | |
| 45 | + DUR="${DAYS:-0}:$(date +%H:%M:%S -d "1970-01-01 ${DUR#*:}")" | |
| 46 | + echo "${TIME}"|jq -M -c '.duration="'"${DUR}"'"' | |
| 47 | + done|\ | |
| 48 | + sed '$!s/$/,/' | |
| 49 | + echo ']' | |
| 60 | 50 | } |
| 61 | 51 | |
| 62 | -function taskend() { | |
| 52 | +function work() { | |
| 63 | 53 | [[ $# -eq 0 ]] && return 1 |
| 64 | - task $1 _unique end | |
| 65 | -} | |
| 66 | 54 | |
| 67 | -function taskuuids() { | |
| 68 | - local UUID | |
| 69 | - | |
| 70 | - [[ $# -eq 0 ]] && set -- \( +PENDING or +DONE \) | |
| 71 | - for UUID in $(task $@ _uuid) | |
| 72 | - do | |
| 73 | - printf "%05.2f\037%s\037%s\n" \ | |
| 74 | - "$(taskurgency $UUID)" \ | |
| 75 | - "$(taskdescription $UUID)" \ | |
| 76 | - $UUID | |
| 77 | - done | sort -t$'\037' -k1nr,2 | cut -d$'\037' -f3 | |
| 55 | + local UUID="$1" | |
| 56 | + local TIMES="$(worktimes ${UUID}|jq -M -c '.|map(del(.uuid))')" | |
| 57 | + | |
| 58 | + set -- $(echo "${TIMES}"|jq -r '.|map(.duration)|join(" ")') | |
| 59 | + | |
| 60 | + local DUR | |
| 61 | + for DUR; do | |
| 62 | + local DAYS_ADD=${DUR%%:*} | |
| 63 | + local SECS=$((SECS+$(date +%s -u -d "1970-01-01 ${DUR#*:}"))) | |
| 64 | + DAYS=$((DAYS+${DAYS_ADD:-0})) | |
| 65 | + while [[ ${SECS} -ge 86400 ]]; do | |
| 66 | + # Bigger or equal one day. | |
| 67 | + DAYS=$((DAYS+1)) | |
| 68 | + SECS=$((SECS-86400)) | |
| 69 | + done | |
| 70 | + done | |
| 71 | + | |
| 72 | + printf '{"uuid":"%s","times":%s,"total":"%s:%s"}'\ | |
| 73 | + ${UUID} "${TIMES}" ${DAYS} $(date +%H:%M:%S -u -d@${SECS}) | |
| 78 | 74 | } |
| 79 | 75 | |
| 80 | -function pendinguuids() { | |
| 81 | - taskuuids +PENDING $@ | |
| 82 | -} | |
| 83 | - | |
| 84 | -function doneuuids() { | |
| 85 | - taskuuids +COMPLETED $@ | |
| 86 | -} | |
| 87 | - | |
| 88 | -function blockeduuids() { | |
| 89 | - taskuuids +BLOCKED $@ | |
| 90 | -} | |
| 76 | +function flattened_work() { | |
| 77 | + [[ $# -eq 0 ]] && return 1 | |
| 91 | 78 | |
| 92 | -function blockinguuids() { | |
| 93 | - taskuuids +BLOCKING $@ | |
| 94 | -} | |
| 79 | + WORK="$(work $1)" | |
| 80 | + ITEM="$(echo "${WORK}"|jq -M -c '.|del(.times)')" | |
| 95 | 81 | |
| 96 | -function deleteduuids() { | |
| 97 | - taskuuids +DELETED $@ | |
| 82 | + echo "${WORK}"|jq -M -c '.times|map(.+'"${ITEM}"')' | |
| 98 | 83 | } |
| 99 | 84 | |
| 100 | -# vim: set et ts=4 sw=4: | |
| 85 | +# set -- $(task end.after:$(date +%Y-%m-%d -d "1 week ago") export|\ | |
| 86 | +# jq -r '.|=sort_by(.end|explode|map(-.))|map(.uuid)|join("\n")') | |
| 87 | + | |
| 88 | +# set -- $(uuids "$@") | |
| 89 | +# | |
| 90 | +# for UUID; do | |
| 91 | +# # task _get ${UUID}.entry | |
| 92 | +# # task _get ${UUID}.end | |
| 93 | +# # task _get ${UUID}.modified | |
| 94 | +# # task _get ${UUID}.description | |
| 95 | +# # task _get ${UUID}.urgency | |
| 96 | +# # task _get ${UUID}.project | |
| 97 | +# echo $(work ${UUID}) | |
| 98 | +# echo "------" | |
| 99 | +# flattened_work ${UUID} | |
| 100 | +# echo "======" | |
| 101 | +# done | ... | ... |
| ... | ... | @@ -5,23 +5,10 @@ source $0:A:h/stringhelper.sh |
| 5 | 5 | source $0:A:h/taskhelper.sh |
| 6 | 6 | source $0:A:h/ttyhelper.sh |
| 7 | 7 | |
| 8 | -function printtimes() { | |
| 9 | - local T | |
| 10 | - for T | |
| 11 | - do | |
| 12 | - key=${T%%|*} | |
| 13 | - dur=${T#*|} | |
| 14 | - date="$(date -u -d "${key//_/ }" +%c)" | |
| 15 | - ti=$(printf "1970-01-01 %s" ${dur#*:}|xargs -d '\n' date +%X -u -d) | |
| 16 | - TIME="$(formattime ${dur})" | |
| 17 | - printf "%50s: %14s\n" "${date}" $ti | |
| 18 | - done | |
| 19 | -} | |
| 20 | - | |
| 21 | 8 | function showall() { |
| 22 | 9 | [[ $# -eq 0 ]] && return 1 |
| 23 | 10 | |
| 24 | - local T UUID OIFS | |
| 11 | + local T UUID OIFS WORK FIRST | |
| 25 | 12 | |
| 26 | 13 | printf "%s %s %s %s %s\n" \ |
| 27 | 14 | "$(underline -16 project)" \ |
| ... | ... | @@ -32,15 +19,30 @@ function showall() { |
| 32 | 19 | |
| 33 | 20 | for UUID in $@ |
| 34 | 21 | do |
| 35 | - TIME="$(formattime $(tasktimestotal $UUID))" | |
| 36 | - printf "%-16s %-35s %13s %-10s %-10s\n" \ | |
| 37 | - "$(truncate "$(taskproject $UUID)" 16)" \ | |
| 38 | - "$(truncate "$(taskdescription $UUID)" 35)" \ | |
| 39 | - "$(bold "" "$TIME")" \ | |
| 40 | - "$(tstodate $(taskend $UUID))" \ | |
| 41 | - "$(tstodate $(taskentry $UUID))" \ | |
| 42 | - | |
| 43 | - printtimes $(tasktimes $UUID) | |
| 22 | + FIRST=true | |
| 23 | + | |
| 24 | + flattened_work ${UUID}|\ | |
| 25 | + jq -M -r 'map([.[]]|@sh)|join("\n")'|\ | |
| 26 | + while read WORK; do | |
| 27 | + eval set -- ${WORK} | |
| 28 | + | |
| 29 | + if ${FIRST}; then | |
| 30 | + local TIME="$(formattime $4)" | |
| 31 | + local PROJECT="$(task _get $UUID.project)" | |
| 32 | + | |
| 33 | + printf "%-16s %-35s %13s %-10s %-10s\n" \ | |
| 34 | + "$(truncate "${PROJECT:-(none)}" 16)" \ | |
| 35 | + "$(truncate "$(task _get $UUID.description)" 35)" \ | |
| 36 | + "$(bold "" "${TIME}")" \ | |
| 37 | + "$(todate $(task _get $UUID.end))" \ | |
| 38 | + "$(todate $(task _get $UUID.entry))" | |
| 39 | + fi | |
| 40 | + | |
| 41 | + printf "%50s: %14s\n" \ | |
| 42 | + "$(date -u -d "$1" +%c)" \ | |
| 43 | + "$(formattime $2)" | |
| 44 | + FIRST=false | |
| 45 | + done | |
| 44 | 46 | done |
| 45 | 47 | } |
| 46 | 48 | |
| ... | ... | @@ -48,10 +50,10 @@ function timesheet() { |
| 48 | 50 | local PHRASE="1-week-ago" |
| 49 | 51 | local START="$(date +%Y-%m-%d -d ${PHRASE})" |
| 50 | 52 | |
| 51 | - local DONE="$(showall $(doneuuids end.after:${START} $@))" | |
| 52 | - local UPCOMING="$(showall $(pendinguuids $@))" | |
| 53 | - local BLOCKED="$(showall $(blockeduuids $@))" | |
| 54 | - local BLOCKING="$(showall $(blockinguuids $@))" | |
| 53 | + local DONE="$(showall $(uuids -d -s end +COMPLETED end.after:${START} $@))" | |
| 54 | + local UPCOMING="$(showall $(uuids +PENDING $@))" | |
| 55 | + local BLOCKED="$(showall $(uuids +BLOCKED $@))" | |
| 56 | + local BLOCKING="$(showall $(uuids +BLOCKING $@))" | |
| 55 | 57 | |
| 56 | 58 | DONE="${DONE:+${DONE}${NL}}" |
| 57 | 59 | UPCOMING="${UPCOMING:+${UPCOMING}${NL}}" | ... | ... |
Please
register
or
login
to post a comment