Skip to content

Commit

Permalink
fix(async): register the git prompt async handler correctly (ohmyzsh#…
Browse files Browse the repository at this point in the history
…12267)

This fix conditionally registers the git prompt async handler only
if `git_prompt_info` is used anywhere in the prompt variables.

This is done in the proper order, so that the async request is
processed once the handler has been registered.

This fix also passes the return value of the previous command
to each of the async handlers, in case they are needed.
  • Loading branch information
mcornella authored and pull[bot] committed Mar 27, 2024
1 parent 69aaab9 commit 513a1eb
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
12 changes: 9 additions & 3 deletions lib/async_prompt.zsh
Expand Up @@ -5,8 +5,8 @@
zmodload zsh/system

# For now, async prompt function handlers are set up like so:
# First, define the async function handler and add the function name
# to the _omz_async_functions array:
# First, define the async function handler and register the handler
# with _omz_register_handler:
#
# function _git_prompt_status_async {
# # Do some expensive operation that outputs to stdout
Expand All @@ -17,7 +17,7 @@ zmodload zsh/system
# which will show the output of "$_OMZ_ASYNC_OUTPUT[handler_name]":
#
# function git_prompt_status {
# echo -n $_OMZ_ASYNC_OUTPUT[_git_prompt_status]
# echo -n $_OMZ_ASYNC_OUTPUT[_git_prompt_status_async]
# }
#
# RPROMPT='$(git_prompt_status)'
Expand All @@ -43,6 +43,7 @@ function _omz_register_handler {

# Set up async handlers and callbacks
function _omz_async_request {
local -i ret=$?
typeset -gA _OMZ_ASYNC_FDS _OMZ_ASYNC_PIDS _OMZ_ASYNC_OUTPUT

# executor runs a subshell for all async requests based on key
Expand Down Expand Up @@ -83,6 +84,8 @@ function _omz_async_request {
builtin echo ${sysparams[pid]}
# Store handler name for callback
builtin echo $handler
# Set exit code for the handler if used
(exit $ret)
# Run the async function handler
$handler
)
Expand Down Expand Up @@ -138,3 +141,6 @@ function _omz_async_callback() {
_OMZ_ASYNC_FDS[$handler]=-1
_OMZ_ASYNC_PIDS[$handler]=-1
}

autoload -Uz add-zsh-hook
add-zsh-hook precmd _omz_async_request
20 changes: 19 additions & 1 deletion lib/git.zsh
Expand Up @@ -40,11 +40,29 @@ function _omz_git_prompt_status() {
# Enable async prompt by default unless the setting is at false / no
if zstyle -t ':omz:alpha:lib:git' async-prompt; then
function git_prompt_info() {
_omz_register_handler _omz_git_prompt_status
if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then
echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]"
fi
}

# Conditionally register the async handler, only if it's needed in $PROMPT
# or any of the other prompt variables
function _defer_async_git_register() {
# Check if git_prompt_info is used in a prompt variable
case "${PS1}:${PS2}:${PS3}:${PS4}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in
*(\$\(git_prompt_info\)|\`git_prompt_info\`)*)
_omz_register_handler _omz_git_prompt_status
return
;;
esac

add-zsh-hook -d precmd _defer_async_git_register
unset -f _defer_async_git_register
}

# Register the async handler first. This needs to be done before
# the async request prompt is run
precmd_functions=(_defer_async_git_register $precmd_functions)
else
function git_prompt_info() {
_omz_git_prompt_status
Expand Down

0 comments on commit 513a1eb

Please sign in to comment.