From e1946bacf82653b4795793abe5ae095e3e65fea7 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Thu, 12 Mar 2020 18:06:21 +0000 Subject: 45540: vcs_info git: In non-interactive rebases, compute patch names for unapplied patches. --- ChangeLog | 5 ++++ Doc/Zsh/contrib.yo | 4 +-- Functions/VCS_Info/Backends/VCS_INFO_get_data_git | 31 ++++++++++++++++++----- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4687c2212..edf814dd9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2020-03-15 Daniel Shahaf + * 45540: Doc/Zsh/contrib.yo, + Functions/VCS_Info/Backends/VCS_INFO_get_data_git: vcs_info git: + In non-interactive rebases, compute patch names for unapplied + patches. + * 45543: Functions/VCS_Info/VCS_INFO_quilt, README: vcs_info quilt: Allow quiltcommand to be a function. diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index c6bf745b7..0909cd4f5 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -1177,7 +1177,7 @@ If there are two different ways of gathering information, you can select the simpler one by setting this style to true; the default is to use the not-that-simple code, which is potentially a lot slower but might be more accurate in all possible cases. This style is -used by the tt(bzr) and tt(hg) backends. In the case of tt(hg) it will invoke +used by the tt(bzr), tt(hg), and tt(git) backends. In the case of tt(hg) it will invoke the external hexdump program to parse the binary dirstate cache file; this method will not return the local revision number. ) @@ -1236,7 +1236,7 @@ item(tt(get-unapplied))( This boolean style controls whether a backend should attempt to gather a list of unapplied patches (for example with Mercurial Queue patches). -Used by the tt(quilt) and tt(hg) backends. +Used by the tt(quilt), tt(hg), and tt(git) backends. ) enditem() diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git index f7c4210e8..97a04b6ce 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git @@ -261,17 +261,20 @@ elif [[ -d "${gitdir}/rebase-apply" ]]; then # 'git rebase' without -i patchdir="${gitdir}/rebase-apply" local next="${patchdir}/next" + local this_patch_file if [[ -f $next ]]; then local cur=$(< $next) local p subject - # Fake patch names for all but current patch + # Fake patch names for patches "before" the current patch + # + # Note: With git 2.24, (( cur == 1 )), so the loop body never runs. for ((p = 1; p < cur; p++)); do printf -v "git_patches_applied[$p]" "%04d ?" "$p" done + # Set $subject to the info for the current patch if [[ -f "${patchdir}/msg-clean" ]]; then subject="${$(< "${patchdir}/msg-clean")[(f)1]}" - elif local this_patch_file - printf -v this_patch_file "%s/%04d" "${patchdir}" "${cur}" + elif printf -v this_patch_file "%s/%04d" "${patchdir}" "${cur}" [[ -f $this_patch_file ]] then () { @@ -286,11 +289,27 @@ elif [[ -d "${gitdir}/rebase-apply" ]]; then else git_patches_applied+=("? $subject") fi - local last="$(< "${patchdir}/last")" - if (( cur+1 <= last )); then - git_patches_unapplied=( {$((cur+1))..$last} ) + # Handle patches scheduled for after the current patch, if instructed to. + if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" get-unapplied; then + local last="$(< "${patchdir}/last")" + if [[ -r ${patchdir}/original-commit && -r ${patchdir}/orig-head ]] && + ! zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" use-simple + then + git_patches_unapplied+=( ${(f)"$(${vcs_comm[cmd]} log --reverse --pretty="%h %s" "$(<${patchdir}/original-commit)..$(<${patchdir}/orig-head)")"} ) + else + for ((p = cur+1; p <= last; p++)); do + printf -v this_patch_file "%s/%04d" "${patchdir}" "${p}" + if [[ -f $this_patch_file ]]; then + VCS_INFO_patch2subject "${this_patch_file}" + git_patches_unapplied+=( "$p $REPLY" ) + else + git_patches_unapplied+=( "$p ?" ) + fi + done + fi fi fi + unset this_patch_file VCS_INFO_git_handle_patches elif [[ -f "${gitdir}/MERGE_HEAD" ]]; then -- cgit 1.4.1