diff --git a/nag b/nag index 45ddba0..c9ed76b 100755 --- a/nag +++ b/nag @@ -727,6 +727,44 @@ _sweep_expired_snoozes() { fi } +# Usage: +# _get_snooze_display +# +# Description: +# Set REPLY to a display string for the given alarm ID's snooze status. +# Returns " (snoozed)" for indefinite snoozes, " (snoozed until )" +# for timed snoozes, or "" if the alarm is not snoozed. +_get_snooze_display() { + local _id="${1}" + REPLY="" + [[ -f "${_SNOOZED_FILE}" ]] || return 0 + + local _now _entry + _now="$(date +%s)" + + while IFS= read -r _entry || [[ -n "${_entry}" ]] + do + [[ -n "${_entry}" ]] || continue + local _entry_key="${_entry%%$'\t'*}" + + [[ "${_entry_key}" == "${_id}" ]] || continue + + if [[ "${_entry}" == *$'\t'* ]] + then + local _expiry="${_entry#*$'\t'}" + if (( _expiry > _now )) + then + local _until_date + _until_date="$(date -d "@${_expiry}" "+%b %-d")" + REPLY=" (snoozed until ${_until_date})" + fi + else + REPLY=" (snoozed)" + fi + return 0 + done < "${_SNOOZED_FILE}" +} + # Usage: # _remove_snoozed_entry # @@ -816,7 +854,11 @@ _tag_list() { _tag_display=" [${_tags//,/, }]" - printf "[%s]%s %s%s — %s\\n" "${_id}" "${_tag_display}" "${_human_time}" "${_rule_display}" "${_message}" + local _snooze_display + _get_snooze_display "${_id}" + _snooze_display="${REPLY}" + + printf "[%s]%s %s%s%s — %s\\n" "${_id}" "${_tag_display}" "${_human_time}" "${_rule_display}" "${_snooze_display}" "${_message}" done if (( ! _matched )) @@ -1443,7 +1485,11 @@ list() { _tag_display="" fi - printf "[%s]%s %s%s — %s\\n" "${_id}" "${_tag_display}" "${_human_time}" "${_rule_display}" "${_message}" + local _snooze_display + _get_snooze_display "${_id}" + _snooze_display="${REPLY}" + + printf "[%s]%s %s%s%s — %s\\n" "${_id}" "${_tag_display}" "${_human_time}" "${_rule_display}" "${_snooze_display}" "${_message}" done } diff --git a/test/list.bats b/test/list.bats index afa0ddf..7d52379 100644 --- a/test/list.bats +++ b/test/list.bats @@ -110,3 +110,30 @@ load test_helper [ "${status}" -eq 0 ] [[ "${output}" =~ "${_date},".*"far alarm" ]] } + +@test "list shows (snoozed) for indefinitely snoozed alarm" { + run_nag at "tomorrow 3pm" "take a break" + printf "1\\n" > "${NAG_DIR}/snoozed" + run_nag + [ "${status}" -eq 0 ] + [[ "${output}" =~ "(snoozed)" ]] + [[ "${output}" =~ "take a break" ]] +} + +@test "list shows (snoozed until DATE) for timed snooze" { + run_nag at "tomorrow 3pm" "take a break" + local _expiry_ts=$(( $(date +%s) + 86400 * 7 )) + printf "1\t%s\\n" "${_expiry_ts}" > "${NAG_DIR}/snoozed" + local _expiry_date + _expiry_date="$(date -d "@${_expiry_ts}" "+%b %-d")" + run_nag + [ "${status}" -eq 0 ] + [[ "${output}" =~ "snoozed until ${_expiry_date}" ]] +} + +@test "list does not show (snoozed) for unsnoozed alarm" { + run_nag at "tomorrow 3pm" "take a break" + run_nag + [ "${status}" -eq 0 ] + [[ ! "${output}" =~ "snoozed" ]] +}