aks: major rewrite with refactored colors, envar management

master
Alan Stebbens 11 years ago
parent d89b35ad7c
commit 9eddd83375
  1. 221
      gitprompt.sh

@ -22,92 +22,107 @@ function git_prompt_dir()
fi fi
} }
# 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" && return 0
gp_maybe_set_envar_to_path "$envar" "$HOME/$file" && return 0
gp_maybe_set_envar_to_path "$envar" "$HOME/lib/$file" && return 0
git_prompt_dir
gp_maybe_set_envar_to_path "$envar" "$__GIT_PROMPT_DIR/$file" && return 0
gp_maybe_set_envar_to_path "$envar" "${0##*/}/$file" && return 0
fi
return 1
}
# gp_maybe_set_envar_to_path ENVAR FILEPATH
#
# return 0 (true) if FILEPATH is readable, set ENVAR to it
# return 1 (false) if not
function gp_maybe_set_envar_to_path(){
local envar="$1"
local file="$2"
if [[ -r "$file" ]]; then
eval "$envar=\"$file\""
return 0
fi
return 1
}
function git_prompt_config() 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 # There are two files related to colors:
local IntenseBlack="\[\033[0;90m\]" # Grey #
# 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
# Bold High Intensty if gp_set_file_var __PROMPT_COLORS_SH prompt-colors.sh ; then
local Magenta="\[\033[1;95m\]" # Purple
# Regular Colors if [[ -n "${__PROMPT_COLORS_SH}" ]]; then
local Yellow="\[\033[0;33m\]" source "${__PROMPT_COLORS_SH}" # outsource the color defs
local White='\[\033[37m\]' else
local Red="\[\033[0;31m\]" echo 1>&2 "Cannot find prompt-colors.sh!"
local Blue="\[\033[0;34m\]" fi
local Cyan="\[\033[0;36m\]" fi
# source the user's ~/.git-prompt-colors.sh file, or the one that should be # source the user's ~/.git-prompt-colors.sh file, or the one that should be
# sitting in the same directory as this script # sitting in the same directory as this script
if [[ -z "$__GIT_PROMPT_COLORS_FILE" ]]; then if gp_set_file_var __GIT_PROMPT_COLORS_FILE git-prompt-colors.sh ; then
local pfx file dir
for dir in "$HOME" "$__GIT_PROMPT_DIR" ; do # if the envar is defined, source the file for custom colors
for pfx in '.' '' ; do if [[ -n "${__GIT_PROMPT_COLORS_FILE}" ]]; then
file="$dir/${pfx}git-prompt-colors.sh" source "${__GIT_PROMPT_COLORS_FILE}"
if [[ -f "$file" ]]; then else
__GIT_PROMPT_COLORS_FILE="$file" echo 1>&2 "Cannot find git-prompt-colors.sh!"
break 2 fi
fi
done
done
fi
# 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}"
fi fi
# Various variables you might want for your PS1 prompt instead # Do this only once to define PROMPT_START and PROMPT_END
local Time12a="\$(date +%H:%M)"
# local Time12a="(\$(date +%H:%M:%S))"
# local Time12a="(\@))"
local PathShort="\w"
if [ "x${GIT_PROMPT_START}" == "x" ]; then if [[ -z "$PROMPT_START" || -z "$PROMPT_END" ]]; then
PROMPT_START="${Yellow}${PathShort}${ResetColor}"
else
PROMPT_START="${GIT_PROMPT_START}"
fi
if [ "x${GIT_PROMPT_END}" == "x" ]; then # Various variables you might want for your PS1 prompt instead
PROMPT_END=" \n${White}${Time12a}${ResetColor} $ " local Time12a="\$(date +%H:%M)"
else # local Time12a="(\$(date +%H:%M:%S))"
PROMPT_END="${GIT_PROMPT_END}" # local Time12a="(\@))"
local PathShort="\w"
if [[ -z "${GIT_PROMPT_START}" ]] ; then
PROMPT_START="${Yellow}${PathShort}${ResetColor}"
else
PROMPT_START="${GIT_PROMPT_START}"
fi
if [[ -z "${GIT_PROMPT_END}" ]] ; then
PROMPT_END=" \n${White}${Time12a}${ResetColor} $ "
else
PROMPT_END="${GIT_PROMPT_END}"
fi
fi fi
EMPTY_PROMPT="${PROMPT_START}$($prompt_callback)${PROMPT_END}" EMPTY_PROMPT="${PROMPT_START}$($prompt_callback)${PROMPT_END}"
# fetch remote revisions every other $GIT_PROMPT_FETCH_TIMEOUT (default 5) minutes # fetch remote revisions every other $GIT_PROMPT_FETCH_TIMEOUT (default 5) minutes
GIT_PROMPT_FETCH_TIMEOUT=${1-5} GIT_PROMPT_FETCH_TIMEOUT=${1-5}
if [ "x$__GIT_STATUS_CMD" == "x" ] if [[ -z "$__GIT_STATUS_CMD" ]] ; then # if GIT_STATUS_CMD not defined..
then
git_prompt_dir git_prompt_dir
local sfx file local sfx file
# look first for a '.sh' version, then use the python version # look first for a '.sh' version, then use the python version
for sfx in sh py ; do for sfx in sh py ; do
file="${__GIT_PROMPT_DIR}/gitstatus.$sfx" file="$__GIT_PROMPT_DIR/gitstatus.$sfx"
if [[ -x "$file" ]]; then if [[ -x "$file" ]]; then
__GIT_STATUS_CMD="$file" __GIT_STATUS_CMD="$file"
break break
@ -151,23 +166,9 @@ function checkUpstream() {
} }
function updatePrompt() { 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 PROMPT_START local PROMPT_START
local PROMPT_END local PROMPT_END
local EMPTY_PROMPT local EMPTY_PROMPT
local ResetColor
local Blue
local GIT_PROMPT_FETCH_TIMEOUT
local __GIT_STATUS_CMD local __GIT_STATUS_CMD
git_prompt_config git_prompt_config
@ -190,37 +191,43 @@ function updatePrompt() {
if [[ -n "${GitStatus}" ]]; then if [[ -n "${GitStatus}" ]]; then
local STATUS=" ${GIT_PROMPT_PREFIX}${GIT_PROMPT_BRANCH}${GIT_BRANCH}${ResetColor}" local STATUS=" ${GIT_PROMPT_PREFIX}${GIT_PROMPT_BRANCH}${GIT_BRANCH}${ResetColor}"
if [[ -n "${GIT_REMOTE}" ]]; then # __add_status KIND VALEXPR INSERT
STATUS="${STATUS}${GIT_PROMPT_REMOTE}${GIT_REMOTE}${ResetColor}" # eg: __add_status 'STAGED' '-ne 0'
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}"
__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="${PROMPT_START}$($prompt_callback)${STATUS}${PROMPT_END}" PS1="${PROMPT_START}$($prompt_callback)${STATUS}${PROMPT_END}"
if [[ -n "${VIRTUAL_ENV}" ]]; then if [[ -n "${VIRTUAL_ENV}" ]]; then

Loading…
Cancel
Save