Merge branch 'magicmonty'

master
Martin Goldhahn 13 years ago
commit 6f47998906
  1. 2
      .gitignore
  2. 4
      README.md
  3. 106
      gitprompt.fish
  4. BIN
      gitprompt.png
  5. 249
      gitprompt.sh
  6. 5
      gitstatus.py

2
.gitignore vendored

@ -0,0 +1,2 @@
*~
*.bak

@ -1,4 +1,4 @@
# Informative git prompt for bash # Informative git prompt for bash and fish
This prompt is a port of the "Informative git prompt for zsh" which you can find [here](https://github.com/olivierverdier/zsh-git-prompt) This prompt is a port of the "Informative git prompt for zsh" which you can find [here](https://github.com/olivierverdier/zsh-git-prompt)
@ -11,6 +11,8 @@ In particular the branch name, difference with remote branch, number of files st
The prompt may look like the following: The prompt may look like the following:
![Example prompt](gitprompt.png)
* ``(master↑3|✚1)``: on branch ``master``, ahead of remote by 3 commits, 1 file changed but not staged * ``(master↑3|✚1)``: on branch ``master``, ahead of remote by 3 commits, 1 file changed but not staged
* ``(status|●2)``: on branch ``status``, 2 files staged * ``(status|●2)``: on branch ``status``, 2 files staged
* ``(master|✚7…)``: on branch ``master``, 7 files changed, some files untracked * ``(master|✚7…)``: on branch ``master``, 7 files changed, some files untracked

@ -0,0 +1,106 @@
if not set -q __GIT_PROMPT_DIR
set __GIT_PROMPT_DIR ~/.bash
end
# Colors
# Reset
set ResetColor (set_color normal) # Text Reset
# Regular Colors
set Red (set_color red) # Red
set Yellow (set_color yellow); # Yellow
set Blue (set_color blue) # Blue
set WHITE (set_color white)
# Bold
set BGreen (set_color -o green) # Green
# High Intensty
set IBlack (set_color -o black) # Black
# Bold High Intensty
set Magenta (set_color -o purple) # Purple
# Default values for the appearance of the prompt. Configure at will.
set GIT_PROMPT_PREFIX "["
set GIT_PROMPT_SUFFIX "]"
set GIT_PROMPT_SEPARATOR "|"
set GIT_PROMPT_BRANCH "$Magenta"
set GIT_PROMPT_STAGED "$Red"
set GIT_PROMPT_CONFLICTS "$Red"
set GIT_PROMPT_CHANGED "$Blue"
set GIT_PROMPT_REMOTE " "
set GIT_PROMPT_UNTRACKED "…"
set GIT_PROMPT_CLEAN "$BGreen"
function fish_prompt
# Various variables you might want for your PS1 prompt instead
set Time (date +%R)
set PathShort (pwd|sed "s=$HOME=~=")
set PROMPT_START "$Yellow$PathShort$ResetColor"
set PROMPT_END " \n$WHITE$Time$ResetColor \$ "
set -e __CURRENT_GIT_STATUS
set gitstatus "$__GIT_PROMPT_DIR/gitstatus.py"
set _GIT_STATUS (python $gitstatus)
set __CURRENT_GIT_STATUS $_GIT_STATUS
set __CURRENT_GIT_STATUS_PARAM_COUNT (count $__CURRENT_GIT_STATUS)
if not test "0" -eq $__CURRENT_GIT_STATUS_PARAM_COUNT
set GIT_BRANCH $__CURRENT_GIT_STATUS[1]
set GIT_REMOTE "$__CURRENT_GIT_STATUS[2]"
if contains "." "$GIT_REMOTE"
set -e GIT_REMOTE
end
set GIT_STAGED $__CURRENT_GIT_STATUS[3]
set GIT_CONFLICTS $__CURRENT_GIT_STATUS[4]
set GIT_CHANGED $__CURRENT_GIT_STATUS[5]
set GIT_UNTRACKED $__CURRENT_GIT_STATUS[6]
set GIT_CLEAN $__CURRENT_GIT_STATUS[7]
end
if test -n "$__CURRENT_GIT_STATUS"
set STATUS " $GIT_PROMPT_PREFIX$GIT_PROMPT_BRANCH$GIT_BRANCH$ResetColor"
if set -q GIT_REMOTE
set STATUS "$STATUS$GIT_PROMPT_REMOTE$GIT_REMOTE$ResetColor"
end
set STATUS "$STATUS$GIT_PROMPT_SEPARATOR"
if [ $GIT_STAGED != "0" ]
set STATUS "$STATUS$GIT_PROMPT_STAGED$GIT_STAGED$ResetColor"
end
if [ $GIT_CONFLICTS != "0" ]
set STATUS "$STATUS$GIT_PROMPT_CONFLICTS$GIT_CONFLICTS$ResetColor"
end
if [ $GIT_CHANGED != "0" ]
set STATUS "$STATUS$GIT_PROMPT_CHANGED$GIT_CHANGED$ResetColor"
end
if [ "$GIT_UNTRACKED" != "0" ]
set STATUS "$STATUS$GIT_PROMPT_UNTRACKED$GIT_UNTRACKED$ResetColor"
end
if [ "$GIT_CLEAN" = "1" ]
set STATUS "$STATUS$GIT_PROMPT_CLEAN"
end
set STATUS "$STATUS$ResetColor$GIT_PROMPT_SUFFIX"
set PS1 "$PROMPT_START$STATUS$PROMPT_END"
else
set PS1 "$PROMPT_START$PROMPT_END"
end
echo -e $PS1
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@ -1,120 +1,181 @@
#!/bin/bash #!/bin/sh
# assume the gitstatus.py is in the same directory as this script
# code thanks to http://stackoverflow.com/questions/59895 function git_prompt_dir()
if [ -z "$__GIT_PROMPT_DIR" ] ; then {
SOURCE="${BASH_SOURCE[0]}" # assume the gitstatus.py is in the same directory as this script
while [ -h "$SOURCE" ] ; do # code thanks to http://stackoverflow.com/questions/59895
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" if [ -z "${__GIT_PROMPT_DIR}" ]; then
SOURCE="$(readlink "$SOURCE")" local SOURCE="${BASH_SOURCE[0]}"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" while [ -h "${SOURCE}" ]; do
local DIR="$( cd -P "$( dirname "${SOURCE}" )" && pwd )"
SOURCE="$(readlink "${SOURCE}")"
[[ $SOURCE != /* ]] && SOURCE="${DIR}/${SOURCE}"
done done
__GIT_PROMPT_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" __GIT_PROMPT_DIR="$( cd -P "$( dirname "${SOURCE}" )" && pwd )"
fi fi
}
# Colors function git_prompt_config()
# Reset {
ResetColor="\[\033[0m\]" # Text Reset # Colors
ResetColor="\[\033[0m\]" # Text reset
# Regular Colors
Red="\[\033[0;31m\]" # Red # Bold
Yellow="\[\033[0;33m\]" # Yellow local BoldGreen="\[\033[1;32m\]" # Green
Blue="\[\033[0;34m\]" # Blue local BoldBlue="\[\033[1;34m\]" # Blue
WHITE='\[\033[37m\]'
# High Intensty
# Bold local IntenseBlack="\[\033[0;90m\]" # Grey
BGreen="\[\033[1;32m\]" # Green
# Bold High Intensty
# High Intensty local Magenta="\[\033[1;95m\]" # Purple
IBlack="\[\033[0;90m\]" # Black
# Regular Colors
# Bold High Intensty local Yellow="\[\033[0;33m\]"
Magenta="\[\033[1;95m\]" # Purple local White='\[\033[37m\]'
local Red="\[\033[0;31m\]"
# Various variables you might want for your PS1 prompt instead local Blue="\[\033[0;34m\]"
#Time12a="\@"
Time12a="(\$(date +%H:%M:%S))" # Default values for the appearance of the prompt. Configure at will.
PathShort="\w" GIT_PROMPT_PREFIX="["
GIT_PROMPT_SUFFIX="]"
# Default values for the appearance of the prompt. Configure at will. GIT_PROMPT_SEPARATOR="|"
GIT_PROMPT_PREFIX="[" GIT_PROMPT_BRANCH="${Magenta}"
GIT_PROMPT_SUFFIX="]" GIT_PROMPT_STAGED="${Red}"
GIT_PROMPT_SEPARATOR="|" GIT_PROMPT_CONFLICTS="${Red}"
GIT_PROMPT_BRANCH="${Magenta}" GIT_PROMPT_CHANGED="${Blue}"
GIT_PROMPT_STAGED="${Red}" GIT_PROMPT_REMOTE=" "
GIT_PROMPT_CONFLICTS="${Red}" GIT_PROMPT_UNTRACKED="…"
GIT_PROMPT_CHANGED="${Blue}" GIT_PROMPT_CLEAN="${BoldGreen}"
GIT_PROMPT_REMOTE=" "
GIT_PROMPT_UNTRACKED="…" # Various variables you might want for your PS1 prompt instead
GIT_PROMPT_CLEAN="${BGreen}" local Time12a="\$(date +%H:%M)"
# local Time12a="(\$(date +%H:%M:%S))"
PROMPT_START="$Yellow$PathShort$ResetColor" # local Time12a="(\@))"
PROMPT_END=" \n$WHITE$Time12a$ResetColor $ " local PathShort="\w"
if [ -z "$OLDPROMPT" ] ; then
export OLDPROMPT=$PS1 if [ "x${GIT_PROMPT_START}" == "x" ]; then
fi PROMPT_START="${Yellow}${PathShort}${ResetColor}"
else
PROMPT_START="${GIT_PROMPT_START}"
fi
function update_current_git_vars() { if [ "x${GIT_PROMPT_END}" == "x" ]; then
unset __CURRENT_GIT_STATUS PROMPT_END=" \n${White}${Time12a}${ResetColor} $ "
local gitstatus="${__GIT_PROMPT_DIR}/gitstatus.py" else
PROMPT_END="${GIT_PROMPT_END}"
fi
_GIT_STATUS=$(python $gitstatus) EMPTY_PROMPT="${PROMPT_START}${PROMPT_END}"
__CURRENT_GIT_STATUS=($_GIT_STATUS)
GIT_BRANCH=${__CURRENT_GIT_STATUS[0]} # fetch remote revisions every other $GIT_PROMPT_FETCH_TIMEOUT (default 5) minutes
GIT_REMOTE=${__CURRENT_GIT_STATUS[1]} GIT_PROMPT_FETCH_TIMEOUT=${1-5}
if [[ "." == "$GIT_REMOTE" ]]; then if [ "x$__GIT_STATUS_CMD" == "x" ]
unset GIT_REMOTE then
git_prompt_dir
__GIT_STATUS_CMD="${__GIT_PROMPT_DIR}/gitstatus.py"
fi 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]}
} }
function setGitPrompt() { function setGitPrompt() {
update_current_git_vars
set_virtualenv
if [ -n "$__CURRENT_GIT_STATUS" ]; then local GIT_PROMPT_PREFIX
STATUS=" $GIT_PROMPT_PREFIX$GIT_PROMPT_BRANCH$GIT_BRANCH$ResetColor" 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
EMPTY_PROMPT=${OLD_GITPROMPT}
local repo=`git rev-parse --show-toplevel 2> /dev/null`
if [[ ! -e "${repo}" ]]; then
PS1="${EMPTY_PROMPT}"
return
fi
if [ -n "$GIT_REMOTE" ]; then local FETCH_HEAD="${repo}/.git/FETCH_HEAD"
STATUS="$STATUS$GIT_PROMPT_REMOTE$GIT_REMOTE$ResetColor" # 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}` ]]
then
[[ -n $(git remote show) ]] && git fetch --quiet
fi fi
STATUS="$STATUS$GIT_PROMPT_SEPARATOR" local -a GitStatus
if [ "$GIT_STAGED" -ne "0" ]; then GitStatus=($("${__GIT_STATUS_CMD}" 2>/dev/null))
STATUS="$STATUS$GIT_PROMPT_STAGED$GIT_STAGED$ResetColor"
local GIT_BRANCH=${GitStatus[0]}
local GIT_REMOTE=${GitStatus[1]}
if [[ "." == "$GIT_REMOTE" ]]; then
unset GIT_REMOTE
fi 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 [ "$GIT_CONFLICTS" -ne "0" ]; then if [[ -n "${GIT_REMOTE}" ]]; then
STATUS="$STATUS$GIT_PROMPT_CONFLICTS$GIT_CONFLICTS$ResetColor" STATUS="${STATUS}${GIT_PROMPT_REMOTE}${GIT_REMOTE}${ResetColor}"
fi fi
if [ "$GIT_CHANGED" -ne "0" ]; then
STATUS="$STATUS$GIT_PROMPT_CHANGED$GIT_CHANGED$ResetColor" STATUS="${STATUS}${GIT_PROMPT_SEPARATOR}"
if [ "${GIT_STAGED}" -ne "0" ]; then
STATUS="${STATUS}${GIT_PROMPT_STAGED}${GIT_STAGED}${ResetColor}"
fi fi
if [ "$GIT_UNTRACKED" -ne "0" ]; then
STATUS="$STATUS$GIT_PROMPT_UNTRACKED$GIT_UNTRACKED$ResetColor" if [ "${GIT_CONFLICTS}" -ne "0" ]; then
STATUS="${STATUS}${GIT_PROMPT_CONFLICTS}${GIT_CONFLICTS}${ResetColor}"
fi fi
if [ "$GIT_CLEAN" -eq "1" ]; then
STATUS="$STATUS$GIT_PROMPT_CLEAN" if [ "${GIT_CHANGED}" -ne "0" ]; then
STATUS="${STATUS}${GIT_PROMPT_CHANGED}${GIT_CHANGED}${ResetColor}"
fi fi
STATUS="$STATUS$ResetColor$GIT_PROMPT_SUFFIX"
PS1="$PYTHON_VIRTUALENV$PROMPT_START$STATUS$PROMPT_END" if [ "${GIT_UNTRACKED}" -ne "0" ]; then
else STATUS="${STATUS}${GIT_PROMPT_UNTRACKED}${GIT_UNTRACKED}${ResetColor}"
#PS1="$PROMPT_START$PROMPT_END" fi
PS1=$OLDPROMPT
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 fi
}
# Determine active Python virtualenv details.
function set_virtualenv () {
if test -z "$VIRTUAL_ENV" ; then
PYTHON_VIRTUALENV=""
else else
PYTHON_VIRTUALENV="${BLUE}(`basename \"$VIRTUAL_ENV\"`)${ResetColor} " PS1="${EMPTY_PROMPT}"
fi fi
} }
PROMPT_COMMAND=setGitPrompt if [ -z "$OLD_GITPROMPT" ]; then
OLD_GITPROMPT=$PS1
fi
if [ -z "$PROMPT_COMMAND" ]; then
PROMPT_COMMAND=setGitPrompt
else
PROMPT_COMMAND="$PROMPT_COMMAND;setGitPrompt"
fi

@ -40,7 +40,12 @@ else:
remote = '' remote = ''
tag, tag_error = Popen(['git', 'describe', '--exact-match'], stdout=PIPE, stderr=PIPE).communicate()
if not branch: # not on any branch if not branch: # not on any branch
if tag: # if we are on a tag, print the tag's name
branch = tag
else:
branch = symbols['prehash']+ Popen(['git','rev-parse','--short','HEAD'], stdout=PIPE).communicate()[0][:-1] branch = symbols['prehash']+ Popen(['git','rev-parse','--short','HEAD'], stdout=PIPE).communicate()[0][:-1]
else: else:
remote_name = Popen(['git','config','branch.%s.remote' % branch], stdout=PIPE).communicate()[0].strip() remote_name = Popen(['git','config','branch.%s.remote' % branch], stdout=PIPE).communicate()[0].strip()

Loading…
Cancel
Save