summaryrefslogtreecommitdiff
path: root/Functions/VCS_Info
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/VCS_Info')
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_git41
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_hg50
-rw-r--r--Functions/VCS_Info/VCS_INFO_patch2subject17
-rw-r--r--Functions/VCS_Info/VCS_INFO_quilt40
-rw-r--r--Functions/VCS_Info/VCS_INFO_set-patch-format79
-rw-r--r--Functions/VCS_Info/vcs_info1
6 files changed, 121 insertions, 107 deletions
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
index 63109aa46..f3dd95dcb 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
@@ -120,41 +120,15 @@ VCS_INFO_git_getbranch () {
}
VCS_INFO_git_handle_patches () {
- local git_applied_s git_unapplied_s gitmsg git_all
+ local git_applied_s git_unapplied_s gitmsg
git_patches_applied=(${(Oa)git_patches_applied})
git_patches_unapplied=(${(Oa)git_patches_unapplied})
- (( git_all = ${#git_patches_applied} + ${#git_patches_unapplied} ))
- if VCS_INFO_hook 'gen-applied-string' "${git_patches_applied[@]}"; then
- if (( ${#git_patches_applied} )); then
- git_applied_s=${git_patches_applied[1]}
- else
- git_applied_s=""
- fi
- else
- git_applied_s=${hook_com[applied-string]}
- fi
- hook_com=()
- if VCS_INFO_hook 'gen-unapplied-string' "${git_patches_unapplied[@]}"; then
- git_patches_unapplied=${#git_patches_unapplied}
- else
- git_patches_unapplied=${hook_com[unapplied-string]}
- fi
-
- if (( ${#git_patches_applied} )); then
- zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" patch-format gitmsg || gitmsg="%p (%n applied)"
- else
- zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" nopatch-format gitmsg || gitmsg="no patch applied"
- fi
- hook_com=( applied "${git_applied_s}" unapplied "${git_patches_unapplied}"
- applied-n ${#git_patches_applied} unapplied-n ${#git_patches_unapplied} all-n ${git_all} )
- if VCS_INFO_hook 'set-patch-format' "${gitmsg}"; then
- zformat -f gitmisc "${gitmsg}" "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
- "n:${#git_patches_applied}" "c:${#git_patches_unapplied}" "a:${git_all}"
- else
- gitmisc=${hook_com[patch-replace]}
- fi
- hook_com=()
+ VCS_INFO_set-patch-format 'git_patches_applied' 'git_applied_s' \
+ 'git_patches_unapplied' 'git_unapplied_s' \
+ ":vcs_info:${vcs}:${usercontext}:${rrn}" gitmsg \
+ '' ''
+ gitmisc=$REPLY
}
gitdir=${vcs_comm[gitdir]}
@@ -182,7 +156,7 @@ if (( querystaged || queryunstaged )) && \
[[ "$(${vcs_comm[cmd]} rev-parse --is-inside-work-tree 2> /dev/null)" == 'true' ]] ; then
# Default: off - these are potentially expensive on big repositories
if (( queryunstaged )) ; then
- ${vcs_comm[cmd]} diff --no-ext-diff --ignore-submodules=dirty --quiet --exit-code ||
+ ${vcs_comm[cmd]} diff --no-ext-diff --ignore-submodules=dirty --quiet --exit-code 2> /dev/null ||
gitunstaged=1
fi
if (( querystaged )) ; then
@@ -205,6 +179,7 @@ local patchdir=${gitdir}/patches/${gitbranch}
if [[ -d $patchdir ]] && [[ -f $patchdir/applied ]] \
&& [[ -f $patchdir/unapplied ]]
then
+ # stgit
git_patches_applied=(${(f)"$(< "${patchdir}/applied")"})
git_patches_unapplied=(${(f)"$(< "${patchdir}/unapplied")"})
VCS_INFO_git_handle_patches
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
index 69b7db304..d4030125c 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
@@ -13,7 +13,7 @@ local hgbase bmfile branchfile rebasefile dirstatefile mqseriesfile \
hgbmstring hgmqstring applied_string unapplied_string guards_string
local -a hgid_args defrevformat defbranchformat \
- hgbmarks mqpatches mqseries mqguards mqunapplied hgmisc \
+ hgbmarks mqpatches mqguards mqunapplied hgmisc \
i_patchguards i_negguards i_posguards
local -A hook_com
@@ -175,9 +175,6 @@ if zstyle -T ":vcs_info:${vcs}:${usercontext}:${rrn}" get-mq \
# Skip commented lines
[[ ${i_patch} == [[:space:]]#"#"* ]] && continue
- # Keep list of all patches
- mqseries+=( $i_patch )
-
# Separate negative and positive guards to more easily find the
# intersection of active guards with patch guards
i_patchguards=( ${(s: :)i_patchguards} )
@@ -203,50 +200,21 @@ if zstyle -T ":vcs_info:${vcs}:${usercontext}:${rrn}" get-mq \
done < ${mqseriesfile}
fi
- if VCS_INFO_hook 'gen-applied-string' "${mqpatches[@]}"; then
- (( ${#mqpatches} )) && applied_string=${mqpatches[1]}
- else
- applied_string=${hook_com[applied-string]}
- fi
-
- hook_com=()
-
- if VCS_INFO_hook 'gen-unapplied-string' "${mqunapplied[@]}"; then
- unapplied_string=${#mqunapplied}
- else
- unapplied_string=${hook_com[unapplied-string]}
- fi
-
- hook_com=()
-
if VCS_INFO_hook 'gen-mqguards-string' "${mqguards[@]}"; then
guards_string=${(j:,:)mqguards}
+ # TODO: %-escape extra_zformats[g:...] value
else
guards_string=${hook_com[guards-string]}
fi
- if (( ${#mqpatches} )); then
- zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" patch-format \
- hgmqstring || hgmqstring="%p (%n applied)"
- else
- zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" nopatch-format \
- hgmqstring || hgmqstring="no patch applied"
- fi
-
- hook_com=( applied "${applied_string}" unapplied "${unapplied_string}"
- applied-n ${#mqpatches} unapplied-n ${#mqunapplied} all-n ${#mqseries}
- guards "${guards_string}" guards-n ${#mqguards} )
+ local -A extra_hook_com=( guards "${guards_string}" guards-n ${#mqguards} )
+ local -a extra_zformats=( "g:${extra_hook_com[guards]}" "G:${#mqguards}" )
- if VCS_INFO_hook 'set-patch-format' ${qstring}; then
- zformat -f hgmqstring "${hgmqstring}" \
- "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
- "n:${#mqpatches}" "c:${#mqunapplied}" "a:${#mqseries}" \
- "g:${hook_com[guards]}" "G:${#mqguards}"
- else
- hgmqstring=${hook_com[patch-replace]}
- fi
-
- hook_com=()
+ VCS_INFO_set-patch-format 'mqpatches' 'applied_string' \
+ 'mqunapplied' 'unapplied_string' \
+ ":vcs_info:${vcs}:${usercontext}:${rrn}" hgmqstring \
+ extra_hook_com extra_zformats
+ hgmqstring=$REPLY
fi
diff --git a/Functions/VCS_Info/VCS_INFO_patch2subject b/Functions/VCS_Info/VCS_INFO_patch2subject
index 583467bc8..e222e8382 100644
--- a/Functions/VCS_Info/VCS_INFO_patch2subject
+++ b/Functions/VCS_Info/VCS_INFO_patch2subject
@@ -1,6 +1,7 @@
# This function takes as an argument a filename of a patch and sets $REPLY to
# a single-line "subject", or unsets it if no subject could be extracted.
{
+ setopt localoptions extendedglob
integer i
integer -r LIMIT=10
local -a lines
@@ -34,6 +35,22 @@
elif [[ ${lines[1]} == '# HG changeset patch' ]] && { needle=${${lines:#([#]*)}[1]}; [[ -n $needle ]] }; then
# Mercurial patch
REPLY=$needle
+ elif [[ ${lines[1]} == "commit "[0-9a-f](#c40) ]] &&
+ [[ ${lines[2]} == "Author:"* && ${lines[3]} == "Date:"* ]] &&
+ (( ! ${+lines[4]} )); then
+ # `git show` output.
+ #
+ # The log message is after the first blank line, so open() the file
+ # again. Also check whether the following line (second line of the
+ # log message itself) is empty.
+ {
+ repeat 4 { IFS= read -r }
+ IFS= read -r needle; needle=${needle#' '}
+ if IFS= read -r; REPLY=${REPLY#' '}; [[ -n $REPLY ]]; then
+ needle+='...'
+ fi
+ } < "$1"
+ REPLY=$needle
elif (( ${+lines[1]} )); then
# The first line of the file is not part of the diff.
REPLY=${lines[1]}
diff --git a/Functions/VCS_Info/VCS_INFO_quilt b/Functions/VCS_Info/VCS_INFO_quilt
index 4c61506cd..381b58489 100644
--- a/Functions/VCS_Info/VCS_INFO_quilt
+++ b/Functions/VCS_Info/VCS_INFO_quilt
@@ -91,7 +91,7 @@ function VCS_INFO_quilt() {
local patches pc tmp qstring root
local -i ret
local context
- local -a applied unapplied all applied_string unapplied_string quiltcommand quilt_env
+ local -a applied unapplied applied_string unapplied_string quiltcommand quilt_env
local -A hook_com
context=":vcs_info:${vcs}.quilt-${mode}:${usercontext}:${rrn}"
@@ -171,41 +171,15 @@ function VCS_INFO_quilt() {
}
fi
- all=( ${(Oa)applied} ${unapplied} )
-
- if VCS_INFO_hook 'gen-applied-string' "${applied[@]}"; then
- if (( ${#applied} )); then
- applied_string=${applied[1]}
- else
- applied_string=""
- fi
- else
- applied_string=${hook_com[applied-string]}
- fi
- hook_com=()
- if VCS_INFO_hook 'gen-unapplied-string' "${unapplied[@]}"; then
- unapplied_string="${#unapplied}"
- else
- unapplied_string=${hook_com[unapplied-string]}
- fi
-
- if (( ${#applied} )); then
- zstyle -s "${context}" patch-format qstring || qstring="%p (%n applied)"
- else
- zstyle -s "${context}" nopatch-format qstring || qstring="no patch applied"
- fi
- hook_com=( applied "${applied_string}" unapplied "${unapplied_string}"
- applied-n ${#applied} unapplied-n ${#unapplied} all-n ${#all} )
- if VCS_INFO_hook 'set-patch-format' ${qstring}; then
- zformat -f qstring "${qstring}" "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
- "n:${#applied}" "c:${#unapplied}" "a:${#all}"
- else
- qstring=${hook_com[patch-replace]}
- fi
- hook_com=()
+ VCS_INFO_set-patch-format 'applied' 'applied_string' \
+ 'unapplied' 'unapplied_string' \
+ ${context} qstring \
+ '' ''
+ qstring=$REPLY
case ${mode} in
(standalone)
+ backend_misc[patches]=${qstring}
VCS_INFO_formats '' '' "${root}" '' '' '' "${qstring}"
VCS_INFO_set
;;
diff --git a/Functions/VCS_Info/VCS_INFO_set-patch-format b/Functions/VCS_Info/VCS_INFO_set-patch-format
new file mode 100644
index 000000000..cdf2d303e
--- /dev/null
+++ b/Functions/VCS_Info/VCS_INFO_set-patch-format
@@ -0,0 +1,79 @@
+# This function is the common guts of the gen-applied-string /
+# gen-unapplied-string / set-patch-format dance of several backends.
+#
+# Parameters:
+# $1 - name of an array parameter to be the argument to gen-applied-string
+# $2 - name of a parameter to store the applied-string in
+# $3 - name of an array parameter to be the argument to gen-unapplied-string
+# $4 - name of a parameter to store the unapplied-string in
+# $5 - context argument for use in zstyle getters
+# $6 - name of a parameter to store a patch-format format string in
+# $7 - name of an assoc parameter with extra $hook_com key-value pairs for the
+# set-patch-format hook invocation, or '' for none
+# $8 - name of an array parameter with extra arguments for the patch-format zformat call, or '' for empty
+#
+# The expanded patch-format string is returned in $REPLY.
+#
+# Output:
+# - $hook_com is overwritten and the keys 'applied', 'applied-n',
+# 'unapplied', 'unapplied-n', 'all-n' are set.
+{
+ local applied_needs_escaping='unknown'
+ local unapplied_needs_escaping='unknown'
+ if VCS_INFO_hook 'gen-applied-string' "${(@P)1}"; then
+ if (( ${(P)#1} )); then
+ REPLY=${(P)1[1]}
+ else
+ REPLY=""
+ fi
+ applied_needs_escaping='yes'
+ else
+ REPLY=${hook_com[applied-string]}
+ fi
+ : ${(P)2::=$REPLY}
+ hook_com=()
+
+ if VCS_INFO_hook 'gen-unapplied-string' "${(@P)3}"; then
+ REPLY=${(P)#3}
+ unapplied_needs_escaping='yes'
+ else
+ REPLY=${hook_com[unapplied-string]}
+ fi
+ : ${(P)4::=$REPLY}
+ hook_com=()
+
+ if (( ${(P)#1} )); then
+ zstyle -s "${5}" patch-format REPLY || REPLY="%p (%n applied)"
+ else
+ zstyle -s "${5}" nopatch-format REPLY || REPLY="no patch applied"
+ fi
+ : ${(P)6::=$REPLY}
+
+ hook_com=(
+ applied-n ${(P)#1}
+ applied "${(P)2}"
+ unapplied-n ${(P)#3}
+ unapplied "${(P)4}"
+ )
+ hook_com[all-n]=$(( ${hook_com[applied-n]} + ${hook_com[unapplied-n]} ))
+ hook_com+=( ${7:+"${(@kvP)7}"} )
+ if VCS_INFO_hook 'set-patch-format' "${(P)6}"; then
+ # Escape the value for use in $PS1
+ if [[ $applied_needs_escaping == 'yes' ]]; then
+ hook_com[applied]=${hook_com[applied]//'%'/%%}
+ fi
+ if [[ $unapplied_needs_escaping == 'yes' ]]; then
+ hook_com[unapplied]=${hook_com[unapplied]//'%'/%%}
+ fi
+
+ zformat -f REPLY "${(P)6}" "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
+ "n:${hook_com[applied-n]}" "c:${hook_com[unapplied-n]}" \
+ "a:${hook_com[all-n]}" \
+ ${8:+"${(@P)8}"}
+ else
+ unset applied_needs_escaping unapplied_needs_escaping # the hook deals with escaping
+ REPLY=${hook_com[patch-replace]}
+ fi
+ hook_com=()
+
+}
diff --git a/Functions/VCS_Info/vcs_info b/Functions/VCS_Info/vcs_info
index 24ae98e52..4e9ac6c6a 100644
--- a/Functions/VCS_Info/vcs_info
+++ b/Functions/VCS_Info/vcs_info
@@ -21,6 +21,7 @@ static_functions=(
VCS_INFO_get_cmd
VCS_INFO_hexdump
VCS_INFO_hook
+ VCS_INFO_set-patch-format
VCS_INFO_maxexports
VCS_INFO_nvcsformats
VCS_INFO_patch2subject