Merge pull request #68 from aks/master

Refactored out color defs & assignments; other optimizations.
master
Martin Gondermann 11 years ago
commit 926c441b26
  1. 59
      README.md
  2. 14
      git-prompt-colors.sh
  3. 2
      git-prompt-help.sh
  4. 225
      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
`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.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,12 +107,18 @@ 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``.
@ -104,6 +126,7 @@ function prompt_callback {
**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"

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

@ -22,116 +22,107 @@ 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
# 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
}
# High Intensty
local IntenseBlack="\[\033[0;90m\]" # Grey
# 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
# Bold High Intensty
local Magenta="\[\033[1;95m\]" # Purple
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
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
done
done
fi
# Do this only once to define PROMPT_START and PROMPT_END
if [[ -z "$PROMPT_START" || -z "$PROMPT_END" ]]; then
# 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 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 [ "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
if [ "x${GIT_PROMPT_START}" == "x" ]; then
#First statment is for non root behavior second for root
if [[ -z "${GIT_PROMPT_START}" ]] ; then
if $_isroot; then
PROMPT_START="${GIT_PROMPT_START_ROOT}"
PROMPT_START="$GIT_PROMPT_START_ROOT"
else
PROMPT_START="${GIT_PROMPT_START_USER}"
PROMPT_START="$GIT_PROMPT_START_USER"
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_ROOT}"
PROMPT_END="$GIT_PROMPT_END_USER"
fi
else
PROMPT_END="${GIT_PROMPT_END}"
fi
fi
# set GIT_PROMPT_LEADING_SPACE to 0 if you want to have no leading space in front of the GIT prompt
if [ "x${GIT_PROMPT_LEADING_SPACE}" == "x0" ]; then
@ -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
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
done
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
# __add_status KIND VALEXPR INSERT
# eg: __add_status 'STAGED' '-ne 0'
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}"
__chk_gitvar_status() {
local v
if [[ "x$2" == "x-n" ]] ; then
v="$2 \"\${GIT_$1}\""
else
v="\${GIT_$1} $2"
fi
if [ "${GIT_CHANGED}" -ne "0" ]; then
STATUS="${STATUS}${GIT_PROMPT_CHANGED}${GIT_CHANGED}${ResetColor}"
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
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
__add_gitvar_status() {
__add_status "\${GIT_PROMPT_$1}\${GIT_$1}\${ResetColor}"
}
STATUS="${STATUS}${ResetColor}${GIT_PROMPT_SUFFIX}"
# __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