- if [[ -n ${1} ]] ; then
- zstyle -s ":vcs_info:${usercontext}:${vcs}" actionformat msg
- [[ -z ${msg} ]] && msg=' (%s)-[%b|%a]-'
- else
- zstyle -s ":vcs_info:${usercontext}:${vcs}" format msg
- [[ -z ${msg} ]] && msg=' (%s)-[%b]-'
- fi
- printf '%s' ${msg}
-}
-# }}}
-VCS_INFO_realpath () { #{{{
- # replacing 'readlink -f', which is really not portable.
- # forcing a subshell, to ensure chpwd() is not removed
- # from the calling shell (if VCS_INFO_realpath() is called
- # manually).
- (
- (( ${+functions[chpwd]} )) && unfunction chpwd
- setopt chaselinks
- cd $1 2>/dev/null && pwd
- )
-}
-# }}}
-VCS_INFO_git_getaction () { #{{{
- local gitaction='' gitdir=${1}
- local tmp
-
- for tmp in "${gitdir}/rebase-apply" \
- "${gitdir}/rebase" \
- "${gitdir}/../.dotest" ; do
- if [[ -d ${tmp} ]] ; then
- if [[ -f "${tmp}/rebasing" ]] ; then
- gitaction="rebase"
- elif [[ -f "${tmp}/applying" ]] ; then
- gitaction="am"
- else
- gitaction="am/rebase"
- fi
- printf '%s' ${gitaction}
- return 0
- fi
- done
-
- for tmp in "${gitdir}/rebase-merge/interactive" \
- "${gitdir}/.dotest-merge/interactive" ; do
- if [[ -f "${tmp}" ]] ; then
- printf '%s' "rebase-i"
- return 0
- fi
- done
-
- for tmp in "${gitdir}/rebase-merge" \
- "${gitdir}/.dotest-merge" ; do
- if [[ -d "${tmp}" ]] ; then
- printf '%s' "rebase-m"
- return 0
- fi
- done
-
- if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
- printf '%s' "merge"
- else
- if [[ -f "${gitdir}/BISECT_LOG" ]] ; then
- printf '%s' "bisect"
- fi
- fi
-
- return 1
-}
-# }}}
-VCS_INFO_git_getbranch () { #{{{
- local gitbranch gitdir=${1}
- local gitsymref='git symbolic-ref HEAD'
-
- if [[ -d "${gitdir}/rebase-apply" ]] \
- || [[ -d "${gitdir}/rebase" ]] \
- || [[ -d "${gitdir}/../.dotest" ]] \
- || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
- gitbranch="$(${(z)gitsymref} 2> /dev/null)"
- [[ -z ${gitbranch} ]] && gitbranch="$(< ${gitdir}/rebase-apply/head-name)"
-
- elif [[ -f "${gitdir}/rebase-merge/interactive" ]] \
- || [[ -d "${gitdir}/rebase-merge" ]] ; then
- gitbranch="$(< ${gitdir}/rebase-merge/head-name)"
-
- elif [[ -f "${gitdir}/.dotest-merge/interactive" ]] \
- || [[ -d "${gitdir}/.dotest-merge" ]] ; then
- gitbranch="$(< ${gitdir}/.dotest-merge/head-name)"
-
- else
- gitbranch="$(${(z)gitsymref} 2> /dev/null)"
-
- if [[ $? -ne 0 ]] ; then
- gitbranch="$(git describe --exact-match HEAD 2>/dev/null)"
-
- if [[ $? -ne 0 ]] ; then
- gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..."
- fi
- fi
- fi
-
- printf '%s' "${gitbranch##refs/heads/}"
-}
-# }}}
-VCS_INFO_git_get_data () { # {{{
- setopt localoptions extendedglob
- local gitdir gitbase gitbranch gitaction msg
-
- gitdir=${vcs_comm[gitdir]}
- gitbranch="$(VCS_INFO_git_getbranch ${gitdir})"
-
- if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then
- return
- fi
-
- VCS_INFO_adjust
- gitaction="$(VCS_INFO_git_getaction ${gitdir})"
- msg=$(VCS_INFO_format ${gitaction})
-
- gitbase=${PWD%/${$(git rev-parse --show-prefix)%/##}}
-
- zformat -f msg "${msg}" "a:${gitaction}" "b:${gitbranch}" "s:${vcs}" "r:${gitbase:t}" "R:${gitbase}"
- printf '%s' ${msg}
-}
-# }}}
-VCS_INFO_darcs_get_data () { # {{{
- local msg darcsbase
-
- darcsbase=${vcs_comm[basedir]}
- msg=$(VCS_INFO_format)
- zformat -f msg "${msg}" "a:" "b:${darcsbase:t}" "s:${vcs}" "r:${darcsbase:t}" "R:${darcsbase}"
- printf '%s' ${msg}
-}
-# }}}
-VCS_INFO_hg_get_data () { # {{{
- local msg hgbranch hgbase
-
- hgbase=${vcs_comm[basedir]}
- hgbranch=$(< ${hgbase}/.hg/branch)
- msg=$(VCS_INFO_format)
- zformat -f msg "${msg}" "a:" "b:${hgbranch}" "s:${vcs}" "r:${hgbase:t}" "R:${hgbase}"
- printf '%s' ${msg}
-}
-# }}}
-VCS_INFO_mtn_get_data () { # {{{
- local msg mtnbranch mtnbase
-
- mtnbase=${vcs_comm[basedir]}
- mtnbranch=$(mtn status | awk '/Current branch:/{ sub("Current branch: ", ""); print }')
- msg=$(VCS_INFO_format)
- zformat -f msg "${msg}" "a:" "b:${mtnbranch}" "s:${vcs}" "r:${mtnbase:t}" "R:${mtnbase}"
- printf '%s' ${msg}
-}
-# }}}
-VCS_INFO_svk_get_data () { # {{{
- local msg svkbranch svkbase
-
- svkbase=${vcs_comm[basedir]}
-
- zstyle -s ":vcs_info:${usercontext}:${vcs}" branchformat svkbranch || svkbranch="%b:%r"
- zformat -f svkbranch "${svkbranch}" "b:${vcs_comm[branch]}" "r:${vcs_comm[revision]}"
-
- msg=$(VCS_INFO_format)
- zformat -f msg "${msg}" "a:" "b:${svkbranch}" "s:${vcs}" "r:${svkbase:t}" "R:${svkbase}"
- printf '%s' ${msg}
-}
-# }}}
-VCS_INFO_svn_get_data () { # {{{
- setopt localoptions noksharrays
- local msg svnbase svnbranch
- local -a svninfo
-
- svnbase="."
- while [[ -d "${svnbase}/../.svn" ]]; do
- svnbase="${svnbase}/.."
- done
- svnbase=$(VCS_INFO_realpath ${svnbase})
- svninfo=($(svn info "${svnbase}" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r"\n"$0 }'))
-
- zstyle -s ":vcs_info:${usercontext}:${vcs}" branchformat svnbranch || svnbranch="%b:%r"
- zformat -f svnbranch "${svnbranch}" "b:${svninfo[1]}" "r:${svninfo[2]}"
-
- msg=$(VCS_INFO_format)
- zformat -f msg "${msg}" "a:" "b:${svnbranch}" "s:${vcs}" "r:${svnbase:t}" "R:${svnbase}"
- printf '%s' ${msg}
-}
-# }}}
-VCS_INFO_bzr_get_data () { # {{{
- local msg bzrbranch bzrbase bzrrevno bzrbr i j
-
- if zstyle -t ":vcs_info:${usercontext}:${vcs}" "use-simple" ; then
- bzrbase=${vcs_comm[basedir]}
- bzrbranch=${bzrbase:t}
- if [[ -f ${bzrbase}/.bzr/branch/last-revision ]] ; then
- bzrrevno=$(< ${bzrbase}/.bzr/branch/last-revision)
- bzrrevno=${bzrrevno%% *}
- fi
- else
- bzrbase=$(bzr info 2>/dev/null | sed -rne 's, *branch root: ,,p')
- bzrbase=$(VCS_INFO_realpath ${bzrbase})
-
- bzr version-info 2> /dev/null | while read i j; do
- case "${i}" in
- revno:)
- bzrrevno=${j} ;;
- branch-nick:)
- bzrbranch=${j} ;;
- esac
- done
- fi
-
- zstyle -s ":vcs_info:${usercontext}:${vcs}" branchformat bzrbr || bzrbr="%b:%r"
- zformat -f bzrbr "${bzrbr}" "b:${bzrbranch}" "r:${bzrrevno}"
-
- msg=$(VCS_INFO_format)
- zformat -f msg "${msg}" "a:" "b:${bzrbr}" "s:${vcs}" "r:${bzrbase:t}" "R:${bzrbase}"
- printf '%s' ${msg}
-}
-# }}}
-VCS_INFO_cvs_get_data () { # {{{
- local msg cvsbranch cvsbase basename
-
- cvsbase="."
- while [[ -d "${cvsbase}/../CVS" ]]; do
- cvsbase="${cvsbase}/.."
- done
- cvsbase=$(VCS_INFO_realpath ${cvsbase})
- cvsbranch=$(< ./CVS/Repository)
- basename=${cvsbase:t}
- cvsbranch=${cvsbranch##${basename}/}
- [[ -z ${cvsbranch} ]] && cvsbranch=${basename}
-
- msg=$(VCS_INFO_format)
- zformat -f msg "${msg}" "a:" "b:${cvsbranch}" "s:${vcs}" "r:${basename}" "R:${cvsbase}"
- printf '%s' ${msg}
-}
-# }}}
-# VCS_INFO_*_detect () {{{
-
-VCS_INFO_detect_by_dir() {
- local dirname=${1}
- local basedir="." realbasedir
-
- realbasedir=$(VCS_INFO_realpath ${basedir})
- while [[ ${realbasedir} != '/' ]]; do
- if [[ -n ${vcs_comm[detect_need_file]} ]] ; then
- [[ -d ${basedir}/${dirname} ]] && \
- [[ -f ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \
- break
- else
- [[ -d ${basedir}/${dirname} ]] && break
- fi
-
- basedir=${basedir}/..
- realbasedir=$(VCS_INFO_realpath ${basedir})
- done
-
- [[ ${realbasedir} == "/" ]] && return 1
- vcs_comm[basedir]=${realbasedir}
- return 0
-}
-
-VCS_INFO_bzr_detect() {
- VCS_INFO_check_com bzr || return 1
- vcs_comm[detect_need_file]=branch/format
- VCS_INFO_detect_by_dir '.bzr'
- return $?
-}
-
-VCS_INFO_cvs_detect() {
- VCS_INFO_check_com svn || return 1
- [[ -d "CVS" ]] && return 0
- return 1
-}
-
-VCS_INFO_darcs_detect() {
- VCS_INFO_check_com darcs || return 1
- vcs_comm[detect_need_file]=format
- VCS_INFO_detect_by_dir '_darcs'
- return $?
-}
-
-VCS_INFO_git_detect() {
- if VCS_INFO_check_com git && git rev-parse --is-inside-work-tree &> /dev/null ; then
- vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1
- [[ -d ${vcs_comm[gitdir]}/svn ]] && vcs_comm[overwrite_name]='git-svn'
- return 0
- fi
- return 1
-}
-
-VCS_INFO_hg_detect() {
- VCS_INFO_check_com hg || return 1
- vcs_comm[detect_need_file]=branch
- VCS_INFO_detect_by_dir '.hg'
- return $?
-}
-
-VCS_INFO_mtn_detect() {
- VCS_INFO_check_com mtn || return 1
- vcs_comm[detect_need_file]=revision
- VCS_INFO_detect_by_dir '_MTN'
- return $?
-}
-
-VCS_INFO_svk_detect() {
- setopt localoptions noksharrays
- local -a info
-
- VCS_INFO_check_com svk || return 1
- [[ -f ~/.svk/config ]] || return 1
-
- info=(
- $(awk '
- /: *$/ {
- sub(/^ */,"",$0);
- sub(/: *$/,"",$0);
- if (match("'${PWD}'", $0"(/|$)")) {
- print $0; d=1;
- }
- }
- /depotpath/ && d == 1 {
- sub(".*/","",$0);
- r=$0
- }
- /revision/ && d == 1 {
- print r "\n" $2;
- exit 1
- }' ~/.svk/config
- )
- ) && return 1
-
- vcs_comm[basedir]=${info[1]}
- vcs_comm[branch]=${info[2]}
- vcs_comm[revision]=${info[3]}
- return 0
-}
-
-VCS_INFO_svn_detect() {
- VCS_INFO_check_com svn || return 1
- [[ -d ".svn" ]] && return 0
- return 1
-}
-
-# }}}
-vcs_info_printsys () { # {{{
- vcs_info print_systems_
-}
-# }}}
-vcs_info_lastmsg () { # {{{
- if zstyle -T ':vcs_info:command:formats' use-prompt-escapes ; then
- print -P ${VCS_INFO_message_}
- else
- print ${VCS_INFO_message_}
- fi
-}
-# }}}
-vcs_info () { # {{{
- setopt localoptions #xtrace
- local string
- local -i found
- local -a VCSs disabled
- local -x vcs usercontext
- local -Ax vcs_comm
-
- VCSs=(git hg bzr darcs mtn svn cvs svk)
- case ${1} in
- (print_systems_)
- print -l ${VCSs}
- # and the special flavours
- print -l '# flavours (cannot be used in the disable style; they' \
- '# are disabled with their master [git-svn -> git]):' \
- 'git-svn'
- return 0
- ;;
- ('')
- [[ -t ${usercontext} ]] && usercontext=default
- ;;
- (*) [[ -t ${usercontext} ]] && usercontext=${1}
- ;;
- esac
-
- vcs="init"
- zstyle -T ":vcs_info:${usercontext}:${vcs}" "enable" || {
- typeset -gx VCS_INFO_message_=''
- return 0
- }
- zstyle -a ":vcs_info:${usercontext}:${vcs}" "disable" disabled
-
- (( found = 0 ))
- for vcs in ${VCSs} ; do
- [[ -n ${(M)disabled:#${vcs}} ]] && continue
- vcs_comm=()
- VCS_INFO_${vcs}_detect && (( found = 1 )) && break
- done
-
- (( found == 0 )) && {
- typeset -gx VCS_INFO_message_=''
- return 0
- }
-
- string=$(VCS_INFO_${vcs}_get_data) || {
- typeset -gx VCS_INFO_message_=''
- return 1
- }
-
- typeset -gx VCS_INFO_message_=${string}
- return 0
-}
-
-typeset -gx VCS_INFO_message_=''
-# }}}
-
-# change vcs_info formats for the grml prompt
-if [[ "$TERM" == dumb ]] ; then
- zstyle ':vcs_info:*' promptactionformat "(%s%)-[%b|%a] "
- zstyle ':vcs_info:*' promptformat "(%s%)-[%b] "
-else
- # these are the same, just with a lot of colours:
- zstyle ':vcs_info:*' promptactionformat "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} "
- zstyle ':vcs_info:*' promptformat "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} "
- zstyle ':vcs_info:(sv[nk]|bzr)' branchformat "%b${YELLOW}:%r"
-fi
-
-# }}}
-
-# {{{ set prompt