summaryrefslogtreecommitdiff
path: root/Functions/VCS_Info/VCS_INFO_set-patch-format
diff options
context:
space:
mode:
authorDaniel Shahaf <d.s@daniel.shahaf.name>2017-02-05 08:28:13 +0000
committerDaniel Shahaf <d.s@daniel.shahaf.name>2017-02-09 15:24:04 +0000
commitecd88284f358cbcd787757184bbf8704779cab1a (patch)
tree98fc9e76a873dc91e18a8295070373d9727ac551 /Functions/VCS_Info/VCS_INFO_set-patch-format
parente3bc63f00e1a11df6a8a214a5d4a2e3feb59f28a (diff)
downloadzsh-ecd88284f358cbcd787757184bbf8704779cab1a.tar.gz
zsh-ecd88284f358cbcd787757184bbf8704779cab1a.zip
40492: vcs_info: Escape '%' signs in payloads.
Test case: a patch whose subject is '%Sfoo%sbar'. ('S' and 's' are expandos both in prompts and in the 'formats' style.)
Diffstat (limited to 'Functions/VCS_Info/VCS_INFO_set-patch-format')
-rw-r--r--Functions/VCS_Info/VCS_INFO_set-patch-format14
1 files changed, 14 insertions, 0 deletions
diff --git a/Functions/VCS_Info/VCS_INFO_set-patch-format b/Functions/VCS_Info/VCS_INFO_set-patch-format
index c5da36808..cdf2d303e 100644
--- a/Functions/VCS_Info/VCS_INFO_set-patch-format
+++ b/Functions/VCS_Info/VCS_INFO_set-patch-format
@@ -18,12 +18,15 @@
# - $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
@@ -32,6 +35,7 @@
if VCS_INFO_hook 'gen-unapplied-string' "${(@P)3}"; then
REPLY=${(P)#3}
+ unapplied_needs_escaping='yes'
else
REPLY=${hook_com[unapplied-string]}
fi
@@ -54,12 +58,22 @@
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=()
+
}