diff options
Diffstat (limited to 'dot-oh-my-zsh/custom/themes/spaceship-prompt/sections/git_status.zsh')
| -rw-r--r-- | dot-oh-my-zsh/custom/themes/spaceship-prompt/sections/git_status.zsh | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/dot-oh-my-zsh/custom/themes/spaceship-prompt/sections/git_status.zsh b/dot-oh-my-zsh/custom/themes/spaceship-prompt/sections/git_status.zsh new file mode 100644 index 00000000..ff346337 --- /dev/null +++ b/dot-oh-my-zsh/custom/themes/spaceship-prompt/sections/git_status.zsh @@ -0,0 +1,115 @@ +# +# Git status +# + +# ------------------------------------------------------------------------------ +# Configuration +# ------------------------------------------------------------------------------ + +SPACESHIP_GIT_STATUS_SHOW="${SPACESHIP_GIT_STATUS_SHOW=true}" +SPACESHIP_GIT_STATUS_PREFIX="${SPACESHIP_GIT_STATUS_PREFIX=" ["}" +SPACESHIP_GIT_STATUS_SUFFIX="${SPACESHIP_GIT_STATUS_SUFFIX="]"}" +SPACESHIP_GIT_STATUS_COLOR="${SPACESHIP_GIT_STATUS_COLOR="red"}" +SPACESHIP_GIT_STATUS_UNTRACKED="${SPACESHIP_GIT_STATUS_UNTRACKED="?"}" +SPACESHIP_GIT_STATUS_ADDED="${SPACESHIP_GIT_STATUS_ADDED="+"}" +SPACESHIP_GIT_STATUS_MODIFIED="${SPACESHIP_GIT_STATUS_MODIFIED="!"}" +SPACESHIP_GIT_STATUS_RENAMED="${SPACESHIP_GIT_STATUS_RENAMED="»"}" +SPACESHIP_GIT_STATUS_DELETED="${SPACESHIP_GIT_STATUS_DELETED="✘"}" +SPACESHIP_GIT_STATUS_STASHED="${SPACESHIP_GIT_STATUS_STASHED="$"}" +SPACESHIP_GIT_STATUS_UNMERGED="${SPACESHIP_GIT_STATUS_UNMERGED="="}" +SPACESHIP_GIT_STATUS_AHEAD="${SPACESHIP_GIT_STATUS_AHEAD="⇡"}" +SPACESHIP_GIT_STATUS_BEHIND="${SPACESHIP_GIT_STATUS_BEHIND="⇣"}" +SPACESHIP_GIT_STATUS_DIVERGED="${SPACESHIP_GIT_STATUS_DIVERGED="⇕"}" + +# ------------------------------------------------------------------------------ +# Section +# ------------------------------------------------------------------------------ + +# We used to depend on OMZ git library, +# But it doesn't handle many of the status indicator combinations. +# Also, It's hard to maintain external dependency. +# See PR #147 at https://git.io/vQkkB +# See git help status to know more about status formats +spaceship_git_status() { + [[ $SPACESHIP_GIT_STATUS_SHOW == false ]] && return + + spaceship::is_git || return + + local INDEX git_status="" + + INDEX=$(command git status --porcelain -b 2> /dev/null) + + # Check for untracked files + if $(echo "$INDEX" | command grep -E '^\?\? ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_UNTRACKED$git_status" + fi + + # Check for staged files + if $(echo "$INDEX" | command grep '^A[ MDAU] ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_ADDED$git_status" + elif $(echo "$INDEX" | command grep '^M[ MD] ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_ADDED$git_status" + elif $(echo "$INDEX" | command grep '^UA' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_ADDED$git_status" + fi + + # Check for modified files + if $(echo "$INDEX" | command grep '^[ MARC]M ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_MODIFIED$git_status" + fi + + # Check for renamed files + if $(echo "$INDEX" | command grep '^R[ MD] ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_RENAMED$git_status" + fi + + # Check for deleted files + if $(echo "$INDEX" | command grep '^[MARCDU ]D ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_DELETED$git_status" + elif $(echo "$INDEX" | command grep '^D[ UM] ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_DELETED$git_status" + fi + + # Check for stashes + if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then + git_status="$SPACESHIP_GIT_STATUS_STASHED$git_status" + fi + + # Check for unmerged files + if $(echo "$INDEX" | command grep '^U[UDA] ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_UNMERGED$git_status" + elif $(echo "$INDEX" | command grep '^AA ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_UNMERGED$git_status" + elif $(echo "$INDEX" | command grep '^DD ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_UNMERGED$git_status" + elif $(echo "$INDEX" | command grep '^[DA]U ' &> /dev/null); then + git_status="$SPACESHIP_GIT_STATUS_UNMERGED$git_status" + fi + + # Check whether branch is ahead + local is_ahead=false + if $(echo "$INDEX" | command grep '^## [^ ]\+ .*ahead' &> /dev/null); then + is_ahead=true + fi + + # Check whether branch is behind + local is_behind=false + if $(echo "$INDEX" | command grep '^## [^ ]\+ .*behind' &> /dev/null); then + is_behind=true + fi + + # Check wheather branch has diverged + if [[ "$is_ahead" == true && "$is_behind" == true ]]; then + git_status="$SPACESHIP_GIT_STATUS_DIVERGED$git_status" + else + [[ "$is_ahead" == true ]] && git_status="$SPACESHIP_GIT_STATUS_AHEAD$git_status" + [[ "$is_behind" == true ]] && git_status="$SPACESHIP_GIT_STATUS_BEHIND$git_status" + fi + + if [[ -n $git_status ]]; then + # Status prefixes are colorized + spaceship::section \ + "$SPACESHIP_GIT_STATUS_COLOR" \ + "$SPACESHIP_GIT_STATUS_PREFIX$git_status$SPACESHIP_GIT_STATUS_SUFFIX" + fi +} |
