diff --git a/gitprompt.sh b/gitprompt.sh index d5c2c44..ac194da 100644 --- a/gitprompt.sh +++ b/gitprompt.sh @@ -1,121 +1,138 @@ -if [ "x$__GIT_STATUS_CMD" == "x" ] -then - __GIT_STATUS_CMD=~/.bash/gitstatus.py -fi - -# Colors -# Reset -ResetColor="\[\033[0m\]" # Text Reset - -# fetch remote revisions every other $GIT_PROMPT_FETCH_TIMEOUT (default 5) minutes -GIT_PROMPT_FETCH_TIMEOUT=${1-5} - -# Regular Colors -Red="\[\033[0;31m\]" # Red -Yellow="\[\033[0;33m\]" # Yellow -Blue="\[\033[0;34m\]" # Blue -WHITE='\[\033[37m\]' - -# Bold -BGreen="\[\033[1;32m\]" # Green - -# High Intensty -IBlack="\[\033[0;90m\]" # Black - -# Bold High Intensty -Magenta="\[\033[1;95m\]" # Purple - -# Various variables you might want for your PS1 prompt instead -Time12a="\@" -PathShort="\w" - -# Default values for the appearance of the prompt. Configure at will. -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="…" -GIT_PROMPT_CLEAN="${BGreen}✔" - -PROMPT_START="$Yellow$PathShort$ResetColor" -PROMPT_END=" \n$WHITE$Time12a$ResetColor $ " - - -function update_current_git_vars() { - unset __CURRENT_GIT_STATUS - - _GIT_STATUS=$(python $__GIT_STATUS_CMD) - __CURRENT_GIT_STATUS=($_GIT_STATUS) - GIT_BRANCH=${__CURRENT_GIT_STATUS[0]} - GIT_REMOTE=${__CURRENT_GIT_STATUS[1]} - if [[ "." == "$GIT_REMOTE" ]]; then - unset GIT_REMOTE - fi - GIT_STAGED=${__CURRENT_GIT_STATUS[2]} - GIT_CONFLICTS=${__CURRENT_GIT_STATUS[3]} - GIT_CHANGED=${__CURRENT_GIT_STATUS[4]} - GIT_UNTRACKED=${__CURRENT_GIT_STATUS[5]} - GIT_CLEAN=${__CURRENT_GIT_STATUS[6]} +#!/bin/sh + +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 + + # Bold High Intensty + local Magenta="\[\033[1;95m\]" # Purple + + # Regular Colors + local Yellow="\[\033[0;33m\]" + local White='\[\033[37m\]' + local Red="\[\033[0;31m\]" + Blue="\[\033[0;34m\]" + + # Default values for the appearance of the prompt. Configure at will. + 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="…" + GIT_PROMPT_CLEAN="${BoldGreen}✔" + + # Various variables you might want for your PS1 prompt instead + local Time12a="\@" + local PathShort="\w" + + PROMPT_START="${Yellow}${PathShort}${ResetColor}" + PROMPT_END=" \n${White}${Time12a}${ResetColor} $ " + + EMPTY_PROMPT="${PROMPT_START}${PROMPT_END}" + + # 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 + __GIT_STATUS_CMD="${__GIT_PROMPT_DIR:-${HOME}/.bash}/gitstatus.py" + fi } function setGitPrompt() { - repo=`git rev-parse --show-toplevel 2> /dev/null` - if [[ ! -e $repo ]]; then - PS1="$PROMPT_START$PROMPT_END" + + 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_CLEAN + local PROMPT_START + local PROMPT_END + local EMPTY_PROMPT + local ResetColor + local Blue + local GIT_PROMPT_FETCH_TIMEOUT + local __GIT_STATUS_CMD + + git_prompt_config + + local repo=`git rev-parse --show-toplevel 2> /dev/null` + if [[ ! -e "${repo}" ]]; then + PS1="${EMPTY_PROMPT}" return fi - FETCH_HEAD=$repo/.git/FETCH_HEAD + local FETCH_HEAD="${repo}/.git/FETCH_HEAD" # Fech repo if local is stale for more than $GIT_FETCH_TIMEOUT minutes - if [[ ! -e $FETCH_HEAD || -e `find $FETCH_HEAD -mmin +$GIT_PROMPT_FETCH_TIMEOUT` ]] + if [[ ! -e "${FETCH_HEAD}" || -e `find ${FETCH_HEAD} -mmin +${GIT_PROMPT_FETCH_TIMEOUT}` ]] then git fetch --quiet fi - update_current_git_vars - set_virtualenv - - if [ -n "$__CURRENT_GIT_STATUS" ]; then - STATUS=" $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_CLEAN" -eq "1" ]; then - STATUS="$STATUS$GIT_PROMPT_CLEAN" - fi - STATUS="$STATUS$ResetColor$GIT_PROMPT_SUFFIX" - - PS1="$PYTHON_VIRTUALENV$PROMPT_START$STATUS$PROMPT_END" - else - PS1="$PROMPT_START$PROMPT_END" - fi -} -# Determine active Python virtualenv details. -function set_virtualenv () { - if test -z "$VIRTUAL_ENV" ; then - PYTHON_VIRTUALENV="" + local -a GitStatus + GitStatus=($("${__GIT_STATUS_CMD}" 2>/dev/null)) + + local GIT_BRANCH=${GitStatus[0]} + local GIT_REMOTE=${GitStatus[1]} + if [[ "." == "$GIT_REMOTE" ]]; then + unset GIT_REMOTE + fi + local GIT_STAGED=${GitStatus[2]} + local GIT_CONFLICTS=${GitStatus[3]} + local GIT_CHANGED=${GitStatus[4]} + local GIT_UNTRACKED=${GitStatus[5]} + local GIT_CLEAN=${GitStatus[6]} + + if [[ -n "${GitStatus}" ]]; then + local STATUS=" ${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_CLEAN}" -eq "1" ]; then + STATUS="${STATUS}${GIT_PROMPT_CLEAN}" + fi + STATUS="${STATUS}${ResetColor}${GIT_PROMPT_SUFFIX}" + + + PS1="${PROMPT_START}${STATUS}${PROMPT_END}" + if [[ -n "${VIRTUAL_ENV}" ]]; then + PS1="${Blue}($(basename "${VIRTUAL_ENV}"))${ResetColor} ${PS1}" + fi + else - PYTHON_VIRTUALENV="${BLUE}(`basename \"$VIRTUAL_ENV\"`)${ResetColor} " + PS1="${EMPTY_PROMPT}" fi }