pull upstream changes from gitstatus

pull/70/head
romkatv 6 years ago
parent afa798e459
commit f8c39ec9c2

@ -43,7 +43,7 @@
# VCS_STATUS_WORKDIR=/home/romka/.oh-my-zsh/custom/themes/powerlevel10k # VCS_STATUS_WORKDIR=/home/romka/.oh-my-zsh/custom/themes/powerlevel10k
[[ -o interactive ]] || return [[ -o interactive ]] || return
autoload -Uz add-zsh-hook && zmodload zsh/datetime && zmodload zsh/system || return autoload -Uz add-zsh-hook && zmodload zsh/datetime zsh/system || return
# Retrives status of a git repo from a directory under its working tree. # Retrives status of a git repo from a directory under its working tree.
# #
@ -276,7 +276,7 @@ function gitstatus_start() {
} }
# We use `zsh -c` instead of plain {} or () to work around bugs in zplug. It hangs on startup. # We use `zsh -c` instead of plain {} or () to work around bugs in zplug. It hangs on startup.
zsh -xc " zsh -dfxc "
${(q)daemon} \ ${(q)daemon} \
--lock-fd=3 \ --lock-fd=3 \
--parent-pid=$$ \ --parent-pid=$$ \
@ -296,8 +296,8 @@ function gitstatus_start() {
function _gitstatus_cleanup_${ZSH_SUBSHELL}_${daemon_pid}() { function _gitstatus_cleanup_${ZSH_SUBSHELL}_${daemon_pid}() {
emulate -L zsh emulate -L zsh
setopt err_return no_unset setopt err_return no_unset
local -i daemon_pid=${${(%)${:-%N}}#_gitstatus_cleanup_${ZSH_SUBSHELL}_} local -i daemon_pid=${${(%):-%N}#_gitstatus_cleanup_${ZSH_SUBSHELL}_}
[[ $daemon_pid -gt 0 ]] && kill -- -$daemon_pid &>/dev/null [[ $daemon_pid -gt 0 ]] && kill -- -$daemon_pid &>/dev/null || true
} }
add-zsh-hook zshexit _gitstatus_cleanup_${ZSH_SUBSHELL}_${daemon_pid} add-zsh-hook zshexit _gitstatus_cleanup_${ZSH_SUBSHELL}_${daemon_pid}
@ -309,13 +309,15 @@ function gitstatus_start() {
} }
gitstatus_start_impl && { gitstatus_start_impl && {
typeset -gi GITSTATUS_DAEMON_PID_${name}=$daemon_pid typeset -gi GITSTATUS_DAEMON_PID_${name}=$daemon_pid
typeset -giH _GITSTATUS_REQ_FD_${name}=$req_fd typeset -gi _GITSTATUS_REQ_FD_${name}=$req_fd
typeset -giH _GITSTATUS_RESP_FD_${name}=$resp_fd typeset -gi _GITSTATUS_RESP_FD_${name}=$resp_fd
typeset -giH _GITSTATUS_CLIENT_PID_${name}=$$ typeset -gi _GITSTATUS_LOCK_FD_${name}=$lock_fd
typeset -gi _GITSTATUS_CLIENT_PID_${name}=$$
unset -f gitstatus_start_impl unset -f gitstatus_start_impl
} || { } || {
unsetopt err_return unsetopt err_return
add-zsh-hook -d zshexit _gitstatus_cleanup_${ZSH_SUBSHELL}_${daemon_pid}
[[ $daemon_pid -gt 0 ]] && kill -- -$daemon_pid &>/dev/null [[ $daemon_pid -gt 0 ]] && kill -- -$daemon_pid &>/dev/null
[[ $stderr_fd -ge 0 ]] && { exec 2>&$stderr_fd {stderr_fd}>&- } [[ $stderr_fd -ge 0 ]] && { exec 2>&$stderr_fd {stderr_fd}>&- }
[[ $lock_fd -ge 0 ]] && zsystem flock -u $lock_fd [[ $lock_fd -ge 0 ]] && zsystem flock -u $lock_fd
@ -363,11 +365,48 @@ function gitstatus_start() {
} }
} }
# Stops gitstatusd if it's running.
#
# Usage: gitstatus_stop NAME.
function gitstatus_stop() {
emulate -L zsh
setopt no_unset
(( ARGC == 1 )) || { echo "usage: gitstatus_stop NAME" >&2; return 1 }
local name=$1
local req_fd_var=_GITSTATUS_REQ_FD_${name}
local resp_fd_var=_GITSTATUS_RESP_FD_${name}
local lock_fd_var=_GITSTATUS_LOCK_FD_${name}
local daemon_pid_var=GITSTATUS_DAEMON_PID_${name}
local client_pid_var=_GITSTATUS_CLIENT_PID_${name}
local req_fd=${(P)req_fd_var:-}
local resp_fd=${(P)resp_fd_var:-}
local lock_fd=${(P)lock_fd_var:-}
local daemon_pid=${(P)daemon_pid_var:-}
local cleanup_func=_gitstatus_cleanup_${ZSH_SUBSHELL}_${daemon_pid}
[[ -n $daemon_pid ]] && kill -- -$daemon_pid &>/dev/null
[[ -n $req_fd ]] && exec {req_fd}>&-
[[ -n $resp_fd ]] && { zle -F $resp_fd; exec {resp_fd}>&- }
[[ -n $lock_fd ]] && zsystem flock -u $lock_fd
unset $req_fd_var $resp_fd_var $lock_fd_var $daemon_pid_var $client_pid_var
if (( $+functions[$cleanup_func] )); then
add-zsh-hook -d zshexit $cleanup_func
unfunction $cleanup_func
fi
}
# Usage: gitstatus_check NAME. # Usage: gitstatus_check NAME.
# #
# Returns 0 if and only if `gitstatus_start NAME` has succeeded previously. # Returns 0 if and only if `gitstatus_start NAME` has succeeded previously.
# If it returns non-zero, gitstatus_query NAME is guaranteed to return non-zero. # If it returns non-zero, gitstatus_query NAME is guaranteed to return non-zero.
function gitstatus_check() { function gitstatus_check() {
local name=$1 emulate -L zsh
[[ -n ${(P)${:-GITSTATUS_DAEMON_PID_${name}}:-} ]] (( ARGC == 1 )) || { echo "usage: gitstatus_check NAME" >&2; return 1 }
[[ -n ${(P)${:-GITSTATUS_DAEMON_PID_${1}}} ]]
} }

Loading…
Cancel
Save