+VCS_INFO_bzr_get_data () { # {{{
+ local msg bzrbranch bzrbase bzrrevno i j
+
+ 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
+
+ msg=$(VCS_INFO_format)
+ zformat -f msg "${msg}" "a:" "b:${bzrbranch}:${bzrrevno}" "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() {
+ check_com -c bzr || return 1
+ vcs_comm[detect_need_file]=branch/format
+ VCS_INFO_detect_by_dir '.bzr'
+ return $?
+}
+
+VCS_INFO_cvs_detect() {
+ check_com -c svn || return 1
+ [[ -d "CVS" ]] && return 0
+ return 1
+}
+
+VCS_INFO_darcs_detect() {
+ check_com -c darcs || return 1
+ vcs_comm[detect_need_file]=format
+ VCS_INFO_detect_by_dir '_darcs'
+ return $?
+}
+
+VCS_INFO_git_detect() {
+ if check_com -c 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() {
+ check_com -c hg || return 1
+ vcs_comm[detect_need_file]=branch
+ VCS_INFO_detect_by_dir '.hg'
+ return $?
+}
+
+VCS_INFO_mtn_detect() {
+ check_com -c mtn || return 1
+ vcs_comm[detect_need_file]=revision
+ VCS_INFO_detect_by_dir '_MTN'
+ return $?
+}
+
+VCS_INFO_svk_detect() {
+ local basedir
+
+ check_com -c svk || return 1
+ [[ -f ~/.svk/config ]] || return 1
+
+ basedir=$(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 ":" $2; exit 1 }' ~/.svk/config) && return 1
+
+ vcs_comm[basedir]=${basedir}
+ return 0
+}
+
+VCS_INFO_svn_detect() {
+ check_com -c svn || return 1
+ [[ -d ".svn" ]] && return 0
+ return 1
+}
+
+# }}}
+vcs_info () { # {{{
+ local string
+ local -i found
+ local -a VCSs disabled
+ local -x vcs
+ local -Ax vcs_comm
+
+ vcs="init"
+ zstyle -T ":vcs_info:${vcs}" "enable" || return 0
+ zstyle -a ":vcs_info:${vcs}" "disable" disabled
+
+ VCSs=(git hg bzr darcs mtn svn cvs svk)
+
+ (( found = 0 ))
+ for vcs in ${VCSs} ; do
+ [[ -n ${(M)disabled:#${vcs}} ]] && continue
+ vcs_comm=()
+ VCS_INFO_${vcs}_detect && (( found = 1 )) && break
+ done
+
+ (( found == 0 )) && return 0
+
+ string=$(VCS_INFO_${vcs}_get_data) || return 1
+ printf '%s' ${string}
+ return 0
+}
+# }}}
+
+# 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}%} "
+fi
+
+# }}}