Refactor `command_execution_time` segment

- Change internal precision to nanoseconds
- Let the user decide about desired precision
- Add tests
pull/22/head
Dominik Ritter 8 years ago
parent edb51fcba3
commit a202537dd7

@ -563,14 +563,33 @@ prompt_custom() {
# Display the duration the command needed to run. # Display the duration the command needed to run.
prompt_command_execution_time() { prompt_command_execution_time() {
set_default POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD 3 set_default POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD 3
set_default POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION 2
# Print time in human readable format
# For that use `strftime` and convert
# the duration (float) to an seconds
# (integer).
# See http://unix.stackexchange.com/a/89748
local humanReadableDuration
if (( _P9K_COMMAND_DURATION > 3600 )); then
humanReadableDuration=$(strftime '%H:%M:%S' $(( int(rint(_P9K_COMMAND_DURATION)) )))
elif (( _P9K_COMMAND_DURATION > 60 )); then
humanReadableDuration=$(strftime '%M:%S' $(( int(rint(_P9K_COMMAND_DURATION)) )))
else
# If the command executed in seconds, print as float.
# Convert to float
if [[ "${POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION}" == "0" ]]; then
# If user does not want microseconds, then we need to convert
# the duration to an integer.
typeset -i humanReadableDuration
else
typeset -F ${POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION} humanReadableDuration
fi
humanReadableDuration=$_P9K_COMMAND_DURATION
fi
local duration=$_P9K_COMMAND_DURATION if (( _P9K_COMMAND_DURATION >= POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD )); then
"$1_prompt_segment" "$0" "$2" "red" "226" "${humanReadableDuration}" 'EXECUTION_TIME_ICON'
[[ $_P9K_COMMAND_DURATION -gt 60 ]] && duration=$(strftime '%M:%S' $_P9K_COMMAND_DURATION)
[[ $_P9K_COMMAND_DURATION -gt 3600 ]] && duration=$(strftime '%H:%M:%S' $_P9K_COMMAND_DURATION)
if [ $_P9K_COMMAND_DURATION -ge $POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD ]; then
"$1_prompt_segment" "$0" "$2" "red" "226" "${duration}" 'EXECUTION_TIME_ICON'
fi fi
} }
@ -1179,13 +1198,13 @@ build_right_prompt() {
} }
powerlevel9k_preexec() { powerlevel9k_preexec() {
_P9K_TIMER_START=$EPOCHSECONDS _P9K_TIMER_START=$EPOCHREALTIME
} }
powerlevel9k_prepare_prompts() { powerlevel9k_prepare_prompts() {
RETVAL=$? RETVAL=$?
_P9K_COMMAND_DURATION=$((EPOCHSECONDS - _P9K_TIMER_START)) _P9K_COMMAND_DURATION=$((EPOCHREALTIME - _P9K_TIMER_START))
# Reset start time # Reset start time
_P9K_TIMER_START=99999999999 _P9K_TIMER_START=99999999999
@ -1267,6 +1286,9 @@ prompt_powerlevel9k_setup() {
# initialize timing functions # initialize timing functions
zmodload zsh/datetime zmodload zsh/datetime
# Initialize math functions
zmodload zsh/mathfunc
# initialize hooks # initialize hooks
autoload -Uz add-zsh-hook autoload -Uz add-zsh-hook

@ -23,20 +23,58 @@ function testCommandExecutionTimeIsNotShownIfTimeIsBelowThreshold() {
unset _P9K_COMMAND_DURATION unset _P9K_COMMAND_DURATION
} }
function testCommandExecutionTimesThresholdCouldBeChanged() { function testCommandExecutionTimeThresholdCouldBeChanged() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=1 POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=1
_P9K_COMMAND_DURATION=2 _P9K_COMMAND_DURATION=2.03
assertEquals "%K{red} %F{226%}Dur%f %F{226}2.03 %k%F{red}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset _P9K_COMMAND_DURATION
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD
}
function testCommandExecutionTimeThresholdCouldBeSetToZero() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0
_P9K_COMMAND_DURATION=0.03
assertEquals "%K{red} %F{226%}Dur%f %F{226}0.03 %k%F{red}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset _P9K_COMMAND_DURATION
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD
}
assertEquals "%K{red} %F{226%}Dur%f %F{226}2 %k%F{red}%f " "$(build_left_prompt)" function testCommandExecutionTimePrecisionCouldBeChanged() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0
POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=4
_P9K_COMMAND_DURATION=0.0001
assertEquals "%K{red} %F{226%}Dur%f %F{226}0.0001 %k%F{red}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset _P9K_COMMAND_DURATION unset _P9K_COMMAND_DURATION
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD
} }
function testCommandExecutionTimePrecisionCouldBeSetToZero() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0
_P9K_COMMAND_DURATION=23.5001
assertEquals "%K{red} %F{226%}Dur%f %F{226}23 %k%F{red}%f " "$(build_left_prompt)"
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
unset _P9K_COMMAND_DURATION
unset POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION
}
function testCommandExecutionTimeIsFormattedHumandReadbleForMinuteLongCommand() { function testCommandExecutionTimeIsFormattedHumandReadbleForMinuteLongCommand() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
_P9K_COMMAND_DURATION=180 _P9K_COMMAND_DURATION=180
assertEquals "%K{red} %F{226%}Dur%f %F{226}03:00 %k%F{red}%f " "$(build_left_prompt)" assertEquals "%K{red} %F{226%}Dur%f %F{226}03:00 %k%F{red}%f " "$(build_left_prompt)"
@ -46,7 +84,7 @@ function testCommandExecutionTimeIsFormattedHumandReadbleForMinuteLongCommand()
} }
function testCommandExecutionTimeIsFormattedHumandReadbleForHourLongCommand() { function testCommandExecutionTimeIsFormattedHumandReadbleForHourLongCommand() {
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time) POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time)
_P9K_COMMAND_DURATION=7200 _P9K_COMMAND_DURATION=7200
assertEquals "%K{red} %F{226%}Dur%f %F{226}02:00:00 %k%F{red}%f " "$(build_left_prompt)" assertEquals "%K{red} %F{226%}Dur%f %F{226}02:00:00 %k%F{red}%f " "$(build_left_prompt)"

Loading…
Cancel
Save