blob: 44193d07a97a8ef73ccf5fae2fa7f8741a6d2aff (
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
102
103
104
105
106
107
108
109
110
111
112
113
|
#! /bin/bash
# Usage:
# context 1h2m30s (Update current context with given time)
# context -s 1h20m (Set current context with given time)
# context (Check total time of each context)
LOG_FILE=~/log/.context && touch $LOG_FILE
PLAN_FILE=~/log/plan.context.md
context="$(cat ~/.task/context)"
[[ "$*" =~ '-s' ]] && SET=true && shift
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=
BLOCK_CHAR=▮ #▊◼
# This dictionary store the valid contexts and the time I plan to spend on
declare -A SPEND
# 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'
}
_save_spend_time_to_dic() {
while read ctx sec; do
[ -z "$ctx" ] && continue
SPEND[$ctx]=$sec
done <$LOG_FILE
}
# 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" ))
[ "$SET" = true ] && break
sed -i -E "s/^${context}.*/${context}\t${total}/" $LOG_FILE
exit 0
fi
# Update Log file
done <$LOG_FILE
echo -e "$context\t${given_seconds}" >>$LOG_FILE
}
# Print spend for each context
_print_spend_time() {
_save_spend_time_to_dic
while read -r line; do
[ -z "$line" ] && break
ctx=$(awk '{print $1}' <<<"$line")
time=$(awk '{print $2}' <<<"$line")
seconds_of_plan=$(_get_seconds $time)
sec=${SPEND[$ctx]}; sec=${sec:-0}
# Print context and time I spend
echo -ne "$ctx\t\t"
date -u -d @"$sec" +%H:%M | tr -d '\n'
echo -n "/"
date -u -d @"$seconds_of_plan" +%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"
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 <$PLAN_FILE
}
if [ -n "$1" ]; then
_update_spend_time
else
_print_spend_time
fi
|