Created
May 24, 2015 10:32
-
-
Save igolden/1f28f4d5659214b81f3b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
autoload -U zgitinit | |
zgitinit | |
prompt_grb_help () { | |
cat <<'EOF' | |
prompt grb | |
EOF | |
} | |
# get the name of the branch we are on | |
function git_prompt_info() { | |
if [[ "$(command git config --get oh-my-zsh.hide-status 2>/dev/null)" != "1" ]]; then | |
ref=$(command git symbolic-ref HEAD 2> /dev/null) || \ | |
ref=$(command git rev-parse --short HEAD 2> /dev/null) || return 0 | |
echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_SUFFIX" | |
fi | |
} | |
# Checks if working tree is dirty | |
parse_git_dirty() { | |
local STATUS='' | |
local FLAGS | |
FLAGS=('--porcelain') | |
if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then | |
if [[ $POST_1_7_2_GIT -gt 0 ]]; then | |
FLAGS+='--ignore-submodules=dirty' | |
fi | |
if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" == "true" ]]; then | |
FLAGS+='--untracked-files=no' | |
fi | |
STATUS=$(command git status ${FLAGS} 2> /dev/null | tail -n1) | |
fi | |
if [[ -n $STATUS ]]; then | |
echo "$ZSH_THEME_GIT_PROMPT_DIRTY" | |
else | |
echo "$ZSH_THEME_GIT_PROMPT_CLEAN" | |
fi | |
} | |
# get the difference between the local and remote branches | |
git_remote_status() { | |
remote=${$(command git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/} | |
if [[ -n ${remote} ]] ; then | |
ahead=$(command git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l) | |
behind=$(command git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l) | |
if [ $ahead -eq 0 ] && [ $behind -gt 0 ] | |
then | |
echo "$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE" | |
elif [ $ahead -gt 0 ] && [ $behind -eq 0 ] | |
then | |
echo "$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE" | |
elif [ $ahead -gt 0 ] && [ $behind -gt 0 ] | |
then | |
echo "$ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE" | |
fi | |
fi | |
} | |
# Checks if there are commits ahead from remote | |
function git_prompt_ahead() { | |
if $(echo "$(command git log @{upstream}..HEAD 2> /dev/null)" | grep '^commit' &> /dev/null); then | |
echo "$ZSH_THEME_GIT_PROMPT_AHEAD" | |
fi | |
} | |
# Gets the number of commits ahead from remote | |
function git_commits_ahead() { | |
if $(echo "$(command git log @{upstream}..HEAD 2> /dev/null)" | grep '^commit' &> /dev/null); then | |
COMMITS=$(command git log @{upstream}..HEAD | grep '^commit' | wc -l | tr -d ' ') | |
echo "$ZSH_THEME_GIT_COMMITS_AHEAD_PREFIX$COMMITS$ZSH_THEME_GIT_COMMITS_AHEAD_SUFFIX" | |
fi | |
} | |
# Formats prompt string for current git commit short SHA | |
function git_prompt_short_sha() { | |
SHA=$(command git rev-parse --short HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" | |
} | |
# Formats prompt string for current git commit long SHA | |
function git_prompt_long_sha() { | |
SHA=$(command git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" | |
} | |
# Get the status of the working tree | |
git_prompt_status() { | |
INDEX=$(command git status --porcelain -b 2> /dev/null) | |
STATUS="" | |
if $(echo "$INDEX" | command grep -E '^\?\? ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^A ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS" | |
elif $(echo "$INDEX" | grep '^M ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" | |
elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" | |
elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^R ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" | |
elif $(echo "$INDEX" | grep '^D ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" | |
elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" | |
fi | |
if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^## .*ahead' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^## .*behind' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^## .*diverged' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS" | |
fi | |
echo $STATUS | |
} | |
#compare the provided version of git to the version installed and on path | |
#prints 1 if input version <= installed version | |
#prints -1 otherwise | |
function git_compare_version() { | |
local INPUT_GIT_VERSION=$1; | |
local INSTALLED_GIT_VERSION | |
INPUT_GIT_VERSION=(${(s/./)INPUT_GIT_VERSION}); | |
INSTALLED_GIT_VERSION=($(command git --version 2>/dev/null)); | |
INSTALLED_GIT_VERSION=(${(s/./)INSTALLED_GIT_VERSION[3]}); | |
for i in {1..3}; do | |
if [[ $INSTALLED_GIT_VERSION[$i] -gt $INPUT_GIT_VERSION[$i] ]]; then | |
echo 1 | |
return 0 | |
fi | |
if [[ $INSTALLED_GIT_VERSION[$i] -lt $INPUT_GIT_VERSION[$i] ]]; then | |
echo -1 | |
return 0 | |
fi | |
done | |
echo 0 | |
} | |
#this is unlikely to change so make it all statically assigned | |
POST_1_7_2_GIT=$(git_compare_version "1.7.2") | |
#clean up the namespace slightly by removing the checker function | |
unset -f git_compare_version | |
# agnoster | |
CURRENT_BG='NONE' | |
SEGMENT_SEPARATOR='' | |
# Begin a segment | |
# Takes two arguments, background and foreground. Both can be omitted, | |
# rendering default background/foreground. | |
prompt_segment() { | |
local bg fg | |
[[ -n $1 ]] && bg="%K{$1}" || bg="%k" | |
[[ -n $2 ]] && fg="%F{$2}" || fg="%f" | |
if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then | |
echo -n " %{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%} " | |
else | |
echo -n "%{$bg%}%{$fg%} " | |
fi | |
CURRENT_BG=$1 | |
[[ -n $3 ]] && echo -n $3 | |
} | |
# | |
# End the prompt, closing any open segments | |
prompt_end() { | |
if [[ -n $CURRENT_BG ]]; then | |
echo -n " %{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR" | |
else | |
echo -n "%{%k%}" | |
fi | |
echo -n "%{%f%}" | |
CURRENT_BG='' | |
} | |
# Git: branch/detached head, dirty status | |
prompt_git() { | |
local ref dirty mode repo_path | |
repo_path=$(git rev-parse --git-dir 2>/dev/null) | |
if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then | |
dirty=$(parse_git_dirty) | |
ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git show-ref --head -s --abbrev |head -n1 2> /dev/null)" | |
if [[ -n $dirty ]]; then | |
prompt_segment yellow black | |
else | |
prompt_segment green black | |
fi | |
if [[ -e "${repo_path}/BISECT_LOG" ]]; then | |
mode=" <B>" | |
elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then | |
mode=" >M<" | |
elif [[ -e "${repo_path}/rebase" || -e "${repo_path}/rebase-apply" || -e "${repo_path}/rebase-merge" || -e "${repo_path}/../.dotest" ]]; then | |
mode=" >R>" | |
fi | |
setopt promptsubst | |
autoload -Uz vcs_info | |
zstyle ':vcs_info:*' enable git | |
zstyle ':vcs_info:*' get-revision true | |
zstyle ':vcs_info:*' check-for-changes true | |
zstyle ':vcs_info:*' stagedstr '✚' | |
zstyle ':vcs_info:git:*' unstagedstr '●' | |
zstyle ':vcs_info:*' formats ' %u%c' | |
zstyle ':vcs_info:*' actionformats ' %u%c' | |
vcs_info | |
echo -n "${ref/refs\/heads\// }${vcs_info_msg_0_%% }${mode}" | |
fi | |
} | |
prompt_hg() { | |
local rev status | |
if $(hg id >/dev/null 2>&1); then | |
if $(hg prompt >/dev/null 2>&1); then | |
if [[ $(hg prompt "{status|unknown}") = "?" ]]; then | |
# if files are not added | |
prompt_segment red white | |
st='±' | |
elif [[ -n $(hg prompt "{status|modified}") ]]; then | |
# if any modification | |
prompt_segment yellow black | |
st='±' | |
else | |
# if working copy is clean | |
prompt_segment green black | |
fi | |
echo -n $(hg prompt "☿ {rev}@{branch}") $st | |
else | |
st="" | |
rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g') | |
branch=$(hg id -b 2>/dev/null) | |
if `hg st | grep -q "^\?"`; then | |
prompt_segment red black | |
st='±' | |
elif `hg st | grep -q "^(M|A)"`; then | |
prompt_segment yellow black | |
st='±' | |
else | |
prompt_segment green black | |
fi | |
echo -n "☿ $rev@$branch" $st | |
fi | |
fi | |
} | |
# Dir: current working directory | |
prompt_dir() { | |
prompt_segment yellow black '%~' | |
} | |
# Virtualenv: current working virtualenv | |
prompt_virtualenv() { | |
local virtualenv_path="$VIRTUAL_ENV" | |
if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then | |
prompt_segment blue black "(`basename $virtualenv_path`)" | |
fi | |
} | |
# Status: | |
# - was there an error | |
# - am I root | |
# - are there background jobs? | |
prompt_status() { | |
local symbols | |
symbols=() | |
[[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}✘" | |
[[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡" | |
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙" | |
[[ -n "$symbols" ]] && prompt_segment black default "$symbols" | |
} | |
## Main prompt | |
build_prompt() { | |
RETVAL=$? | |
prompt_status | |
prompt_virtualenv | |
prompt_dir | |
prompt_git | |
prompt_hg | |
prompt_end | |
} | |
PROMPT='%{%f%b%k%}$(build_prompt) ' | |
# vim:set ft=zsh: | |
# |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment