#! /usr/bin/zsh
+# Those can be used, for instance to construct the prompt:
__ZSH_GIT_BASEDIR=""
__ZSH_GIT_SUBDIR=""
__ZSH_GIT_BRANCH=""
__ZSH_GIT_ACTION=""
__ZSH_GIT_STATUS=""
+
__ZSH_GIT_VARS_INVALID=1
__ZSH_GIT_STATUS_INVALID=1
git_chpwd() {
# On cd, invalidate git status in prompt
__ZSH_GIT_VARS_INVALID=1
+ __ZSH_GIT_BASEDIR=""
}
__ZSH_GIT_STATUS_INVALID=1
}
-
git_get_status() {
# Return only git status
local gitstat gitstatus
- gitstat=$(git status 2> /dev/null | grep '\(# Untracked\|# Changes\|# Changed but not updated:\)')
+ gitstat=$(LANG=C git status 2> /dev/null | grep '\(Untracked\|Changes\|Changed but not updated:\)')
+ # 'fix for mcedit parser
gitstatus=""
- if [[ $(echo ${gitstat} | grep -c "^# Changes to be committed:$") > 0 ]]; then
- gitstatus='+'
+ if [[ $(echo ${gitstat} | grep -c "^Changes to be committed:$") > 0 ]]; then
+ gitstatus='✚'
fi
- if [[ $(echo ${gitstat} | grep -c "^\# Changed but not updated:$") > 0 ]]; then
- gitstatus="${gitstatus}!"
+ if [[ $(echo ${gitstat} | grep -c "^Changed but not updated:$") > 0 || \
+ $(echo ${gitstat} | grep -c "^Changes not staged for commit:$") > 0 ]]; then
+ gitstatus="${gitstatus}✹"
fi
- if [[ $(echo ${gitstat} | grep -c "^# Untracked files:$") > 0 ]]; then
- gitstatus="${gitstatus}?"
+ if [[ $(echo ${gitstat} | grep -c "^Untracked files:$") > 0 ]]; then
+ gitstatus="${gitstatus}★"
+ fi
+
+ if [[ -z $gitstatus ]]; then
+ gitstatus="%{${fg_bold[green]}%}✔%{$reset_color%}"
+ else
+ gitstatus="%{${fg_bold[yellow]}%}$gitstatus%{$reset_color%}"
fi
echo $gitstatus
git_parse() {
- # psvar[5] == current action (merge, rebase, ...)
- # psvar[6] == current branch
- # psvar[7] == repository base directory
- # psvar[8] == current subdir into repository
- # psvar[9] == status (untracked, unstaged, staged)
-
local git_dir ref base_dir sub_dir action branch gitstat gitstatus
-
# If nothing has been invalidated
if [[ "${__ZSH_GIT_VARS_INVALID}" == "0" && "${__ZSH_GIT_STATUS_INVALID}" == "0" ]]; then
-
- # reuse previous values
- psvar[5]=${__ZSH_GIT_ACTION}
- psvar[6]=${__ZSH_GIT_BRANCH}
- psvar[7]=${__ZSH_GIT_BASEDIR}
- psvar[8]=${__ZSH_GIT_SUBDIR}
- psvar[9]=${__ZSH_GIT_STATUS}
-
return
fi
# If only status has been invalidated
if [[ "${__ZSH_GIT_VARS_INVALID}" == "0" && "${__ZSH_GIT_STATUS_INVALID}" == "1" ]]; then
-
- # reuse previous values
- psvar[5]=${__ZSH_GIT_ACTION}
- psvar[6]=${__ZSH_GIT_BRANCH}
- psvar[7]=${__ZSH_GIT_BASEDIR}
- psvar[8]=${__ZSH_GIT_SUBDIR}
-
__ZSH_GIT_STATUS=$(git_get_status)
- psvar[9]=${__ZSH_GIT_STATUS}
-
__ZSH_GIT_STATUS_INVALID=0
return
fi
action="-merge"
branch="$ref"
else
- test -f "$git_dir/BISECT_LOG" && psvar[3]="bisect"
+ test -f "$git_dir/BISECT_LOG" && action="-bisect"
branch="$(git symbolic-ref HEAD 2>/dev/null)" || \
branch="$(git describe --exact-match HEAD 2>/dev/null)" || \
branch="$(cut -c1-7 "$git_dir/HEAD")..."
fi
- # Status
- gitstatus=`git_get_status`
-
- # Got here, we're in git
- psvar[5]=${action}
- psvar[6]=${branch#refs/heads/}
- psvar[7]=${base_dir}
- psvar[8]=${sub_dir}
- psvar[9]=${gitstatus}
-
- # Save for next time
+
__ZSH_GIT_BASEDIR="${base_dir}"
__ZSH_GIT_SUBDIR="${sub_dir}"
__ZSH_GIT_BRANCH="${branch#refs/heads/}"
__ZSH_GIT_ACTION="${action}"
- __ZSH_GIT_STATUS="${gitstatus}"
+ __ZSH_GIT_STATUS=`git_get_status`
__ZSH_GIT_VARS_INVALID=0
__ZSH_GIT_STATUS_INVALID=0