From ca7c42e1ee1706f39bbeb163ef323c819aee8357 Mon Sep 17 00:00:00 2001 From: Peter Grayson Date: Thu, 8 Dec 2022 09:52:42 -0500 Subject: 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 --- Functions/VCS_Info/Backends/VCS_INFO_get_data_git | 36 +++++++++++++++++------ 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'Functions/VCS_Info') diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git index e45eebc8e..23d4d31a1 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git @@ -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/ indicates StGit is + # initialized. In StGit >=0.15, it is refs/heads/.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 -- cgit v1.2.3 From 7cdada166cd9a05103a838d18e9be9811f68bc1d Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Thu, 8 Dec 2022 21:59:25 +0000 Subject: 51142: vcs_info git: Check the get-unapplied style as documented The style was treated as "always true" rather than as "settable, false by default" in the rebase-merge and cherry-pick cases. This affects the gen-unapplied-string hook, and may also affect gen-applied-string and set-patch-format hooks if they accessed VCS_INFO_get_data_git's internal parameters directly. If this affects you, just set the style in your zshrc: . zstyle ':vcs_info:git*:*:*' get-unapplied true --- ChangeLog | 5 +++++ Functions/VCS_Info/Backends/VCS_INFO_get_data_git | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'Functions/VCS_Info') diff --git a/ChangeLog b/ChangeLog index 63e9c5041..dab0a9147 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2022-12-08 Daniel Shahaf + + * 51142: Functions/VCS_Info/Backends/VCS_INFO_get_data_git: + vcs_info git: Check the get-unapplied style as documented + 2022-12-08 Peter Grayson * 51138: Functions/VCS_Info/Backends/VCS_INFO_get_data_git: diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git index 23d4d31a1..37cd048db 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git @@ -244,7 +244,9 @@ if [[ -d "${gitdir}/rebase-merge" ]]; then (( $+REPLY )) && git_patches_applied+=( "$REPLY" ) done fi - if [[ -f "${patchdir}/git-rebase-todo" ]] ; then + if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" get-unapplied && + [[ -f "${patchdir}/git-rebase-todo" ]] + then for p in ${(f)"$(< "${patchdir}/git-rebase-todo")"}; do VCS_INFO_git_map_rebase_line_to_hash_and_subject "$p" (( $+REPLY )) && git_patches_unapplied+=( "$REPLY" ) @@ -374,7 +376,9 @@ elif [[ -f "${gitdir}/CHERRY_PICK_HEAD" ]]; then # TODO: maybe read up to the first blank line IFS='' read -r subject < "${gitdir}/MERGE_MSG" git_patches_applied=( "$(<${gitdir}/CHERRY_PICK_HEAD) ${subject}" ) - if [[ -f "${gitdir}/sequencer/todo" ]]; then + if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" get-unapplied && + [[ -f "${gitdir}/sequencer/todo" ]] + then # Get the next patches, and remove the one that's in CHERRY_PICK_HEAD. git_patches_unapplied=( ${${(M)${(f)"$(<"${gitdir}/sequencer/todo")"}:#pick *}#pick } ) git_patches_unapplied[1]=() -- cgit v1.2.3 From 510df60dd1f90f99026ac17e341df2313e064509 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Fri, 9 Dec 2022 01:39:21 +0000 Subject: 51144, 51146: vcs_info git: stg: Extract patch descriptions Joint work with Peter Grayson. --- ChangeLog | 6 ++++++ Functions/VCS_Info/Backends/VCS_INFO_get_data_git | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'Functions/VCS_Info') diff --git a/ChangeLog b/ChangeLog index dab0a9147..77dfc0377 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2022-12-09 Daniel Shahaf + + * 51144, 51146: + Functions/VCS_Info/Backends/VCS_INFO_get_data_git: vcs_info git: + stg: Extract patch descriptions + 2022-12-08 Daniel Shahaf * 51142: Functions/VCS_Info/Backends/VCS_INFO_get_data_git: diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git index 37cd048db..9a608adab 100644 --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git @@ -388,7 +388,7 @@ elif [[ -f "${gitdir}/CHERRY_PICK_HEAD" ]]; then 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)"}) + git_patches_applied=(${${(f)"$(stg series --noprefix --applied --description 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 @@ -408,7 +408,7 @@ then # --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)"}) + git_patches_unapplied=(${${(f)"$(stg series --noprefix --unapplied --description 2>/dev/null)"}/ #[#]}) fi VCS_INFO_git_handle_patches else -- cgit v1.2.3