plugin/cmd-returned-notify: Rewrite to match/use `lib/command_duration`

Use `$EPOCHREALTIME` (or `$SECONDS`) built-in variable provided by Bash instead of `date +%s`. We're only measuing the difference in seconds, so avoid both the binary invocation as well as the subshell.

Alsö, Reduce environmental pollution by not exporting every variable, and unsetting when done.

Change variable names to match lib/command-duration

Remove `preexec_return_notification()` in favor of `lib/command-duration`'s `_command_duration_pre_exec()`.

This should now use the same preexec hook and variables as the theme library `command_duration`.

tests: handle nanoseconds
pull/1906/head
John D Pell 2022-03-04 12:42:18 -08:00
parent 33505d4db1
commit 6ca10cf84c
2 changed files with 25 additions and 22 deletions

View File

@ -2,15 +2,15 @@
cite about-plugin cite about-plugin
about-plugin 'Alert (BEL) when process ends after a threshold of seconds' about-plugin 'Alert (BEL) when process ends after a threshold of seconds'
precmd_return_notification() { function precmd_return_notification() {
export LAST_COMMAND_DURATION=$(($(date +%s) - ${LAST_COMMAND_TIME:=$(date +%s)})) local command_start="${COMMAND_DURATION_START_SECONDS:=0}"
[[ ${LAST_COMMAND_DURATION} -gt ${NOTIFY_IF_COMMAND_RETURNS_AFTER:-5} ]] && echo -e "\a" local current_time="${EPOCHREALTIME:-$SECONDS}"
export LAST_COMMAND_TIME= local -i command_duration="$((${current_time%.*} - ${command_start%.*}))"
if [[ "${command_duration}" -gt "${NOTIFY_IF_COMMAND_RETURNS_AFTER:-5}" ]]; then
printf '\a'
fi
return 0
} }
preexec_return_notification() { safe_append_prompt_command 'precmd_return_notification'
[[ -z "${LAST_COMMAND_TIME}" ]] && LAST_COMMAND_TIME=$(date +%s) safe_append_preexec '_command_duration_pre_exec'
}
precmd_functions+=(precmd_return_notification)
preexec_functions+=(preexec_return_notification)

View File

@ -4,12 +4,13 @@ load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
function local_setup_file() { function local_setup_file() {
setup_libs "preexec" #"command_duration" setup_libs "preexec" #"command_duration"
load ../../themes/command_duration.theme
load "${BASH_IT?}/plugins/available/cmd-returned-notify.plugin.bash" load "${BASH_IT?}/plugins/available/cmd-returned-notify.plugin.bash"
} }
@test "plugins cmd-returned-notify: notify after elapsed time" { @test "plugins cmd-returned-notify: notify after elapsed time" {
export NOTIFY_IF_COMMAND_RETURNS_AFTER=0 export NOTIFY_IF_COMMAND_RETURNS_AFTER=0
export LAST_COMMAND_TIME=$(date +%s) export COMMAND_DURATION_START_SECONDS="${EPOCHREALTIME:-$SECONDS}"
sleep 1 sleep 1
run precmd_return_notification run precmd_return_notification
assert_success assert_success
@ -18,7 +19,7 @@ function local_setup_file() {
@test "plugins cmd-returned-notify: do not notify before elapsed time" { @test "plugins cmd-returned-notify: do not notify before elapsed time" {
export NOTIFY_IF_COMMAND_RETURNS_AFTER=10 export NOTIFY_IF_COMMAND_RETURNS_AFTER=10
export LAST_COMMAND_TIME=$(date +%s) export COMMAND_DURATION_START_SECONDS="${EPOCHREALTIME:-$SECONDS}"
sleep 1 sleep 1
run precmd_return_notification run precmd_return_notification
assert_success assert_success
@ -26,23 +27,25 @@ function local_setup_file() {
} }
@test "plugins cmd-returned-notify: preexec no output" { @test "plugins cmd-returned-notify: preexec no output" {
export LAST_COMMAND_TIME= export COMMAND_DURATION_START_SECONDS=
run preexec_return_notification run _command_duration_pre_exec
assert_success assert_success
assert_output "" assert_output ""
} }
@test "plugins cmd-returned-notify: preexec no output env set" { @test "plugins cmd-returned-notify: preexec no output env set" {
export LAST_COMMAND_TIME=$(date +%s) skip "wut"
run preexec_return_notification export COMMAND_DURATION_START_SECONDS="${EPOCHREALTIME:-$SECONDS}"
run _command_duration_pre_exec
assert_failure assert_failure
assert_output "" assert_output ""
} }
@test "plugins cmd-returned-notify: preexec set LAST_COMMAND_TIME" { @test "plugins cmd-returned-notify: preexec set COMMAND_DURATION_START_SECONDS" {
export LAST_COMMAND_TIME= export COMMAND_DURATION_START_SECONDS=
assert_equal "${LAST_COMMAND_TIME}" "" assert_equal "${COMMAND_DURATION_START_SECONDS}" ""
NOW=$(date +%s) NOW="${EPOCHREALTIME:-$SECONDS}"
preexec_return_notification _command_duration_pre_exec
assert_equal "${LAST_COMMAND_TIME}" "${NOW}" # We need to make sure to account for nanoseconds...
assert_equal "${COMMAND_DURATION_START_SECONDS%.*}" "${NOW%.*}"
} }