# # 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 }