mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-03-20 03:13:33 +01:00
Timebox the git status checks inside prompt so slow repos don't hang the zsh prompt.
Give "robbyrussell" them support for the timed-out check. Uses zsh's `coproc` to put a timeout on the `git status` call inside git_prompt_info() Introduces $ZSH_THEME_GIT_PROMPT_TIMEDOUT and $ZSH_THEME_SCM_CHECK_TIMEOUT theme configuration variables to control how long the timeout is and how the timed-out indicator appears inside the prompt.
This commit is contained in:
parent
1b6af54676
commit
3efa6ceddd
3 changed files with 22 additions and 6 deletions
22
lib/git.zsh
22
lib/git.zsh
|
|
@ -12,6 +12,7 @@ function git_prompt_info() {
|
|||
parse_git_dirty() {
|
||||
local STATUS=''
|
||||
local FLAGS
|
||||
local COPID=''
|
||||
FLAGS=('--porcelain')
|
||||
if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then
|
||||
if [[ $POST_1_7_2_GIT -gt 0 ]]; then
|
||||
|
|
@ -20,12 +21,21 @@ parse_git_dirty() {
|
|||
if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" == "true" ]]; then
|
||||
FLAGS+='--untracked-files=no'
|
||||
fi
|
||||
STATUS=$(command git status ${FLAGS} 2> /dev/null | tail -n1)
|
||||
fi
|
||||
if [[ -n $STATUS ]]; then
|
||||
echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
|
||||
else
|
||||
echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
|
||||
# Use coproc to timebox `git status` so slow repo access doesn't hang the prompt
|
||||
# Use dummy "xxx" to distinguish timeouts from empty output
|
||||
local END_OUTPUT="_end_of_status_"
|
||||
coproc (command git status ${FLAGS} 2> /dev/null; echo $END_OUTPUT)
|
||||
COPID=$!
|
||||
read -p -t $ZSH_THEME_SCM_CHECK_TIMEOUT STATUS
|
||||
if [[ -z $STATUS ]]; then
|
||||
echo "$ZSH_THEME_GIT_PROMPT_TIMEDOUT"
|
||||
# Get rid of that git run
|
||||
kill -s KILL $COPID &>/dev/null
|
||||
elif [[ $STATUS = $END_OUTPUT ]]; then
|
||||
echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
|
||||
else
|
||||
echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,11 @@ ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Prefix at the very beginning of th
|
|||
ZSH_THEME_GIT_PROMPT_SUFFIX=")" # At the very end of the prompt
|
||||
ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty
|
||||
ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean
|
||||
ZSH_THEME_GIT_PROMPT_TIMEDOUT="?" # Text to display if status check timed out
|
||||
|
||||
# Timeout (in seconds, fractions OK) for SCM (git/hg/etc) info checks done
|
||||
# inside prompt
|
||||
ZSH_THEME_SCM_CHECK_TIMEOUT=1
|
||||
|
||||
# Setup the prompt with pretty colors
|
||||
setopt prompt_subst
|
||||
|
|
|
|||
|
|
@ -4,4 +4,5 @@ PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(g
|
|||
ZSH_THEME_GIT_PROMPT_PREFIX="git:(%{$fg[red]%}"
|
||||
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_TIMEDOUT="%{$fg[blue]%}) %{$fg[red]%}?%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%})"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue