Merge pull request #68 from aks/master

Refactored out color defs & assignments; other optimizations.
master
Martin Gondermann 11 years ago
commit 926c441b26
  1. 63
      README.md
  2. 20
      git-prompt-colors.sh
  3. 14
      git-prompt-help.sh
  4. 261
      gitprompt.sh
  5. 0
      newfile.txt
  6. 82
      prompt-colors.sh

@ -9,7 +9,7 @@ staged, changed, etc.
(an original idea from this [blog post][]).
`gitstatus.sh` added by [AKS](http://github.com/aks).
`gitstatus.sh` and `git-prompt-help.sh` added by [AKS](http://github.com/aks).
## Examples
@ -49,9 +49,13 @@ The symbols are as follows:
## Install
- Clone this repository to your homedir
e.g. ``git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt``
- Source the file ``gitprompt.sh`` from your ``~/.bashrc`` config file:
1. Clone this repository to your home directory.
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt
2. Source the file `gitprompt.sh` from `~/.bashrc`
3. `cd` to a git repository and test it!
```sh
# some other config in .bashrc
@ -61,28 +65,40 @@ The symbols are as follows:
# Set config variables first
GIT_PROMPT_ONLY_IN_REPO=1
# GIT_PROMPT_FETCH_REMOTE_STATUS=0 # uncomment to avoid fetching remote status
# GIT_PROMPT_START=... # uncomment for custom prompt start sequence
# GIT_PROMPT_END=... # uncomment for custom prompt end sequence
# as last entry source the gitprompt script
source ~/.bash-git-prompt/gitprompt.sh
```
- Go in a git repository and test it!
## Configuration
- You can define `GIT_PROMPT_START` and `GIT_PROMPT_END` to tweak your prompt.
- The default colors and some variables for tweaking the prompt are defined
within ``gitprompt.sh``, but may be overridden by copying ``git-prompt-colors.sh``
to your home directory at ``~/.git-prompt-colors.sh``. This file may also be found in the same
directory as ``gitprompt.sh``, but without the leading ``.``.
- The default colors are defined within `prompt-colors.sh`, which is sourced by
`gitprompt.sh`. The colors used for various git status are defined in
`git-prompt-colors.sh`. Both of these files may be overridden by copying
them to $HOME with a `.` prefix. They can also be placed in `$HOME/lib`
without the leading `.`. The defaults are the original files in the
`~/.bash-git-prompt` directory.
- You can use ``GIT_PROMPT_START_USER``, ``GIT_PROMPT_START_ROOT``, ``GIT_PROMPT_END_USER`` and ``GIT_PROMPT_END_ROOT`` in your ``.git-prompt-colors.sh`` to tweak your prompt. You can also override the start and end of the prompt by setting ``GIT_PROMPT_START`` and ``GIT_PROMPT_END`` before you source the ``gitprompt.sh``
- You can use `GIT_PROMPT_START_USER`, `GIT_PROMPT_START_ROOT`,
`GIT_PROMPT_END_USER` and `GIT_PROMPT_END_ROOT` in your
`.git-prompt-colors.sh` to tweak your prompt. You can also override the start
and end of the prompt by setting `GIT_PROMPT_START` and `GIT_PROMPT_END`
before you source the `gitprompt.sh`.
- The current git repo information is obtained by the script `gitstatus.sh` or
`gitstatus.py`. Both scripts do the same thing, but the bash script is a
tad more quick, and is used by default. If you prefer the python script
(possibly because you have enhanced it), simply delete or change the name of
``gitstatus.sh``.
`gitstatus.py`. Both scripts do the same thing, but the bash script is a tad
more quick, and is used by default. If you prefer the python script
(possibly because you have enhanced it), simply delete or change the name of
`gitstatus.sh`.
- You can define `prompt_callback` function to tweak your prompt dynamically.
- You can define ``prompt_callback`` function to tweak your prompt dynamically.
```sh
function prompt_callback {
if [ `jobs | wc -l` -ne 0 ]; then
@ -91,19 +107,26 @@ function prompt_callback {
}
```
- If you want to show the git prompt only, if you are in a git repository you can set ``GIT_PROMPT_ONLY_IN_REPO=1`` before sourcing the gitprompt script
- If you want to show the git prompt only if you are in a git repository you
can set ``GIT_PROMPT_ONLY_IN_REPO=1`` before sourcing the gitprompt script
- You can show an additional indicator at the start of the prompt, which shows the result of the last executed command by setting ``GIT_PROMPT_SHOW_LAST_COMMAND_INDICATOR=1`` before sourcing the gitprompt script
- You can show an additional indicator at the start of the prompt, which shows
the result of the last executed command by setting
``GIT_PROMPT_SHOW_LAST_COMMAND_INDICATOR=1`` before sourcing the gitprompt
script
- It is now possible to disable the fetching of the remote repository either globally by setting ``GIT_PROMPT_FETCH_REMOTE_STATUS=0`` in your .bashrc or
on a per repository basis by creating a file named ``.bash-git-rc`` with the content ``FETCH_REMOTE_STATUS=0`` in the root of your git repository.
- It is now possible to disable the fetching of the remote repository either
globally by setting ``GIT_PROMPT_FETCH_REMOTE_STATUS=0`` in your .bashrc or
on a per repository basis by creating a file named ``.bash-git-rc`` with the
content ``FETCH_REMOTE_STATUS=0`` in the root of your git repository.
- You can get help on the git prompt with the function ``git_prompt_help``.
Examples are available with ``git_prompt_examples``.
Examples are available with ``git_prompt_examples``.
**Enjoy!**
## Alternative RPM Install
This project ships an RPM spec to simplify installation on RHEL and
clones. If you wish to install from RPM, you may first build the RPM
from scratch by following this procedure:

@ -1,3 +1,17 @@
# These are the color definitions used by gitprompt.sh
declare -g GIT_PROMPT_PREFIX
declare -g GIT_PROMPT_SUFFIX
declare -g GIT_PROMPT_SEPARATOR
declare -g GIT_PROMPT_BRANCH
declare -g GIT_PROMPT_STAGED
declare -g GIT_PROMPT_CONFLICTS
declare -g GIT_PROMPT_CHANGED
declare -g GIT_PROMPT_REMOTE
declare -g GIT_PROMPT_UNTRACKED
declare -g GIT_PROMPT_STASHED
declare -g GIT_PROMPT_CLEAN
local Time12a="\$(date +%H:%M)"
local PathShort="\w"
@ -8,12 +22,12 @@ GIT_PROMPT_SEPARATOR="|" # separates each item
GIT_PROMPT_BRANCH="${Magenta}" # the git branch that is active in the current directory
GIT_PROMPT_STAGED="${Red}" # the number of staged files/directories
GIT_PROMPT_CONFLICTS="${Red}" # the number of files in conflict
GIT_PROMPT_CHANGED="${Blue}" # the number of changed files
GIT_PROMPT_CONFLICTS="${Red} " # the number of files in conflict
GIT_PROMPT_CHANGED="${Blue} " # the number of changed files
GIT_PROMPT_REMOTE=" " # the remote branch name (if any) and the symbols for ahead and behind
GIT_PROMPT_UNTRACKED="${Cyan}" # the number of untracked files/dirs
GIT_PROMPT_STASHED="${BoldBlue}" # the number of stashed files/dir
GIT_PROMPT_STASHED="${BoldBlue} " # the number of stashed files/dir
GIT_PROMPT_CLEAN="${BoldGreen}" # a colored flag indicating a "clean" repo
GIT_PROMPT_COMMAND_OK="${Green}" # indicator if the last command returned with an exit code of 0

@ -3,6 +3,8 @@
# being displayed.
git_prompt_help() {
source prompt-colors.sh
source git-prompt-colors.sh
cat <<EOF | sed 's/\\\[\\033//g' | sed 's/\\\]//g'
The git prompt format is [<BRANCH><TRACKING>|<LOCALSTATUS>]
@ -18,12 +20,12 @@ remote branch. It can be empty, or one of:
LOCALSTATUS is one of the following:
${GIT_PROMPT_CLEAN}${ResetColor} - repository clean
${GIT_PROMPT_STAGED}N${ResetColor} - N staged files
${GIT_PROMPT_CONFLICTS}N${ResetColor} - N conflicted files
${GIT_PROMPT_CHANGED}N${ResetColor} - N changed but *unstaged* files
${GIT_PROMPT_UNTRACKED}N${ResetColor} - N untracked files
${GIT_PROMPT_STASHED}N${ResetColor} - N stash entries
${GIT_PROMPT_CLEAN}${ResetColor} - repository clean
${GIT_PROMPT_STAGED} N${ResetColor} - N staged files
${GIT_PROMPT_CONFLICTS} N${ResetColor} - N conflicted files
${GIT_PROMPT_CHANGED} N${ResetColor} - N changed but *unstaged* files
${GIT_PROMPT_UNTRACKED} N${ResetColor} - N untracked files
${GIT_PROMPT_STASHED} N${ResetColor} - N stash entries
See "git_prompt_examples" for examples.
EOF

@ -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

@ -0,0 +1,82 @@
# prompt-colors.sh
#
# source this file to get color definitions
# if $debug or $verbose is set, the definitions
# are also printed to STDERR.
define_color_names() {
ColorNames=( Black Red Green Yellow Blue Magneta Cyan White )
FgColors=( 30 31 32 33 34 35 36 37 )
BgColors=( 40 41 42 43 44 45 46 47 )
local AttrNorm=0
local AttrBright=1
local AttrDim=2
local AttrUnder=4
local AttrBlink=5
local AttrRev=7
local AttrHide=8
# define "BoldCOLOR", "BrightCOLOR", and "DimCOLOR" names
# _map_colors ATTRNAME ATTRVALUE
#
# Defines three names for every color, attribute combintaion:
# {ATTRNAME}{COLORNAME}
# {ATTRNAME}{COLORNAME}Fg
# {ATTRNAME}{COLORNAME}Bg
#
# Example: BoldRed, BoldRedFg, BoldRedBg
_map_colors() {
local x=0
local attrname="$1"
local attrcode=$2
while (( x < 8 )) ; do
local colorname=${ColorNames[x]}
local fgcolorcode=${FgColors[x]}
local bgcolorcode=${BgColors[x]}
longcolorname="${attrname}${colorname}"
_def_color $longcolorname $attrcode $fgcolorcode
_def_color ${longcolorname}Fg $attrcode $fgcolorcode
_def_color ${longcolorname}Bg $attrcode $bgcolorcode
(( x++ ))
done
}
# _term_color [ N | N M ]
_term_color() {
local cv
if (( $# > 1 )); then
cv="${1};${2}"
else
cv="${1}"
fi
echo "\[\033[${cv}m\]"
}
# def_color NAME ATTRCODE COLORCODE
_def_color() {
local def="$1=\"\`_term_color $2 $3\`\""
if [[ -n "$debug$verbose" ]]; then
echo 1>&2 "+ $def"
fi
eval "$def"
}
#ResetColor="`_term_color 0`" # Text reset
_map_colors Bold $AttrBright
_map_colors Bright $AttrBright
_map_colors Dim $AttrDim
_map_colors '' $AttrNorm
_def_color IntenseBlack 0 90
_def_color ResetColor 0 0
}
define_color_names
# end of prompt-colors.sh
# vim: set ai sw=2
Loading…
Cancel
Save