feat: skip subcommand

This commit is contained in:
Lewis Wynne 2026-04-02 01:24:32 +01:00
parent 43ca9661b0
commit 1f34d0eeec
2 changed files with 103 additions and 0 deletions

65
nag
View file

@ -1150,6 +1150,71 @@ stop() {
printf "Stopped alarm %s.\\n" "${_target_id}"
}
# skip ########################################################################
describe "skip" <<HEREDOC
Usage:
${_ME} skip <id>
Description:
Skip the next occurrence of a repeating alarm (reschedule without firing).
For one-shot alarms, this deletes them.
HEREDOC
skip() {
local _target_id="${1:-}"
[[ -n "${_target_id}" ]] || _exit_1 printf "Usage: %s skip <id>\\n" "${_ME}"
_acquire_lock
_read_alarms
local -a _new_alarms=()
local _found=0
local _line
for _line in "${_ALARMS[@]:-}"
do
[[ -n "${_line}" ]] || continue
local _id _timestamp _rule _message
_id="$(_get_alarm_field "${_line}" 1)"
_timestamp="$(_get_alarm_field "${_line}" 2)"
_rule="$(_get_alarm_field "${_line}" 3)"
_message="$(_get_alarm_field "${_line}" 4)"
if [[ "${_id}" == "${_target_id}" ]]
then
_found=1
if [[ -n "${_rule}" ]]
then
local _next_ts _human_time
_next_ts="$(_next_occurrence "${_rule}" "${_timestamp}")"
_new_alarms+=("$(printf "%s\t%s\t%s\t%s" "${_id}" "${_next_ts}" "${_rule}" "${_message}")")
_human_time="$(_format_time "${_next_ts}")"
printf "Skipped. Next: %s\\n" "${_human_time}"
else
printf "Stopped alarm %s.\\n" "${_id}"
fi
else
_new_alarms+=("${_line}")
fi
done
if [[ "${_found}" -eq 0 ]]
then
_release_lock
_exit_1 printf "No alarm with ID %s.\\n" "${_target_id}"
fi
if [[ "${#_new_alarms[@]}" -eq 0 ]]
then
_ALARMS=()
: > "${_ALARMS_FILE}"
else
_ALARMS=("${_new_alarms[@]}")
_write_alarms
fi
_release_lock
}
# check #######################################################################
describe "check" <<HEREDOC

View file

@ -190,6 +190,44 @@ load test_helper
[ "${status}" -eq 1 ]
}
@test "help skip shows skip usage" {
run_nag help skip
[ "${status}" -eq 0 ]
[[ "${output}" =~ "Usage:" ]]
[[ "${output}" =~ "skip <id>" ]]
}
@test "skip reschedules a repeating alarm" {
run_nag every day "tomorrow 3pm" daily task
run_nag skip 1
[ "${status}" -eq 0 ]
[[ "${output}" =~ "Skipped" ]]
[ -s "${NAG_DIR}/alarms" ]
local _ts _now
_ts="$(cut -f2 "${NAG_DIR}/alarms")"
_now="$(date +%s)"
(( _ts > _now ))
}
@test "skip deletes a one-shot alarm" {
run_nag at "tomorrow 3pm" "one-shot"
run_nag skip 1
[ "${status}" -eq 0 ]
[[ "${output}" =~ "Stopped" ]]
run_nag
[[ "${output}" =~ "Nothing to nag about" ]]
}
@test "skip with nonexistent ID fails" {
run_nag skip 99
[ "${status}" -eq 1 ]
}
@test "skip without ID fails" {
run_nag skip
[ "${status}" -eq 1 ]
}
@test "help every shows every usage" {
run_nag help every
[ "${status}" -eq 0 ]