Skip to content

Commit

Permalink
51138: Updated StGit patch detection in vcs_info
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
jpgrayson authored and danielshahaf committed Dec 8, 2022
1 parent 2473d83 commit ca7c42e
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 9 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
36 changes: 27 additions & 9 deletions Functions/VCS_Info/Backends/VCS_INFO_get_data_git
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit ca7c42e

Please sign in to comment.