about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr89
2 files changed, 90 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index aa9a266d4..73a66e5ec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-05-31  Frank Terbeck  <ft@bewatermyfriend.org>
+
+	* Jan Pobrislo: 29411:
+	Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr: vcs_info: Major
+	bzr backend update.
+
 2011-05-31  Barton E. Schaefer  <schaefer@zsh.org>
 
 	* 29410: Test/V01zmodload.ztst: skip autoload persistence test
@@ -14893,5 +14899,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5348 $
+* $Revision: 1.5349 $
 *****************************************************
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 <ft@bewatermyfriend.org>
+## mostly rewritten by: Jan Pobrislo <ccx@webprojekty.cz>
 ## 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