## vim:ft=zsh ## subversion support by: ## + Frank Terbeck ## + Phil Pennock ## Distributed under the same BSD-ish license as zsh itself. setopt localoptions noksharrays extendedglob NO_shwordsplit local svnbase svnbranch a b rrn local -i rc local -A svninfo parentinfo cwdinfo local -A hook_com integer -r SVN_ERR_WC_UPGRADE_REQUIRED=155036 # from /usr/local/include/subversion-1/svn_error_codes.h svnbase="."; svninfo=() # Unfortunately, `$pipestatus' is broken currently. Until that problem is # resolved, here is a workaround that will get things done, without using it. # Clumsily, but that's life. local -a dat dat=( ${(f)"$(${vcs_comm[cmd]} info --non-interactive 2>&1)"} ) rc=$? if (( rc != 0 )) ; then if (( rc == 1 )) && [[ -n ${(M)dat:#"svn: E${SVN_ERR_WC_UPGRADE_REQUIRED}: "*} ]]; then hook_com=() VCS_INFO_formats '' '?' '?' '' '' '?' 'upgrade required' return $? else return 1 fi fi # The following line is the real code, the following is the workaround. #${vcs_comm[cmd]} info --non-interactive \ print -l "${dat[@]}" \ |& while IFS=: read a b; do svninfo[${a// /_}]="${b## #}" done #rc=${pipestatus[1]} #(( rc != 0 )) && return 1 cwdinfo=(${(kv)svninfo}) # Set svnbase to the wcroot path and svninfo to its `svn info`. if (( ${+svninfo[Working_Copy_Root_Path]} )); then # svn 1.7+ svnbase=${svninfo[Working_Copy_Root_Path]} ${vcs_comm[cmd]} info --non-interactive -- "${svnbase}" | while IFS=: read a b; do svninfo[${a// /_}]="${b## #}"; done else # svn 1.0-1.6 svnbase=${svnbase:P} while [[ -d "${svnbase:h}/.svn" ]]; do parentinfo=() ${vcs_comm[cmd]} info --non-interactive -- "${svnbase:h}" | while IFS=: read a b; do parentinfo[${a// /_}]="${b## #}"; done [[ ${parentinfo[Repository_UUID]} != ${svninfo[Repository_UUID]} ]] && break svninfo=(${(kv)parentinfo}) svnbase=${svnbase:h} if [[ $svnbase == '/' ]]; then break fi done fi rrn=${svnbase:t} VCS_INFO_set-branch-format "${svninfo[URL]##*/}" "${cwdinfo[Revision]}" && svnbranch="${REPLY}" VCS_INFO_formats '' "${svnbranch}" "${svnbase}" '' '' "${cwdinfo[Revision]}" '' return 0