blob: 431b6add3497448e98aad0f070f18e29303961f7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#! /bin/bash
# Usage:
# context 1h2m30s (Update current context with given time)
# context (Check total time of each context)
LOG_FILE=~/log/.context && touch $LOG_FILE
context="$(cat ~/.task/context)"
time="$1"
# The unit of time display. For example:
# If it is 900(seconds), then the minimal symbol of
# time display is 15min
UNIT=900
BLOCK_CHAR=▊
# This dictionary store the valid contexts and the time I plan to spend on
declare -A PLAN
# Get seconds from given string
_get_seconds() {
# Modify input to fit the format that `date` can read
hour=$(grep -o '[0-9.]\+h' <<<"$1" | tr -d '[:alpha:]')
min=$(grep -o '[0-9.]\+m' <<<"$1" | tr -d '[:alpha:]')
sec=$(grep -o '[0-9.]\+s' <<<"$1" | tr -d '[:alpha:]')
echo "${hour:-0}*3600 + ${min:-0}*60 + ${sec:-0}" | bc | xargs printf '%.0f\n'
}
_set_context_plan() {
while read line; do
[ -z "$line" ] && break
ctx=$(awk '{print $1}' <<<"$line")
time=$(awk '{print $2}' <<<"$line")
PLAN[$ctx]=$(_get_seconds $time)
done <~/log/plan.context.md
}
# Update spend time on current context
_update_spend_time() {
# If current conetxt is not given, exit with 1
if [ -z "$context" ] || [ "$context" = none ]; then
exit 1
fi
given_seconds="$(_get_seconds "$time")"
# Get total time of given time and current context time
while read -r ctx sec; do
if [ "$ctx" = "$context" ]; then
total=$(( "$sec" + "$given_seconds" ))
sed -i -E "s/^${context}.*/${context}\t${total}/" $LOG_FILE
exit 0
fi
done <$LOG_FILE
# Update Log file
echo -e "$context\t${given_seconds}" >>$LOG_FILE
}
# Print spend for each context
_print_spend_time() {
_set_context_plan
while read -r ctx sec; do
# Print context and time I spend
echo -ne "$ctx\t\t"
date -u -d @"$sec" +%H:%M | tr -d '\n'
number_of_spend=$(( $sec / $UNIT ))
# Print block of time spend (green)
echo -ne "\t\t\e[32m"
[ ! "$number_of_spend" = 0 ] && printf "%0.s$BLOCK_CHAR" $(seq $number_of_spend)
echo -en "\e[0m"
seconds_of_plan=${PLAN[$ctx]}
if [ -n "$seconds_of_plan" ]; then
number_of_plan=$(( ${seconds_of_plan} / $UNIT ))
[ "$(( $seconds_of_plan % $UNIT ))" = 0 ] || (( number_of_plan++ ))
number_of_remaining=$(( $number_of_plan - $number_of_spend ))
# Print block of remaining time (normal)
if (( "$number_of_remaining" > 0 )); then
printf "%0.s$BLOCK_CHAR" $(seq $number_of_remaining)
# Print block of exceed time (red)
elif (( "$number_of_remaining" < 0 )); then
number_of_exceed=${number_of_remaining#-}
printf "%0.s\b" $(seq $number_of_exceed)
echo -ne "\e[31m"
printf "%0.s$BLOCK_CHAR" $(seq $number_of_exceed)
echo -en "\e[0m"
fi
fi
echo
done <$LOG_FILE
}
if [ -n "$1" ]; then
_update_spend_time
else
_print_spend_time
fi
|