110 lines
4.4 KiB
Bash
110 lines
4.4 KiB
Bash
#
|
|
# Git status
|
|
#
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Configuration
|
|
# ------------------------------------------------------------------------------
|
|
|
|
SPACESHIP_GIT_STATUS_SHOW="${SPACESHIP_GIT_STATUS_SHOW=true}"
|
|
SPACESHIP_GIT_STATUS_ASYNC="${SPACESHIP_GIT_STATUS_ASYNC=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_branch="$vcs_info_msg_0_" 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 ahead=$(command git rev-list --count ${git_branch}@{upstream}..HEAD 2>/dev/null)
|
|
local behind=$(command git rev-list --count HEAD..${git_branch}@{upstream} 2>/dev/null)
|
|
|
|
# Check wheather branch has diverged
|
|
if (( $ahead )) && (( $behind )); then
|
|
git_status="$SPACESHIP_GIT_STATUS_DIVERGED$git_status"
|
|
elif (( $ahead )); then
|
|
git_status="$SPACESHIP_GIT_STATUS_AHEAD$git_status"
|
|
elif (( $behind )); then
|
|
git_status="$SPACESHIP_GIT_STATUS_BEHIND$git_status"
|
|
fi
|
|
|
|
if [[ -n $git_status ]]; then
|
|
# Status prefixes are colorized
|
|
spaceship::section \
|
|
--color "$SPACESHIP_GIT_STATUS_COLOR" \
|
|
"$SPACESHIP_GIT_STATUS_PREFIX$git_status$SPACESHIP_GIT_STATUS_SUFFIX"
|
|
fi
|
|
}
|