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