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() {
|
parse_git_dirty() {
|
||||||
local STATUS=''
|
local STATUS=''
|
||||||
local FLAGS
|
local FLAGS
|
||||||
|
local COPID=''
|
||||||
FLAGS=('--porcelain')
|
FLAGS=('--porcelain')
|
||||||
if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then
|
if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then
|
||||||
if [[ $POST_1_7_2_GIT -gt 0 ]]; then
|
if [[ $POST_1_7_2_GIT -gt 0 ]]; then
|
||||||
|
|
@ -20,12 +21,21 @@ parse_git_dirty() {
|
||||||
if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" == "true" ]]; then
|
if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" == "true" ]]; then
|
||||||
FLAGS+='--untracked-files=no'
|
FLAGS+='--untracked-files=no'
|
||||||
fi
|
fi
|
||||||
STATUS=$(command git status ${FLAGS} 2> /dev/null | tail -n1)
|
# Use coproc to timebox `git status` so slow repo access doesn't hang the prompt
|
||||||
fi
|
# Use dummy "xxx" to distinguish timeouts from empty output
|
||||||
if [[ -n $STATUS ]]; then
|
local END_OUTPUT="_end_of_status_"
|
||||||
echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
|
coproc (command git status ${FLAGS} 2> /dev/null; echo $END_OUTPUT)
|
||||||
else
|
COPID=$!
|
||||||
echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
|
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
|
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_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_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_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
|
# Setup the prompt with pretty colors
|
||||||
setopt prompt_subst
|
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_PREFIX="git:(%{$fg[red]%}"
|
||||||
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
|
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
|
||||||
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗%{$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]%})"
|
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%})"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue