aboutsummaryrefslogtreecommitdiff
path: root/core/update
diff options
context:
space:
mode:
Diffstat (limited to 'core/update')
-rw-r--r--core/update70
1 files changed, 33 insertions, 37 deletions
diff --git a/core/update b/core/update
index 8787754..686def2 100644
--- a/core/update
+++ b/core/update
@@ -2,25 +2,25 @@
[ "$skip_libraries" ] && return
export now="$(date +%s.%N)"
-# load current state
-mkdir -p "$POMODORO_STATE_PATH"
-load_or_init() {
- property="$1"
- default_value="$2"
- property_path="$POMODORO_STATE_PATH/current/$property"
- if [ -f "$property_path" ] ; then
- eval $property='"$(cat "$property_path")"'
- else
- eval $property='$default_value'
+# export state
+state() { echo "$lap $running $time" ; }
+
+# load original_state once per invocation of dppt
+if [ -z "$original_state" ] ; then
+ # import state
+ mkdir -p "$POMODORO_STATE_PATH"
+ if [ -e "$POMODORO_STATE_PATH/current" ] ; then
+ read -r lap running time < "$POMODORO_STATE_PATH/current"
fi
-}
-[ -z "$lap" ] && load_or_init lap 0
-[ -z "$state" ] && load_or_init state 'reset'
-[ -z "$time" ] && load_or_init time 0.0
-# save state (for diff)
-diff_state() { printf '%s:' "$lap" "$state" "$time" ; }
-original_state="$(diff_state)"
+ # ensure state variables are always initialized
+ lap=${lap:-0}
+ running=${running:-0}
+ time=${time:-0}
+
+ # save original state (see save_state function)
+ original_state="$(state)"
+fi
# allow overriding this value manually
[ -z "$update_time" ] && update_time=0
@@ -28,19 +28,18 @@ original_state="$(diff_state)"
# calculate remaining time on timer
if [ -z "$remaining" ] ; then
remaining="$time"
- [ "$state" = 'running' ] && remaining="$(echo "( $time - $now ) / 1" | bc)"
+ [ $running -eq 1 ] && remaining="$(echo "( $time - $now ) / 1" | bc)"
fi
# go to next lap if this timer expired
-if [ "$state" = 'running' ] && [ "${remaining#-}" != "${remaining}" ] ; then
+if [ $running -eq 1 ] && [ "${remaining#-}" != "${remaining}" ] ; then
lap=$(( $lap + 1 ))
state='paused'
update_time=1
fi
# update remaining time if in reset
-[ "$state" = 'reset' ] && update_time=1
-[ "$time" = "0.0" ] && update_time=1
+[ $lap -eq 0 ] && [ $time = '0' ] && update_time=1
if [ $update_time -eq 1 ] ; then
# skip_libraries is used to prevent endless loop (see top of this file)
@@ -49,8 +48,9 @@ if [ $update_time -eq 1 ] ; then
fi
save_state() {
+ new_state="$(state)"
# do not save files if state didn't change
- [ "$original_state" = "$(diff_state)" ] && return
+ [ "$original_state" = "$new_state" ] && return
# The state update needs to be atomic since other instances may access the
# state during an update. This is accomplished by replacing a single symlink,
@@ -58,34 +58,30 @@ save_state() {
# complicated than a lockfile. $POMODORO_STATE_PATH contains three items:
#
# 1. current -- a symlink to `primary` or `secondary`
- # 2. primary -- folder containing current state*
- # 3. secondary -- temporary folder used write new state
+ # 2. primary -- file containing current state*
+ # 3. secondary -- temporary file used write new state
#
# * `primary` will only contain stale state during an update (i.e. while
# `current` is pointing to `secondary`)
- mkdir -p "$POMODORO_STATE_PATH/primary" "$POMODORO_STATE_PATH/secondary"
-
- echo "$lap" > "$POMODORO_STATE_PATH/secondary/lap"
- echo "$state" > "$POMODORO_STATE_PATH/secondary/state"
- echo "$time" > "$POMODORO_STATE_PATH/secondary/time"
-
- ln -sf "secondary" "$POMODORO_STATE_PATH/secondary/current"
+ # save state and create replacement symlink for `current`
+ echo "$new_state" > "$POMODORO_STATE_PATH/secondary"
+ ln -sf "secondary" "$POMODORO_STATE_PATH/current~"
# this is the atomic update that replaces the `current` symlink with the new
# state
- mv "$POMODORO_STATE_PATH/secondary/current" "$POMODORO_STATE_PATH"
+ mv "$POMODORO_STATE_PATH/current~" "$POMODORO_STATE_PATH/current"
- # next, replace the old `primary` state with the new state from `secondary`,
+ # next, replace the old `primary` state with the new state from `secondary`
+ cp "$POMODORO_STATE_PATH/secondary" "$POMODORO_STATE_PATH/primary"
# and update the symlink a second time to now point to `primary` again (this
# does not change the state)
- cp -r "$POMODORO_STATE_PATH/secondary/." "$POMODORO_STATE_PATH/primary/"
- ln -sf "primary" "$POMODORO_STATE_PATH/primary/current"
- mv "$POMODORO_STATE_PATH/primary/current" "$POMODORO_STATE_PATH"
+ ln -sf "primary" "$POMODORO_STATE_PATH/current~"
+ mv "$POMODORO_STATE_PATH/current~" "$POMODORO_STATE_PATH/current"
}
# state variables
-export lap state time
+export lap running time
# calculated variables
export remaining