diff --git a/gitprompt.sh b/gitprompt.sh index 262bec1..1dab935 100755 --- a/gitprompt.sh +++ b/gitprompt.sh @@ -22,115 +22,106 @@ function git_prompt_dir() fi } -function git_prompt_config() -{ - # Colors - ResetColor="\[\033[0m\]" # Text reset - - # Bold - local BoldGreen="\[\033[1;32m\]" # Green - local BoldBlue="\[\033[1;34m\]" # Blue - - # High Intensty - local IntenseBlack="\[\033[0;90m\]" # Grey +# gp_set_file_var ENVAR SOMEFILE +# +# Set ENVAR to the path to SOMEFILE, based on $HOME, $__GIT_PROMPT_DIR, and the +# directory of the current script. The SOMEFILE can be prefixed with '.', or +# not. +# +# Return 0 (success) if ENVAR not already defined, 1 (failure) otherwise. + +function gp_set_file_var() { + local envar="$1" + local file="$2" + if eval "test -z \"\$$envar\"" ; then + eval "$envar=" # set empty envar + gp_maybe_set_envar_to_path "$envar" "$HOME/.$file" "$HOME/$file" "$HOME/lib/$file" && return 0 + git_prompt_dir + gp_maybe_set_envar_to_path "$envar" "$__GIT_PROMPT_DIR/$file" "${0##*/}/$file" && return 0 + fi + return 1 +} - # Bold High Intensty - local Magenta="\[\033[1;95m\]" # Purple +# gp_maybe_set_envar_to_path ENVAR FILEPATH ... +# +# return 0 (true) if any FILEPATH is readable, set ENVAR to it +# return 1 (false) if not + +function gp_maybe_set_envar_to_path(){ + local envar="$1" + shift + local file + for file in "$@" ; do + if [[ -r "$file" ]]; then + eval "$envar=\"$file\"" + return 0 + fi + done + return 1 +} - # Regular Colors - local Yellow="\[\033[0;33m\]" - local White='\[\033[37m\]' - local Red="\[\033[0;31m\]" - local Blue="\[\033[0;34m\]" - local Cyan="\[\033[0;36m\]" - local Green="\[\033[0;32m\]" +function git_prompt_config() +{ #Checking if root to change output _isroot=false [[ $UID -eq 0 ]] && _isroot=true + # There are two files related to colors: + # + # prompt-colors.sh -- sets generic color names suitable for bash `PS1` prompt + # git-prompt-colors.sh -- sets the GIT_PROMPT color scheme, using names from prompt-colors.sh + + if gp_set_file_var __PROMPT_COLORS_SH prompt-colors.sh ; then + if [[ -n "${__PROMPT_COLORS_SH}" ]]; then + source "${__PROMPT_COLORS_SH}" # outsource the color defs + else + echo 1>&2 "Cannot find prompt-colors.sh!" + fi + fi + # source the user's ~/.git-prompt-colors.sh file, or the one that should be # sitting in the same directory as this script - if [[ -z "$__GIT_PROMPT_COLORS_FILE" ]]; then - local pfx file dir - for dir in "$HOME" "$__GIT_PROMPT_DIR" ; do - for pfx in '.' '' ; do - file="$dir/${pfx}git-prompt-colors.sh" - if [[ -f "$file" ]]; then - __GIT_PROMPT_COLORS_FILE="$file" - break 2 - fi - done - done + if gp_set_file_var __GIT_PROMPT_COLORS_FILE git-prompt-colors.sh ; then + + # if the envar is defined, source the file for custom colors + if [[ -n "${__GIT_PROMPT_COLORS_FILE}" ]]; then + source "${__GIT_PROMPT_COLORS_FILE}" + else + echo 1>&2 "Cannot find git-prompt-colors.sh!" + fi fi - # Various variables you might want for your PS1 prompt instead - local Time12a="\$(date +%H:%M)" - # local Time12a="(\$(date +%H:%M:%S))" - # local Time12a="(\@))" - local PathShort="\w" + # Do this only once to define PROMPT_START and PROMPT_END - # if the envar is defined, source the file for custom colors - if [[ -n "$__GIT_PROMPT_COLORS_FILE" && -f "$__GIT_PROMPT_COLORS_FILE" ]]; then - source "$__GIT_PROMPT_COLORS_FILE" - else - # Default values for the appearance of the prompt. Do not change these - # below. Instead, copy these to `~/.git-prompt-colors.sh` and change them - # there. - GIT_PROMPT_PREFIX="[" - GIT_PROMPT_SUFFIX="]" - GIT_PROMPT_SEPARATOR="|" - GIT_PROMPT_BRANCH="${Magenta}" - GIT_PROMPT_STAGED="${Red}●" - GIT_PROMPT_CONFLICTS="${Red}✖" - GIT_PROMPT_CHANGED="${Blue}✚" - GIT_PROMPT_REMOTE=" " - GIT_PROMPT_UNTRACKED="${Cyan}…" - GIT_PROMPT_STASHED="${BoldBlue}⚑" - GIT_PROMPT_CLEAN="${BoldGreen}✔" - GIT_PROMPT_COMMAND_OK="${Green}✔ " - GIT_PROMPT_COMMAND_FAIL="${Red}✘ " - - GIT_PROMPT_START_USER="${Yellow}${PathShort}${ResetColor}" - GIT_PROMPT_START_ROOT="${Yellow}${PathShort}${ResetColor}" - GIT_PROMPT_END_USER=" \n${White}${Time12a}${ResetColor} $ " - GIT_PROMPT_END_ROOT=" \n${White}${Time12a}${ResetColor} # " - - # Please do not add colors to these symbols - GIT_PROMPT_SYMBOLS_AHEAD="↑·" - GIT_PROMPT_SYMBOLS_BEHIND="↓·" - GIT_PROMPT_SYMBOLS_PREHASH=":" - fi + if [[ -z "$PROMPT_START" || -z "$PROMPT_END" ]]; then - if [ "x${GIT_PROMPT_SHOW_LAST_COMMAND_INDICATOR}" == "x1" ]; then - if [ $LAST_COMMAND_STATE = 0 ]; then - LAST_COMMAND_INDICATOR="${GIT_PROMPT_COMMAND_OK}"; - else - LAST_COMMAND_INDICATOR="${GIT_PROMPT_COMMAND_FAIL}"; - fi - fi + # Various variables you might want for your PS1 prompt instead + local Time12a="\$(date +%H:%M)" + # local Time12a="(\$(date +%H:%M:%S))" + # local Time12a="(\@))" + local PathShort="\w" - if [ "x${GIT_PROMPT_START}" == "x" ]; then - #First statment is for non root behavior second for root - if $_isroot; then - PROMPT_START="${GIT_PROMPT_START_ROOT}" + if [[ -z "${GIT_PROMPT_START}" ]] ; then + if $_isroot; then + PROMPT_START="$GIT_PROMPT_START_ROOT" + else + PROMPT_START="$GIT_PROMPT_START_USER" + fi else - PROMPT_START="${GIT_PROMPT_START_USER}" + PROMPT_START="${GIT_PROMPT_START}" fi - else - PROMPT_START="${GIT_PROMPT_START}" - fi - if [ "x${GIT_PROMPT_END}" == "x" ]; then - #First statment is for non root behavior second for root - if ! $_isroot; then - PROMPT_END="${GIT_PROMPT_END_USER}" + if [[ -z "${GIT_PROMPT_END}" ]] ; then + if $_isroot; then + PROMPT_END="$GIT_PROMPT_END_ROOT" + else + PROMPT_END="$GIT_PROMPT_END_USER" + fi else - PROMPT_END="${GIT_PROMPT_END_ROOT}" + PROMPT_END="${GIT_PROMPT_END}" fi - else - PROMPT_END="${GIT_PROMPT_END}" fi # set GIT_PROMPT_LEADING_SPACE to 0 if you want to have no leading space in front of the GIT prompt @@ -154,18 +145,11 @@ function git_prompt_config() # fetch remote revisions every other $GIT_PROMPT_FETCH_TIMEOUT (default 5) minutes GIT_PROMPT_FETCH_TIMEOUT=${1-5} - if [ "x$__GIT_STATUS_CMD" == "x" ] - then + if [[ -z "$__GIT_STATUS_CMD" ]] ; then # if GIT_STATUS_CMD not defined.. git_prompt_dir - local sfx file - # look first for a '.sh' version, then use the python version - for sfx in sh py ; do - file="${__GIT_PROMPT_DIR}/gitstatus.$sfx" - if [[ -x "$file" ]]; then - __GIT_STATUS_CMD="$file" - break - fi - done + if ! gp_maybe_set_envar_to_path __GIT_STATUS_CMD "$__GIT_PROMPT_DIR/gitstatus.sh" "$__GIT_PROMPT_DIR/gitstatus.py" ; then + echo 1>&2 "Cannot find gitstatus.sh or gitstatus.py!" + fi fi } @@ -217,17 +201,6 @@ function checkUpstream() { } function updatePrompt() { - local GIT_PROMPT_PREFIX - local GIT_PROMPT_SUFFIX - local GIT_PROMPT_SEPARATOR - local GIT_PROMPT_BRANCH - local GIT_PROMPT_STAGED - local GIT_PROMPT_CONFLICTS - local GIT_PROMPT_CHANGED - local GIT_PROMPT_REMOTE - local GIT_PROMPT_UNTRACKED - local GIT_PROMPT_STASHED - local GIT_PROMPT_CLEAN local LAST_COMMAND_INDICATOR local PROMPT_LEADING_SPACE local PROMPT_START @@ -257,37 +230,43 @@ function updatePrompt() { if [[ -n "${GitStatus}" ]]; then local STATUS="${PROMPT_LEADING_SPACE}${GIT_PROMPT_PREFIX}${GIT_PROMPT_BRANCH}${GIT_BRANCH}${ResetColor}" - if [[ -n "${GIT_REMOTE}" ]]; then - STATUS="${STATUS}${GIT_PROMPT_REMOTE}${GIT_REMOTE}${ResetColor}" - fi - - STATUS="${STATUS}${GIT_PROMPT_SEPARATOR}" - if [ "${GIT_STAGED}" -ne "0" ]; then - STATUS="${STATUS}${GIT_PROMPT_STAGED}${GIT_STAGED}${ResetColor}" - fi - - if [ "${GIT_CONFLICTS}" -ne "0" ]; then - STATUS="${STATUS}${GIT_PROMPT_CONFLICTS}${GIT_CONFLICTS}${ResetColor}" - fi - - if [ "${GIT_CHANGED}" -ne "0" ]; then - STATUS="${STATUS}${GIT_PROMPT_CHANGED}${GIT_CHANGED}${ResetColor}" - fi - - if [ "${GIT_UNTRACKED}" -ne "0" ]; then - STATUS="${STATUS}${GIT_PROMPT_UNTRACKED}${GIT_UNTRACKED}${ResetColor}" - fi - - if [ "${GIT_STASHED}" -ne "0" ]; then - STATUS="${STATUS}${GIT_PROMPT_STASHED}${GIT_STASHED}${ResetColor}" - fi - - if [ "${GIT_CLEAN}" -eq "1" ]; then - STATUS="${STATUS}${GIT_PROMPT_CLEAN}" - fi - - STATUS="${STATUS}${ResetColor}${GIT_PROMPT_SUFFIX}" + # __add_status KIND VALEXPR INSERT + # eg: __add_status 'STAGED' '-ne 0' + __chk_gitvar_status() { + local v + if [[ "x$2" == "x-n" ]] ; then + v="$2 \"\${GIT_$1}\"" + else + v="\${GIT_$1} $2" + fi + if eval "test $v" ; then + if [[ $# -lt 2 || "$3" != '-' ]]; then + __add_status "\${GIT_PROMPT_$1}\${GIT_$1}\${ResetColor}" + else + __add_status "\${GIT_PROMPT_$1}\${ResetColor}" + fi + fi + } + + __add_gitvar_status() { + __add_status "\${GIT_PROMPT_$1}\${GIT_$1}\${ResetColor}" + } + + # __add_status SOMETEXT + __add_status() { + eval "STATUS=\"${STATUS}$1\"" + } + + __chk_gitvar_status 'REMOTE' '-n' + __add_status "$GIT_PROMPT_SEPARATOR" + __chk_gitvar_status 'STAGED' '-ne 0' + __chk_gitvar_status 'CONFLICTS' '-ne 0' + __chk_gitvar_status 'CHANGED' '-ne 0' + __chk_gitvar_status 'UNTRACKED' '-ne 0' + __chk_gitvar_status 'STASHED' '-ne 0' + __chk_gitvar_status 'CLEAN' '-eq 1' - + __add_status "${ResetColor}$GIT_PROMPT_SUFFIX" PS1="${LAST_COMMAND_INDICATOR}${PROMPT_START}$($prompt_callback)${STATUS}${PROMPT_END}" if [[ -n "${VIRTUAL_ENV}" ]]; then