1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-04 22:51:42 +02:00

33184: vcs_info git: consider patches for rebase

Since a rebase contains a list of patches to re-apply, re-use the
facility for stgit to have the same mechanism.
The patch list given to the gen-{un,}applied-string hooks is an array
with the sha1 and the subject of the commit. On rebase merge, the
applied patches prior to current contains only a number and "?".
This commit is contained in:
Marc Finet 2014-09-16 22:07:59 +02:00 committed by Frank Terbeck
parent 2c2d4f9627
commit 9c29a4f1f6
3 changed files with 85 additions and 49 deletions

View file

@ -3,6 +3,10 @@
* 33188: Functions/VCS_Info/Backends/VCS_INFO_get_data_git:
vcs_info git: set rrn before using it
* 33184: Doc/Zsh/contrib.yo,
Functions/VCS_Info/Backends/VCS_INFO_get_data_git: vcs_info git:
consider patches for rebase
2014-09-16 Mikael Magnusson <mikachu@gmail.com>
* 33136: Doc/Zsh/expn.yo, Src/glob.c: P glob qualifier appends

View file

@ -1296,10 +1296,10 @@ tt(formats) and tt(actionformats) and will be availabe in the global
tt(backend_misc) array as tt(${backend_misc[bookmarks]}).
)
item(tt(gen-applied-string))(
Called in the tt(git) (with tt(stgit)), and tt(hg) (with tt(mq)) backends
and in tt(quilt) support when the tt(applied-string) is generated; the
tt(use-quilt) zstyle must be true for tt(quilt) (the tt(mq) and tt(stgit)
backends are active by default).
Called in the tt(git) (with tt(stgit) or during rebase), and tt(hg)
(with tt(mq)) backends and in tt(quilt) support when the tt(applied-string)
is generated; the tt(use-quilt) zstyle must be true for tt(quilt) (the tt(mq)
and tt(stgit) backends are active by default).
This hook gets the names of all applied patches which tt(vcs_info) collected
so far in the opposite order, which means that the first argument is the
@ -1312,9 +1312,9 @@ tt(backend_misc) array as tt($backend_misc[patches]}); and it will be
available as tt(%p) in the tt(patch-format) and tt(nopatch-format) styles.
)
item(tt(gen-unapplied-string))(
Called in the tt(git) (with tt(stgit)), and tt(hg) (with tt(mq)) backend
and in tt(quilt) support when the tt(unapplied-string) is generated; the
tt(get-unapplied) style must be true.
Called in the tt(git) (with tt(stgit) or during rebase), and tt(hg) (with
tt(mq)) backend and in tt(quilt) support when the tt(unapplied-string) is
generated; the tt(get-unapplied) style must be true.
This hook gets the names of all unapplied patches which tt(vcs_info)
collected so far in the opposite order, which mean that the first argument is

View file

@ -3,9 +3,9 @@
## Distributed under the same BSD-ish license as zsh itself.
setopt localoptions extendedglob NO_shwordsplit
local gitdir gitbase gitbranch gitaction gitunstaged gitstaged gitsha1
local stgitpatch stgitunapplied
local gitdir gitbase gitbranch gitaction gitunstaged gitstaged gitsha1 gitmisc
local -i querystaged queryunstaged
local -a git_patches_applied git_patches_unapplied
local -A hook_com
VCS_INFO_git_getaction () {
@ -113,6 +113,44 @@ VCS_INFO_git_getbranch () {
return 0
}
VCS_INFO_git_handle_patches () {
local git_applied_s git_unapplied_s gitmsg git_all
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=()
}
gitdir=${vcs_comm[gitdir]}
VCS_INFO_git_getbranch ${gitdir}
gitbase=$( ${vcs_comm[cmd]} rev-parse --show-toplevel )
@ -157,52 +195,46 @@ fi
VCS_INFO_adjust
VCS_INFO_git_getaction ${gitdir}
VCS_INFO_get_get_rebase()
{
if [[ -f "$1" ]]; then
echo "$(< "$1")"
fi
}
local patchdir=${gitdir}/patches/${gitbranch}
if [[ -d $patchdir ]] && [[ -f $patchdir/applied ]] \
&& [[ -f $patchdir/unapplied ]]
then
local -a stgit_applied stgit_unapplied stgit_all
git_patches_applied=(${(f)"$(< "${patchdir}/applied")"})
git_patches_unapplied=(${(f)"$(< "${patchdir}/unapplied")"})
VCS_INFO_git_handle_patches
elif [[ -d "${gitdir}/rebase-merge" ]]; then
patchdir="${gitdir}/rebase-merge"
local p
for p in ${(f)"$(< "${patchdir}/done")"}; do
# remove action
git_patches_applied+=("${${(s: :)p}[2,-1]}")
done
git_patches_unapplied=(${(f)"$(grep -v '^$' "${patchdir}/git-rebase-todo" | grep -v '^#')"})
VCS_INFO_git_handle_patches
elif [[ -d "${gitdir}/rebase-apply" ]]; then
# Fake patch names for all but current patch
patchdir="${gitdir}/rebase-apply"
local cur=$(< "${patchdir}/next")
local p
for p in $(seq $(($cur - 1))); do
git_patches_applied+=("$(printf "%04d" $p) ?")
done
git_patches_applied+=("$(< "${patchdir}/original-commit") ${${(f)$(< "${patchdir}/msg-clean")}[1]}")
git_patches_unapplied=($(seq $cur $(< "${patchdir}/last")))
stgit_applied=(${(f)"$(< "${patchdir}/applied")"})
stgit_applied=( ${(Oa)stgit_applied} )
stgit_unapplied=(${(f)"$(< "${patchdir}/unapplied")"})
stgit_unapplied=( ${(oa)stgit_unapplied} )
stgit_all=( ${(Oa)stgit_applied} ${stgit_unapplied} )
if VCS_INFO_hook 'gen-applied-string' "${stgit_applied[@]}"; then
if (( ${#stgit_applied} )); then
stgitpatch=${stgit_applied[1]}
else
stgitpatch=""
fi
else
stgitpatch=${hook_com[applied-string]}
fi
hook_com=()
if VCS_INFO_hook 'gen-unapplied-string' "${stgit_unapplied[@]}"; then
stgitunapplied=${#stgit_unapplied}
else
stgitunapplied=${hook_com[unapplied-string]}
fi
if (( ${#stgit_applied} )); then
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" patch-format stgitmsg || stgitmsg="%p (%n applied)"
else
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" nopatch-format stgitmsg || stgitmsg="no patch applied"
fi
hook_com=( applied "${stgitpatch}" unapplied "${stgitunapplied}"
applied-n ${#stgit_applied} unapplied-n ${#stgit_unapplied} all-n ${#stgit_all} )
if VCS_INFO_hook 'set-patch-format' "${stgitmsg}"; then
zformat -f stgitmsg "${stgitmsg}" "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
"n:${#stgit_applied}" "c:${#stgit_unapplied}" "a:${#stgit_all}"
else
stgitmsg=${hook_com[patch-replace]}
fi
hook_com=()
VCS_INFO_git_handle_patches
else
stgitmsg=''
gitmisc=''
fi
backend_misc[patches]="${stgitmsg}"
VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}" "${gitstaged}" "${gitunstaged}" "${gitsha1}" "${stgitmsg}"
backend_misc[patches]="${gitmisc}"
VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}" "${gitstaged}" "${gitunstaged}" "${gitsha1}" "${gitmisc}"
return 0