feat: snooze supports all, tags, and optional duration
This commit is contained in:
parent
e2d5329276
commit
ad68c225d5
2 changed files with 144 additions and 6 deletions
85
nag
85
nag
|
|
@ -1968,19 +1968,80 @@ Examples:
|
||||||
${_ME} snooze 3 "2 weeks" snooze alarm 3 for 2 weeks
|
${_ME} snooze 3 "2 weeks" snooze alarm 3 for 2 weeks
|
||||||
${_ME} snooze all "July 15" snooze everything until July 15
|
${_ME} snooze all "July 15" snooze everything until July 15
|
||||||
HEREDOC
|
HEREDOC
|
||||||
|
_snooze_by_tag() {
|
||||||
|
local _tag="${1}" _duration_str="${2:-}"
|
||||||
|
|
||||||
|
_acquire_lock
|
||||||
|
_read_alarms
|
||||||
|
|
||||||
|
local _match_count=0 _line
|
||||||
|
for _line in "${_ALARMS[@]:-}"
|
||||||
|
do
|
||||||
|
[[ -n "${_line}" ]] || continue
|
||||||
|
local _tags
|
||||||
|
_tags="$(_get_alarm_field "${_line}" 2)"
|
||||||
|
_alarm_has_tag "${_tags}" "${_tag}" && _match_count=$((_match_count + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
if (( _match_count == 0 ))
|
||||||
|
then
|
||||||
|
_release_lock
|
||||||
|
_exit_1 printf "No alarms tagged [%s].\\n" "${_tag}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! _confirm_action "Snooze" "${_match_count}" "${_tag}"
|
||||||
|
then
|
||||||
|
_release_lock
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
_ensure_nag_dir
|
||||||
|
if [[ -n "${_duration_str}" ]]
|
||||||
|
then
|
||||||
|
local _until_ts
|
||||||
|
_until_ts="$(_parse_time "${_duration_str}")"
|
||||||
|
printf "%s\t%s\\n" "${_tag}" "${_until_ts}" >> "${_SNOOZED_FILE}"
|
||||||
|
_release_lock
|
||||||
|
local _until_date
|
||||||
|
_until_date="$(date -d "@${_until_ts}" "+%b %-d")"
|
||||||
|
printf "Snoozed [%s] until %s.\\n" "${_tag}" "${_until_date}"
|
||||||
|
else
|
||||||
|
printf "%s\\n" "${_tag}" >> "${_SNOOZED_FILE}"
|
||||||
|
_release_lock
|
||||||
|
printf "Snoozed [%s].\\n" "${_tag}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
snooze() {
|
snooze() {
|
||||||
local _target="${1:-}"
|
local _target="${1:-}"
|
||||||
[[ -n "${_target}" ]] || _exit_1 printf "Usage: %s snooze <all|id|tag> [<duration>]\\n" "${_ME}"
|
[[ -n "${_target}" ]] || _exit_1 printf "Usage: %s snooze <all|id|tag> [<duration>]\\n" "${_ME}"
|
||||||
|
|
||||||
# "all" and tag: placeholder for Task 5.
|
|
||||||
if [[ "${_target}" == "all" ]]
|
if [[ "${_target}" == "all" ]]
|
||||||
then
|
then
|
||||||
_exit_1 printf "Not yet implemented.\\n"
|
local _duration_str="${2:-}"
|
||||||
|
_ensure_nag_dir
|
||||||
|
_acquire_lock
|
||||||
|
if [[ -n "${_duration_str}" ]]
|
||||||
|
then
|
||||||
|
local _until_ts
|
||||||
|
_until_ts="$(_parse_time "${_duration_str}")"
|
||||||
|
printf "*\t%s\\n" "${_until_ts}" > "${_SNOOZED_FILE}"
|
||||||
|
_release_lock
|
||||||
|
local _until_date
|
||||||
|
_until_date="$(date -d "@${_until_ts}" "+%b %-d")"
|
||||||
|
printf "Snoozed all until %s.\\n" "${_until_date}"
|
||||||
|
else
|
||||||
|
printf "*\\n" > "${_SNOOZED_FILE}"
|
||||||
|
_release_lock
|
||||||
|
printf "Snoozed all.\\n"
|
||||||
|
fi
|
||||||
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! "${_target}" =~ ^[0-9]+$ ]]
|
if [[ ! "${_target}" =~ ^[0-9]+$ ]]
|
||||||
then
|
then
|
||||||
_exit_1 printf "Not yet implemented.\\n"
|
_snooze_by_tag "${_target}" "${2:-}"
|
||||||
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Numeric: snooze by ID.
|
# Numeric: snooze by ID.
|
||||||
|
|
@ -2007,10 +2068,22 @@ snooze() {
|
||||||
_exit_1 printf "No alarm with ID %s.\\n" "${_target}"
|
_exit_1 printf "No alarm with ID %s.\\n" "${_target}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local _duration_str="${2:-}"
|
||||||
_ensure_nag_dir
|
_ensure_nag_dir
|
||||||
printf "%s\\n" "${_target}" >> "${_SNOOZED_FILE}"
|
if [[ -n "${_duration_str}" ]]
|
||||||
_release_lock
|
then
|
||||||
printf "Snoozed [%s] %s.\\n" "${_target}" "${_message}"
|
local _until_ts
|
||||||
|
_until_ts="$(_parse_time "${_duration_str}")"
|
||||||
|
printf "%s\t%s\\n" "${_target}" "${_until_ts}" >> "${_SNOOZED_FILE}"
|
||||||
|
_release_lock
|
||||||
|
local _until_date
|
||||||
|
_until_date="$(date -d "@${_until_ts}" "+%b %-d")"
|
||||||
|
printf "Snoozed [%s] %s until %s.\\n" "${_target}" "${_message}" "${_until_date}"
|
||||||
|
else
|
||||||
|
printf "%s\\n" "${_target}" >> "${_SNOOZED_FILE}"
|
||||||
|
_release_lock
|
||||||
|
printf "Snoozed [%s] %s.\\n" "${_target}" "${_message}"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# edit ########################################################################
|
# edit ########################################################################
|
||||||
|
|
|
||||||
|
|
@ -26,3 +26,68 @@ load test_helper
|
||||||
run_nag snooze
|
run_nag snooze
|
||||||
[ "${status}" -eq 1 ]
|
[ "${status}" -eq 1 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "snooze all creates global entry" {
|
||||||
|
run_nag snooze all
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Snoozed all." ]]
|
||||||
|
[ -f "${NAG_DIR}/snoozed" ]
|
||||||
|
grep -q "^\*$" "${NAG_DIR}/snoozed"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "snooze all with duration sets expiry" {
|
||||||
|
run_nag snooze all "tomorrow"
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Snoozed all" ]]
|
||||||
|
[[ "${output}" =~ "until" ]]
|
||||||
|
local _line
|
||||||
|
_line="$(cat "${NAG_DIR}/snoozed")"
|
||||||
|
[[ "${_line}" == \*$'\t'* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "snooze by tag creates entry in snoozed file" {
|
||||||
|
run_nag at "tomorrow 3pm" "work task"
|
||||||
|
run_nag tag 1 work
|
||||||
|
run_nag snooze work
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Snoozed [work]" ]]
|
||||||
|
grep -q "^work$" "${NAG_DIR}/snoozed"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "snooze by tag requires -f" {
|
||||||
|
run_nag at "tomorrow 3pm" "work task"
|
||||||
|
run_nag tag 1 work
|
||||||
|
run "${_NAG}" snooze work < /dev/null
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Snooze" ]]
|
||||||
|
[[ "${output}" =~ "-f" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "snooze by tag with no matching alarms fails" {
|
||||||
|
run_nag at "tomorrow 3pm" "test alarm"
|
||||||
|
run "${_NAG}" -f snooze nonexistent
|
||||||
|
[ "${status}" -eq 1 ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "snooze by ID with duration sets expiry" {
|
||||||
|
run_nag at "tomorrow 3pm" "take a break"
|
||||||
|
run_nag snooze 1 "tomorrow"
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Snoozed [1]" ]]
|
||||||
|
[[ "${output}" =~ "until" ]]
|
||||||
|
local _line
|
||||||
|
_line="$(cat "${NAG_DIR}/snoozed")"
|
||||||
|
[[ "${_line}" == 1$'\t'* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "snooze by tag with duration sets expiry" {
|
||||||
|
run_nag at "tomorrow 3pm" "work task"
|
||||||
|
run_nag tag 1 work
|
||||||
|
run_nag snooze work "tomorrow"
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Snoozed [work]" ]]
|
||||||
|
[[ "${output}" =~ "until" ]]
|
||||||
|
local _line
|
||||||
|
_line="$(cat "${NAG_DIR}/snoozed")"
|
||||||
|
[[ "${_line}" == work$'\t'* ]]
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue