From 029d676b4816b5ef518e150d2769ec9799b7c516 Mon Sep 17 00:00:00 2001 From: Guillermo Ramos Date: Sun, 12 Sep 2021 15:41:24 +0200 Subject: gromo: subtasks (+ refactor) --- gromo | 152 ++++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 102 insertions(+), 50 deletions(-) diff --git a/gromo b/gromo index 11eb604..eb133da 100755 --- a/gromo +++ b/gromo @@ -27,88 +27,140 @@ TODAY_DIR=$DATA_DIR/$(date -I) DING_FILE=$CACHE_DIR/ding.opus STATE_FILE=${XDG_STATE_HOME:-$HOME/.local/state}/gromo -optspec="hlx" +cmd_help() { + cmd=$(basename "$0") + + echo -e "Usage: + $cmd -h \tShow this help + $cmd -s \tShow status + $cmd -l \tList past gromos + $cmd -x \tReturn state formatted for display in xmobar + + $cmd [task]\tStart task + +Tasks can be divided in subtasks by using dots (.), e.g., 'gromo work.retro'. Only the first level +is taken into account for organization purposes: the top-level task is considered the 'main task' +and a file is created after it to account for its subtasks. + " +} + +cmd_list() { + find "$DATA_DIR/" -type f -print0 | xargs -0 -n 1 basename | sort -u +} + +cmd_status() { + format=$1 + + state=idle + [ -f "$STATE_FILE" ] && state=$(cat "$STATE_FILE") + + if [ "$format" = "xmobar" ]; then + color=red + [ "$state" = "idle" ] && color=green + + if [ -d "$TODAY_DIR" ]; then + today="" + # needs nullglob + for task_file in "$TODAY_DIR"/*; do + today+="$(basename "$task_file"): $(sum_subtasks "$task_file"), " + done + [ -n "$today" ] && today=" (${today%, })" + fi + + echo "$state$today" + else + echo -e "state: $state\n" + + if [ -d "$TODAY_DIR" ]; then + # needs nullglob + for task_file in "$TODAY_DIR"/*; do + sort < "$task_file" + done + fi + fi +} + +sum_subtasks() { + file=$1 + awk -F: '{ sum += $2 } END { print sum }' "$file" +} + +inc_subtask() { + task=$1 + maintask="${fulltask%%.*}" + task_file="$TODAY_DIR/$maintask" + if [ -f "$task_file" ]; then + awk -F: "\$1 == \"$task\" { \$2 += 1; added=1 } { print } END { if (!added) { print \"$task\" FS 1 } }" "$task_file" > tmp + mv tmp "$task_file" + else + echo "$task 1" > "$task_file" + fi +} + +pp_seconds() { + seconds=$1 + if [ "$seconds" -lt 60 ]; then + echo "$seconds seconds" + elif [ "$seconds" -lt 3600 ]; then + echo "$((seconds / 60)) minutes" + else + echo "$((seconds / 3600)) hours" + fi +} + +optspec="hslx" while getopts "$optspec" optchar; do case "$optchar" in h) - cmd=$(basename $0) - echo -e "Usage: - $cmd -h\tShow this help - $cmd -l\tList past gromos - $cmd -x\tReturn state formatted for display in xmobar - - $cmd [task] [subtask]\tStart task (default: "work") - " + cmd_help + exit 0 + ;; + s) + cmd_status exit 0 ;; l) - find $DATA_DIR/ -type f -print | xargs -n 1 basename | sort -u + cmd_list exit 0 ;; x) - state=idle - [ -f "$STATE_FILE" ] && state=$(cat $STATE_FILE) - - color=red - [ "$state" = "idle" ] && color=green - - if [ -d "$TODAY_DIR" ]; then - declare -a today - for gromo in "$TODAY_DIR"/*; do - today+=("$(basename $gromo): $(cat $gromo)") - done - [ -n "$today" ] && today=" (${today[@]})" - fi - echo "$state$today" + cmd_status xmobar + exit 0 + ;; + *) + cmd_help exit 0 ;; esac done if [ "$#" -ge 1 ]; then - gromo="$1" - desc="$2" + fulltask="$1" else - gromo=work + cmd_help + exit 0 fi -gromos=0 -gromo_file="$TODAY_DIR/$gromo" mkdir -p "$DATA_DIR" "$TODAY_DIR" [ -f "$DING_FILE" ] || curl $DEFAULT_DING --create-dirs -so "$DING_FILE" -if [ -f $STATE_FILE ]; then +if [ -f "$STATE_FILE" ]; then echo "Another instance is currently running; exiting (remove $STATE_FILE to override)" exit 1 fi echo idle > "$STATE_FILE" -trap 'rm $STATE_FILE 2> /dev/null && echo -e "\n\nToday: $gromos \"$gromo\" gromos ($gromo_time)"; exit' INT TERM EXIT +trap 'rm $STATE_FILE 2> /dev/null; exit' INT TERM EXIT while true; do - [ -f "$gromo_file" ] && read -r gromos < "$gromo_file" - seconds=$((gromos * GROMO_SECONDS)) - if [ $seconds -lt 60 ]; then - gromo_time="$seconds seconds" - elif [ $seconds -lt 3600 ]; then - gromo_time="$((seconds / 60)) minutes" - else - gromo_time="$((seconds / 3600)) hours" - fi - - echo -ne "\r\033[K[** IN PROGRESS: $gromo **] " + echo -ne "\r\033[K[** IN PROGRESS: $fulltask **] " - if [ -n "$desc" ]; then - echo "$gromo ($desc)" > "$STATE_FILE" - else - echo "$gromo" > "$STATE_FILE" - fi + echo "$fulltask" > "$STATE_FILE" sleep $GROMO_SECONDS echo idle > "$STATE_FILE" - gromos=$((gromos+1)) - echo "$gromos" > "$gromo_file" + inc_subtask "$fulltask" (sleep $STOP_SECONDS && mpv --no-terminal "$DING_FILE") & - slock + slock || exit done -- cgit v1.2.3