1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-05-22 00:11:30 +02:00

51138: Updated StGit patch detection in vcs_info

The vcs_info patch detection code attempted to interrogate StGit patch
stack state by inspecting .git/patches/applied and
.git/patches/unapplied.

As of StGit 0.15 (2009), patch stack metadata is captured in the repo's
object database. And as of StGit 1.0 (2021), no stack or patch state is
maintained in any files in the .git/ directory.

Zsh's approach for interrogating StGit patch state is thus obsoleted.

This patch updates vcs_info to determine whether StGit is initialized on a
branch by looking at the appropriate git refs and uses StGit's prescribed
interface for interrogating applied and unapplied patch state via the `stg
series` command. This approach will work with all versions of StGit >=0.15.

Signed-off-by: Peter Grayson <pete@jpgrayson.net>
This commit is contained in:
Peter Grayson 2022-12-08 09:52:42 -05:00 committed by Daniel Shahaf
parent 2473d83521
commit ca7c42e1ee
2 changed files with 32 additions and 9 deletions
ChangeLog
Functions/VCS_Info/Backends

View file

@ -1,3 +1,8 @@
2022-12-08 Peter Grayson <pete@jpgrayson.net>
* 51138: Functions/VCS_Info/Backends/VCS_INFO_get_data_git:
Updated StGit patch detection in vcs_info
2022-12-06 Bart Schaefer <schaefer@zsh.org>
* Shohei YOSHIDA: 51108: Completion/Unix/Command/_nkf: single

View file

@ -184,15 +184,8 @@ fi
VCS_INFO_adjust
VCS_INFO_git_getaction ${gitdir}
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
elif [[ -d "${gitdir}/rebase-merge" ]]; then
local patchdir
if [[ -d "${gitdir}/rebase-merge" ]]; then
# 'git rebase -i'
patchdir="${gitdir}/rebase-merge"
local p
@ -389,6 +382,31 @@ elif [[ -f "${gitdir}/CHERRY_PICK_HEAD" ]]; then
git_patches_unapplied=()
fi
VCS_INFO_git_handle_patches
elif command -v stg >/dev/null &&
${vcs_comm[cmd]} show-ref --quiet refs/stacks/${gitbranch} refs/heads/${gitbranch}.stgit 2>/dev/null &&
git_patches_applied=(${(f)"$(stg series --noprefix --applied 2>/dev/null)"})
then
# Testing for StGit patches is done after testing for all git-proper
# patches/states. If a StGit user's repo is in one of those states, they
# will want to see that instead of the StGit patch info.
# Performance note: testing for the stg executable is done first because it
# is extremely cheap and there is nothing else to do if it isn't present.
# Using git to test whether a StGit stack is initialized is cheaper than
# running stg itself; especially for versions of StGit <= 2.0. Thus getting
# StGit patch info should only have a material runtime cost if StGit is
# installed and in-use for the current branch.
# In StGit >=1.2, the existence of refs/stacks/<branch> indicates StGit is
# initialized. In StGit >=0.15, it is refs/heads/<branch>.stgit.
# N.B. the "--noprefix" option is available in StGit 2.x as an alias for
# --no-prefix. The former is compatible with StGit versions going back to
# 2008.
if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" get-unapplied; then
git_patches_unapplied=(${(f)"$(stg series --noprefix --unapplied 2>/dev/null)"})
fi
VCS_INFO_git_handle_patches
else
gitmisc=''
fi