mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2024-12-12 20:21:02 +01:00
fix(async): avoid blocking the shell while waiting (#12304)
Co-authored-by: Marc Cornellà <marc@mcornella.com>
This commit is contained in:
parent
130002a79e
commit
b43b84abc7
1 changed files with 5 additions and 9 deletions
|
@ -82,10 +82,8 @@ function _omz_async_request {
|
||||||
exec {fd}< <(
|
exec {fd}< <(
|
||||||
# Tell parent process our PID
|
# Tell parent process our PID
|
||||||
builtin echo ${sysparams[pid]}
|
builtin echo ${sysparams[pid]}
|
||||||
# Store handler name for callback
|
|
||||||
builtin echo $handler
|
|
||||||
# Set exit code for the handler if used
|
# Set exit code for the handler if used
|
||||||
(exit $ret)
|
() { return $ret }
|
||||||
# Run the async function handler
|
# Run the async function handler
|
||||||
$handler
|
$handler
|
||||||
)
|
)
|
||||||
|
@ -98,8 +96,7 @@ function _omz_async_request {
|
||||||
command true
|
command true
|
||||||
|
|
||||||
# Save the PID from the handler child process
|
# Save the PID from the handler child process
|
||||||
read pid <&$fd
|
read -u $fd "_OMZ_ASYNC_PIDS[$handler]"
|
||||||
_OMZ_ASYNC_PIDS[$handler]=$pid
|
|
||||||
|
|
||||||
# When the fd is readable, call the response handler
|
# When the fd is readable, call the response handler
|
||||||
zle -F "$fd" _omz_async_callback
|
zle -F "$fd" _omz_async_callback
|
||||||
|
@ -114,15 +111,14 @@ function _omz_async_callback() {
|
||||||
local err=$2 # Second arg will be passed in case of error
|
local err=$2 # Second arg will be passed in case of error
|
||||||
|
|
||||||
if [[ -z "$err" || "$err" == "hup" ]]; then
|
if [[ -z "$err" || "$err" == "hup" ]]; then
|
||||||
# Get handler name from first line
|
# Get handler name from fd
|
||||||
local handler
|
local handler="${(k)_OMZ_ASYNC_FDS[(r)$fd]}"
|
||||||
read handler <&$fd
|
|
||||||
|
|
||||||
# Store old output which is supposed to be already printed
|
# Store old output which is supposed to be already printed
|
||||||
local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}"
|
local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}"
|
||||||
|
|
||||||
# Read output from fd
|
# Read output from fd
|
||||||
_OMZ_ASYNC_OUTPUT[$handler]="$(cat <&$fd)"
|
IFS= read -r -u $fd -d '' "_OMZ_ASYNC_OUTPUT[$handler]"
|
||||||
|
|
||||||
# Repaint prompt if output has changed
|
# Repaint prompt if output has changed
|
||||||
if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then
|
if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then
|
||||||
|
|
Loading…
Reference in a new issue