I use that in my gen-applied-string hook. --- This answers my question from workers/49724. Doc/Zsh/contrib.yo | 12 ++++++++++++ Functions/VCS_Info/Backends/VCS_INFO_get_data_git | 2 +- Functions/VCS_Info/Backends/VCS_INFO_get_data_hg | 2 +- Functions/VCS_Info/VCS_INFO_quilt | 7 ++++++- Functions/VCS_Info/VCS_INFO_set-patch-format | 8 +++++++- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index eb5bbafb2..2cda891ec 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -1669,6 +1669,10 @@ available as tt(%p) in the tt(patch-format) and tt(nopatch-format) styles. This hook is, in concert with tt(set-patch-format), responsible for tt(%)-escaping that value for use in the prompt. (See ifzman(the bf(Oddities) section)ifnzman(noderef(vcs_info Oddities)).) + +The tt(quilt) backend passes to this hook the inputs +tt(${hook_com[quilt-patches-dir]}) and, if it has been +determined, tt(${hook_com[quilt-pc-dir]}). ) item(tt(gen-unapplied-string))( Called in the tt(git) (with tt(stgit) or during rebase), and tt(hg) (with @@ -1687,6 +1691,10 @@ tt(patch-format) and tt(nopatch-format) styles. This hook is, in concert with tt(set-patch-format), responsible for tt(%)-escaping that value for use in the prompt. (See ifzman(the bf(Oddities) section)ifnzman(noderef(vcs_info Oddities)).) + +The tt(quilt) backend passes to this hook the inputs +tt(${hook_com[quilt-patches-dir]}) and, if it has been +determined, tt(${hook_com[quilt-pc-dir]}). ) item(tt(gen-mqguards-string))( Called in the tt(hg) backend when tt(guards-string) is generated; the @@ -1769,6 +1777,10 @@ This hook is, in concert with the tt(gen-applied-string) or tt(gen-unapplied-string) hooks if they are defined, responsible for tt(%)-escaping the final tt(patch-format) value for use in the prompt. (See ifzman(the bf(Oddities) section)ifnzman(noderef(vcs_info Oddities)).) + +The tt(quilt) backend passes to this hook the inputs +tt(${hook_com[quilt-patches-dir]}) and, if it has been +determined, tt(${hook_com[quilt-pc-dir]}). ) item(tt(set-message))( Called each time before a `tt(vcs_info_msg_)var(N)tt(_)' message is set. diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git index fe084dffb..e45eebc8e 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git @@ -132,7 +132,7 @@ VCS_INFO_git_handle_patches () { 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 } diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg index b123e2270..0041a153c 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg @@ -225,7 +225,7 @@ if zstyle -T ":vcs_info:${vcs}:${usercontext}:${rrn}" get-mq \ VCS_INFO_set-patch-format 'mqpatches' 'applied_string' \ 'mqunapplied' 'unapplied_string' \ ":vcs_info:${vcs}:${usercontext}:${rrn}" hgmqstring \ - extra_hook_com VCS_INFO_hg_extra_zformats + extra_hook_com VCS_INFO_hg_extra_zformats '' hgmqstring=$REPLY fi diff --git a/Functions/VCS_Info/VCS_INFO_quilt b/Functions/VCS_Info/VCS_INFO_quilt index ee242f552..ce5b41f24 100644 --- a/Functions/VCS_Info/VCS_INFO_quilt +++ b/Functions/VCS_Info/VCS_INFO_quilt @@ -179,10 +179,15 @@ function VCS_INFO_quilt-patch2subject() { done } + typeset -A quilt_extra_info=( + quilt-patches-dir ${patches} + ${pc:+"quilt-pc-dir"} $pc + ) + VCS_INFO_set-patch-format 'applied' 'applied_string' \ 'unapplied' 'unapplied_string' \ ${context} qstring \ - '' '' + quilt_extra_info '' quilt_extra_info qstring=$REPLY case ${mode} in diff --git a/Functions/VCS_Info/VCS_INFO_set-patch-format b/Functions/VCS_Info/VCS_INFO_set-patch-format index c35b695c3..1c774a7f6 100644 --- a/Functions/VCS_Info/VCS_INFO_set-patch-format +++ b/Functions/VCS_Info/VCS_INFO_set-patch-format @@ -15,6 +15,8 @@ # $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 a function that sets $reply to extra arguments for the patch-format zformat call, or '' for none +# $9 - name of an assoc parameter with extra $hook_com key-value pairs for the +# gen-applied-string & gen-unapplied-string hook invocations, or '' for none # # The expanded patch-format string is returned in $REPLY. # @@ -22,8 +24,10 @@ # - $hook_com is overwritten and the keys 'applied', 'applied-n', # 'unapplied', 'unapplied-n', 'all-n' are set. { + hook_com=() + local applied_needs_escaping='unknown' - local unapplied_needs_escaping='unknown' + hook_com+=( ${9:+"${(@kvP)9}"} ) if VCS_INFO_hook 'gen-applied-string' "${(@P)1}"; then if (( ${(P)#1} )); then REPLY=${(P)1[1]} @@ -37,6 +41,8 @@ : ${(P)2::=$REPLY} hook_com=() + local unapplied_needs_escaping='unknown' + hook_com+=( ${9:+"${(@kvP)9}"} ) if VCS_INFO_hook 'gen-unapplied-string' "${(@P)3}"; then REPLY=${(P)#3} unapplied_needs_escaping='yes'
For instance, with 4 applied patches, 5 unapplied patches, and no guards involved, the patch-format style would indicate 9 (= 4+5) unapplied patches and 4 applied patches. --- Functions/VCS_Info/Backends/VCS_INFO_get_data_hg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg index 0041a153c..d789d662a 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg @@ -183,6 +183,9 @@ if zstyle -T ":vcs_info:${vcs}:${usercontext}:${rrn}" get-mq \ # Skip commented lines [[ ${i_patch} == [[:space:]]#"#"* ]] && continue + # Skip applied patches + (( ${+mqpatches[(re)${i_patch}]} )) && continue + # Separate negative and positive guards to more easily find the # intersection of active guards with patch guards i_patchguards=( ${(s: :)i_patchguards} )
Use a NUL separator just in case someone's hg mq patch names include literal spaces. That means gen-applied-string hooks have to split their arguments one way in the hg mq case and another way in every other case. --- Doc/Zsh/contrib.yo | 18 +++++++++++----- .../VCS_Info/Backends/VCS_INFO_get_data_hg | 21 +++++++++++++++++++ README | 7 +++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index 2cda891ec..c68fe33ef 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -1656,12 +1656,20 @@ The arguments to this hook describe applied patches in the opposite order, which means that the first argument is the top-most patch and so forth. -When the patches' log messages can be extracted, those are embedded -within each argument after a space, so each argument is of the form +Each argument contains both a patch name and, if possible, the first line of +that patch's log message or description. A literal `tt(?)' is substituted +when the log message or description is empty or unable to be determined. + +In the tt(mq) backend, patch names may contain spaces, and each argument +is of the form `var(patch name)tt($'\0')var(first line of the log message)', +using a literal NUL as a separator. + +In the other backends, each argument is of the form `var(patch-name) var(first line of the log message)', where var(patch-name) -contains no whitespace. The tt(mq) backend passes arguments of -the form `var(patch name)', with possible embedded spaces, but without -extracting the patch's log message. +contains no whitespace. Typically, one would use +tt(${argv[1]#* }) and tt(${argv[1]%% *}) to separate the var(patch-name) and +var(first line of the log message) parts. (See the file +tt(Misc/vcs_info-examples) in the source distribution for a complete example.) When setting tt(ret) to non-zero, the string in tt(${hook_com[applied-string]}) will be diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg index d789d662a..cfaa3fe5e 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg @@ -211,6 +211,27 @@ if zstyle -T ":vcs_info:${vcs}:${usercontext}:${rrn}" get-mq \ done < ${mqseriesfile} fi + () { + local -a tmp + local i + + tmp=() + for i in "${mqpatches[@]}" ; do + VCS_INFO_patch2subject "${patchdir}/$i" + [[ $REPLY == '# HG changeset patch' ]] && unset REPLY + tmp+=( "$i"$'\0'"${REPLY="?"}" ) + done + mqpatches=( "${tmp[@]}" ) + + tmp=() + for i in "${mqunapplied[@]}" ; do + VCS_INFO_patch2subject "${patchdir}/$i" + [[ $REPLY == '# HG changeset patch' ]] && unset REPLY + tmp+=( "$i"$'\0'"${REPLY="?"}" ) + done + mqunapplied=( "${tmp[@]}" ) + } + if VCS_INFO_hook 'gen-mqguards-string' "${mqguards[@]}"; then guards_string=${(j:,:)mqguards} # TODO: %-escape extra_zformats[g:...] value diff --git a/README b/README index 3ef8afcd1..25a61a4b8 100644 --- a/README +++ b/README @@ -102,6 +102,13 @@ consistent with most other sh implementations. getopts now calculates OPTIND in a similar manner to other shells when the POSIX_BUILTINS option is enabled. +vcs_info hg: Arguments to the gen-applied-string and gen-unapplied-string hooks +now contain not only the patch's name but also the first line of the patch's +log message. The two parts are separated by a NUL byte. +. +This only affects you if you have defined custom vcs_info hook functions (see +the output of 'zstyle -L ":vcs_info:*" hooks' and 'which -m -- "+vi*"' [sic]). + Incompatibilities between 5.7.1 and 5.8 ---------------------------------------
Hi Daniel,
On Sat, Jan 29, 2022, at 11:15 AM, Daniel Shahaf wrote:
> Use a NUL separator just in case someone's hg mq patch names include
> literal spaces. That means gen-applied-string hooks have to split their
> arguments one way in the hg mq case and another way in every other case.
> ---
> Doc/Zsh/contrib.yo | 18 +++++++++++-----
> .../VCS_Info/Backends/VCS_INFO_get_data_hg | 21 +++++++++++++++++++
> README | 7 +++++++
> 3 files changed, 41 insertions(+), 5 deletions(-)
Were you planning on pushing this?
--
vq
Lawrence Velázquez wrote on Thu, Mar 31, 2022 at 02:00:03 -0400:
> Hi Daniel,
>
> On Sat, Jan 29, 2022, at 11:15 AM, Daniel Shahaf wrote:
> > Use a NUL separator just in case someone's hg mq patch names include
> > literal spaces. That means gen-applied-string hooks have to split their
> > arguments one way in the hg mq case and another way in every other case.
> > ---
> > Doc/Zsh/contrib.yo | 18 +++++++++++-----
> > .../VCS_Info/Backends/VCS_INFO_get_data_hg | 21 +++++++++++++++++++
> > README | 7 +++++++
> > 3 files changed, 41 insertions(+), 5 deletions(-)
>
> Were you planning on pushing this?
I'm ambivalent, since it wasn't user-requested and makes the
gen-applied-string API inelegant (as explained in the log message).
Thanks for asking! It has been on my todo list ever since it was
posted, so it's good to (UK)table it again.
Cheers,
Daniel
(Life goal $((++N)): get C-style casts into the OED)
(Life goal $((++N)): get C++-style casts into the OED)