From 5e2a1cf4cc261d9b9c6f9dea5a53983e04afe275 Mon Sep 17 00:00:00 2001 From: Frank Terbeck Date: Tue, 31 May 2011 19:07:06 +0000 Subject: Jan Pobrislo: 29411: vcs_info: Major bzr backend update. --- Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr | 89 +++++++++++++++++++++-- 1 file changed, 83 insertions(+), 6 deletions(-) (limited to 'Functions') diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr b/Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr index 5d4deaac9..cae1a3b08 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr @@ -1,13 +1,52 @@ -## vim:ft=zsh +## vim:ft=zsh et ## bazaar support by: Frank Terbeck +## mostly rewritten by: Jan Pobrislo ## Distributed under the same BSD-ish license as zsh itself. setopt localoptions noksharrays extendedglob NO_shwordsplit -local bzrbase bzrbr +local bzrbase bzrbr bzr_changes bzr_type local -a bzrinfo -local -xA hook_com +local -xA hook_com bzr_info + +VCS_INFO_bzr_get_info() { + bzrinfo=( ${(s.:.)$( ${vcs_comm[cmd]} version-info --custom \ + --template="{revno}:{branch_nick}:{clean}")} ) + if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" "check-for-changes" + then + VCS_INFO_bzr_get_changes + elif [[ ${bzrinfo[2]} == 1 ]] + then + bzr_changes = '1' + fi +} + +VCS_INFO_bzr_get_info_restricted() { + # we are forbidden from fetching info on bound branch from remote repository + bzrinfo=( $(${vcs_comm[cmd]} revno) ${bzrbase:t} ) + if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" "check-for-changes" && \ + [[ ! $bzr_type == lightweigth ]] + then + VCS_INFO_bzr_get_changes + fi +} + +VCS_INFO_bzr_get_changes() { + local -A counts + local line flag + bzr_changes=$( + ${vcs_comm[cmd]} stat -SV | while read flag line + do + counts[${flag}]=$(( ${counts[${flag}]:-0} + 1 )) + done + for flag in ${(k)counts} + do + printf "%s:%d " $flag ${counts[${flag}]} + done + ) +} if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" "use-simple" ; then + # simple parsing will fail to fetch information from lightweigth checkouts bzrbase=${vcs_comm[basedir]} bzrinfo[2]=${bzrbase:t} if [[ -f ${bzrbase}/.bzr/branch/last-revision ]] ; then @@ -15,9 +54,46 @@ if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" "use-simple" ; then bzrinfo[1]=${${bzrinfo[1]}%% *} fi else - bzrbase=${${(M)${(f)"$( ${vcs_comm[cmd]} info )"}:# ##branch\ root:*}/*: ##/} - bzrinfo=( ${${${(M)${(f)"$( ${vcs_comm[cmd]} version-info )"}:#(#s)(revno|branch-nick)*}/*: /}/*\//} ) + # Parse the output of 'bzr info' into associative array bzr_info + ${vcs_comm[cmd]} info | { + local line key value dirtype + read dirtype + grep '^[ a-zA-Z0-9]\+: ' | while read line + do + value=${line#*': '} + key=${${line%%: *}// /_} + bzr_info[$key]=$value + done + } + + case "$dirtype" in + ('Checkout'*) + bzr_type=checkout + bzrbase=${bzr_info[checkout_root]} ;; + ('Repository checkout'*) + bzr_type=checkout + bzrbase=${bzr_info[repository_checkout_root]} ;; + ('Lightweight checkout'*) + bzr_type=lightweigth + bzrbase=${bzr_info[light_checkout_root]} ;; + (*) + bzr_type=standalone + bzrbase=${bzr_info[branch_root]} ;; + esac + bzrbase="$(VCS_INFO_realpath ${bzrbase})" + + if [ -n "${bzr_info[checkout_of_branch]}" ] && \ + zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" "use-server" + then + VCS_INFO_bzr_get_info + else + case ${bzr_info[checkout_of_branch]} in + (file://*) VCS_INFO_bzr_get_info ;; + (*://*) VCS_INFO_bzr_get_info_restricted ;; + (*) VCS_INFO_bzr_get_info ;; + esac + fi fi rrn=${bzrbase:t} @@ -29,5 +105,6 @@ else bzrbr=${hook_com[branch-replace]} fi hook_com=() -VCS_INFO_formats '' "${bzrbr}" "${bzrbase}" '' '' "${bzrinfo[1]}" '' + +VCS_INFO_formats '' "${bzrbr}" "${bzrbase}" '' "${bzr_changes}" "${bzrinfo[1]}" "${bzr_changes}" return 0 -- cgit 1.4.1