Fix upcoming reminders listing

It was comparing NextElapseUSecMonotonic against /proc/uptime, but those
values aren’t in the same monotonic timeline for user timers, so valid
upcoming reminders were being skipped.
This commit is contained in:
David Heinemeier Hansson
2026-05-10 10:52:20 +02:00
parent 2ab639ac0a
commit d3a082ef11
+10 -13
View File
@@ -41,21 +41,18 @@ parse_systemd_timespan() {
} }
show_reminders() { show_reminders() {
local timers timer next next_seconds uptime remaining body="" local timer next remaining body=""
local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders" local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
local reminder_message="" local reminder_message=""
local now=$(date +%s)
timers=$(systemctl --user list-timers --all --no-legend --no-pager "omarchy-reminder-*.timer" 2>/dev/null | awk '{ print $(NF - 1) }') while IFS=$'\t' read -r timer next; do
uptime=${SECONDS_SINCE_BOOT:-$(awk '{ print int($1) }' /proc/uptime)} [[ -z $timer || -z $next ]] && continue
for timer in $timers; do next=$((next / 1000000))
next=$(systemctl --user show -P NextElapseUSecMonotonic "$timer" 2>/dev/null || true) ((next <= now)) && continue
[[ -z $next ]] && continue
next_seconds=$(parse_systemd_timespan "$next") remaining=$((next - now))
((next_seconds <= uptime)) && continue
remaining=$((next_seconds - uptime))
reminder=${timer%.timer} reminder=${timer%.timer}
reminder=${reminder#omarchy-reminder-} reminder=${reminder#omarchy-reminder-}
set_at=${reminder##*-} set_at=${reminder##*-}
@@ -64,11 +61,11 @@ show_reminders() {
[[ -f $reminder_dir/${timer%.timer}.message ]] && reminder_message=$(<"$reminder_dir/${timer%.timer}.message") [[ -f $reminder_dir/${timer%.timer}.message ]] && reminder_message=$(<"$reminder_dir/${timer%.timer}.message")
if [[ -n $reminder_message ]]; then if [[ -n $reminder_message ]]; then
body+="$reminder_message in $(format_remaining $remaining) ($(date -d "@$((set_at + reminder_minutes * 60))" +%-H:%M))"$'\n' body+="$reminder_message in $(format_remaining $remaining) ($(date -d "@$next" +%-H:%M))"$'\n'
else else
body+="${reminder_minutes}-min reminder in $(format_remaining $remaining) ($(date -d "@$((set_at + reminder_minutes * 60))" +%-H:%M))"$'\n' body+="${reminder_minutes}-min reminder in $(format_remaining $remaining) ($(date -d "@$next" +%-H:%M))"$'\n'
fi fi
done done < <(systemctl --user list-timers --all --output=json "omarchy-reminder-*.timer" 2>/dev/null | jq -r '.[] | [.unit, .next] | @tsv')
if [[ -z $body ]]; then if [[ -z $body ]]; then
omarchy-notification-send "󰔛" "Upcoming reminders" "No outstanding reminders" -u low omarchy-notification-send "󰔛" "Upcoming reminders" "No outstanding reminders" -u low