1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-27 04:40:59 +01:00

Frank Terbeck, Seth House: 27712, 22713, 27714:

VCS Info hooks and Mercurial improvements
This commit is contained in:
Peter Stephenson 2010-02-16 10:09:15 +00:00
parent 8b1da80a7a
commit 94777f64e8
9 changed files with 488 additions and 110 deletions

View file

@ -5,6 +5,7 @@
setopt localoptions noksharrays extendedglob NO_shwordsplit
local bzrbase bzrbr
local -a bzrinfo
local -xA hook_com
if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" "use-simple" ; then
bzrbase=${vcs_comm[basedir]}
@ -21,6 +22,12 @@ fi
rrn=${bzrbase:t}
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" branchformat bzrbr || bzrbr="%b:%r"
zformat -f bzrbr "${bzrbr}" "b:${bzrinfo[2]}" "r:${bzrinfo[1]}"
hook_com=( branch "${bzrinfo[2]}" revision "${bzrinfo[1]}" )
if VCS_INFO_hook 'set-branch-format' "${bzrbr}"; then
zformat -f bzrbr "${bzrbr}" "b:${hook_com[branch]}" "r:${hook_com[revision]}"
else
bzrbr=${hook_com[branch-replace]}
fi
hook_com=()
VCS_INFO_formats '' "${bzrbr}" "${bzrbase}" '' '' "${bzrinfo[1]}" ''
return 0

View file

@ -4,6 +4,8 @@
setopt localoptions extendedglob NO_shwordsplit
local gitdir gitbase gitbranch gitaction gitunstaged gitstaged gitsha1 gitmisc
local stgitpatch stgitunapplied
local -xA hook_com
VCS_INFO_git_getaction () {
local gitaction='' gitdir=$1
@ -97,36 +99,6 @@ VCS_INFO_git_getbranch () {
return 0
}
VCS_INFO_git_get_stgit_top_patch () {
local patchdir=$1
if [[ -d "$patchdir" ]]; then
local -a patches
patches=(${(f)"$(< "${patchdir}/applied")"})
printf '%s' $patches[-1]
return 0
fi
return 1
}
VCS_INFO_git_get_stgit_unapplied() {
local patchdir=$1
if [[ -d "$patchdir" ]]; then
local -a patches
patches=(${(f)"$(< "${patchdir}/unapplied")"})
if [[ -z $patches[@] ]]; then
printf 0
else
printf '%d' $#patches
fi
return 0
fi
return 1
}
gitdir=${vcs_comm[gitdir]}
gitbranch="$(VCS_INFO_git_getbranch ${gitdir})"
if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" get-revision && \
@ -160,14 +132,37 @@ rrn=${gitbase:t}
local patchdir=${gitdir}/patches/${gitbranch}
if [[ -d $patchdir ]] ; then
stgitpatch=$(VCS_INFO_git_get_stgit_top_patch "${patchdir}")
stgitunapplied=$(VCS_INFO_git_get_stgit_unapplied "${patchdir}")
local -a stgit_applied stgit_unapplied
stgitpatch=${stgitpatch:-"no patch applied"}
stgit_applied=(${(f)"$(< "${patchdir}/applied")"})
stgit_applied=( ${(Oa)stgit_applied} )
stgit_unapplied=(${(f)"$(< "${patchdir}/unapplied")"})
stgit_unapplied=( ${(oa)stgit_applied} )
if VCS_INFO_hook 'gen-stgit-patch-string' "${stgit_applied[@]}"; then
if (( ${#stgit_applied} )); then
stgitpatch=${stgit_applied[1]}
else
stgitpatch="no patch applied"
fi
else
stgitpatch=${hook_com[stgit-patch-string]}
fi
if VCS_INFO_hook 'gen-stgit-unapplied-string' "${stgit_unapplied[@]}"; then
stgitunapplied=${#stgit_unapplied}
else
stgitunapplied=${hook_com[stgit-unapplied-string]}
fi
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" stgitformat stgitmsg || stgitmsg=" %p (%c)"
zformat -f stgitmsg "${stgitmsg}" "p:${stgitpatch}" "c:${stgitunapplied}"
gitmisc=${stgitmsg}
hook_com=( patch "${stgitpatch}" unapplied "${stgitunapplied}" )
if VCS_INFO_hook 'set-stgit-format' "${stgitformat}"; then
zformat -f stgitmsg "${stgitmsg}" "p:${hook_com[patch]}" "c:${hook_com[unapplied]}"
gitmisc=${stgitmsg}
else
gitmisc=${hook_com[stgit-replace]}
fi
hook_com=()
else
gitmisc=''
fi

View file

@ -3,21 +3,11 @@
## Distributed under the same BSD-ish license as zsh itself.
setopt localoptions NO_shwordsplit
local file hgbranch hgbranch_name hgbase hghash hglrev hgmisc r_branch r_info revformat
VCS_INFO_hg_get_mq_top_patch () {
local patchdir=$1
if [[ -e "${patchdir}/status" ]]; then
local -a patches
patches=(${(f)"$(< "${patchdir}/status")"})
printf "%s" "${patches[-1]/[^:]*:/}"
return 0
fi
return 1
}
local file hgbranch hgbranch_name hgbase hghash hglrev hgmqstring \
r_branch hgchanges revformat bookmarks r_bmhash r_bmname hgbmstring
local -i getbookmarks
local -a hgbm mqpatches hgmisc_args
local -xA hook_com
hgbase=${vcs_comm[basedir]}
rrn=${hgbase:t}
@ -31,27 +21,70 @@ fi
hghash=''
hglrev=''
hgbm=()
bookmarks="${hgbase}/.hg/bookmarks"
if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" get-revision ; then
# Calling the 'hg' program is quite a bit too slow for prompts.
# If there's a way around that, I'd be interested.
# Disabled by default anyway, so no harm done.
local HGRCPATH
HGRCPATH="/dev/null" ${vcs_comm[cmd]} branches \
| while read -r r_branch r_info ; do
if [[ ${r_branch} == ${hgbranch_name} ]] ; then
match=()
: ${r_info/(#b)([^:]##):(*)}
hglrev=${match[1]}
hghash=${match[2]}
break
if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" \
"check-for-changes" ; then
HGRCPATH="/dev/null" ${vcs_comm[cmd]} id --debug -i -n -b \
| read -r hghash hglrev r_branch
# Are there uncommitted-changes?
if [[ $hglrev[-1] == + ]] ; then
hgchanges=1
fi
done
# Remove uncommitted-changes marker, if any
hglrev=${hglrev/+/}
hghash=${hghash/+/}
else
HGRCPATH="/dev/null" ${vcs_comm[cmd]} \
parents --template="{node} {rev} {branches}\n" \
| read -r hghash hglrev r_branch
fi
if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" "get-bookmarks" \
&& getbookmarks=1 || getbookmarks=0
if (( getbookmarks )) && [[ -r "${bookmarks}" ]] ; then
while read -r r_bmhash r_bmname ; do
if [[ $hghash == $r_bmhash ]] ; then
hgbm=( "$r_bmname" ${hgbm} )
fi
done < ${bookmarks}
fi
if [[ -n ${hglrev} ]] ; then
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" hgrevformat revformat || revformat="%r:%h"
zformat -f hglrev "${revformat}" "r:${hglrev}" "h:${hghash}"
hook_com=( localrev "${hglrev}" "hash" "${hghash}" )
if VCS_INFO_hook 'set-hgrev-format' "${revformat}"; then
zformat -f hglrev "${revformat}" "r:${hook_com[localrev]}" "h:${hook_com[hash]}"
else
hglrev=${hook_com[rev-replace]}
fi
hook_com=()
if (( getbookmarks )) ; then
if VCS_INFO_hook 'gen-hg-bookmark-string' "${hgbm[@]}"; then
hgbmstring=${(j.;.)hgbm}
else
hgbmstring=${hook_com[hg-bookmark-string]}
fi
hook_com=()
fi
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" branchformat hgbranch || hgbranch="%b:%r"
zformat -f hgbranch "${hgbranch}" "b:${hgbranch_name}" "r:${hglrev}"
hook_com=( branch "${hgbranch_name}" revision "${hglrev}" )
if VCS_INFO_hook 'set-branch-format' "${hgbranch}"; then
zformat -f hgbranch "${hgbranch}" "b:${hook_com[branch]}" "r:${hook_com[revision]}"
else
hgbranch=${hook_com[branch-replace]}
fi
hook_com=()
fi
else
hgbranch="${hgbranch_name}"
@ -60,12 +93,36 @@ fi
local patchdir=${hgbase}/.hg/patches/
if [[ -d $patchdir ]] ; then
hgmisc=$(VCS_INFO_hg_get_mq_top_patch "${patchdir}")
local -a mqpatches
if [[ -e "${patchdir}/status" ]]; then
mqpatches=( ${${(f)"$(< "${patchdir}/status")"}/(#s)[a-f0-9]##:/} )
mqpatches=( ${(Oa)mqpatches} )
else
mqpatches=( )
fi
hgmisc=${hgmisc:-"no patch applied"}
if VCS_INFO_hook 'gen-mq-patch-string' "${mqpatches[@]}"; then
if (( ${#mqpatches} )); then
hgmqstring=${mqpatches[1]}
else
hgmqstring="no patch applied"
fi
else
hgbmstring=${hook_com[hg-mqpatch-string]}
fi
hook_com=()
else
hgmisc=''
hgmqstring=''
fi
VCS_INFO_formats '' "${hgbranch}" "${hgbase}" '' '' "${hglrev}" "${hgmisc}"
if [[ -z "${hgmqstring}" ]] && [[ -z "${hgbmstring}" ]]; then
hgmisc_args=( '' ) # make sure there's at least *one* misc argument
elif [[ -z "${hgmqstring}" ]]; then
hgmisc_args=( "${hgmqstring}" )
elif [[ -z "${hgbmstring}" ]]; then
hgmisc_args=( "${hgbmstring}" )
else
hgmisc_args=( "${hgmqstring}" "${hgbmstring}" )
fi
VCS_INFO_formats '' "${hgbranch}" "${hgbase}" '' "${hgchanges}" "${hglrev}" "${hgmisc_args[@]}"
return 0

View file

@ -6,6 +6,7 @@
setopt localoptions extendedglob
local p4base a b
local -A p4info
local -xA hook_com
${vcs_comm[cmd]} info | while IFS=: read a b; do p4info[${a// /_}]="${b## #}"; done
p4base=${vcs_comm[basedir]}
@ -16,9 +17,13 @@ local p4branch change
# here down is synced as the revision.
# I suppose the following might be slow on a tortuous client view.
change="${${$(${vcs_comm[cmd]} changes -m 1 ...\#have)##Change }%% *}"
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" branchformat p4branch ||
p4branch="%b:%r"
zformat -f p4branch "${p4branch}" "b:${p4info[Client_name]}" \
"r:$change"
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" branchformat p4branch || p4branch="%b:%r"
hook_com=( branch "${p4info[Client_name]}" revision "${change}" )
if VCS_INFO_hook 'set-branch-format' "${p4branch}"; then
zformat -f p4branch "${p4branch}" "b:${hook_com[branch]}" "r:${hook_com[revision]}"
else
p4branch=${hook_com[branch-replace]}
fi
hook_com=()
VCS_INFO_formats '' "${p4branch}" "${p4base}" '' '' "$change" ''
return 0

View file

@ -4,10 +4,17 @@
setopt localoptions NO_shwordsplit
local svkbranch svkbase
local -xA hook_com
svkbase=${vcs_comm[basedir]}
rrn=${svkbase:t}
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" branchformat svkbranch || svkbranch="%b:%r"
zformat -f svkbranch "${svkbranch}" "b:${vcs_comm[branch]}" "r:${vcs_comm[revision]}"
hook_com=( branch "${vcs_comm[branch]}" revision "${vcs_comm[revision]}" )
if VCS_INFO_hook 'set-branch-format' "${svkbranch}"; then
zformat -f svkbranch "${svkbranch}" "b:${hook_com[branch]}" "r:${hook_com[revision]}"
else
svkbranch=${hook_com[branch-replace]}
fi
hook_com=()
VCS_INFO_formats '' "${svkbranch}" "${svkbase}" '' '' "${vcs_comm[revision]}" ''
return 0

View file

@ -7,6 +7,7 @@
setopt localoptions noksharrays extendedglob NO_shwordsplit
local svnbase svnbranch a b rrn
local -A svninfo parentinfo
local -xA hook_com
svnbase=".";
svninfo=()
@ -23,6 +24,12 @@ svnbase="$(VCS_INFO_realpath ${svnbase})"
rrn=${svnbase:t}
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" branchformat svnbranch || svnbranch="%b:%r"
zformat -f svnbranch "${svnbranch}" "b:${svninfo[URL]##*/}" "r:${svninfo[Revision]}"
hook_com=( branch "${svninfo[URL]##*/}" revision "${svninfo[Revision]}" )
if VCS_INFO_hook 'set-branch-format' "${svnbranch}"; then
zformat -f svnbranch "${svnbranch}" "b:${hook_com[branch]}" "r:${hook_com[revision]}"
else
svnbranch=${hook_com[branch-replace]}
fi
hook_com=()
VCS_INFO_formats '' "${svnbranch}" "${svnbase}" '' '' "${svninfo[Revision]}" ''
return 0

View file

@ -3,7 +3,39 @@
## Distributed under the same BSD-ish license as zsh itself.
setopt localoptions noksharrays NO_shwordsplit
local action=$1 branch=$2 base=$3 staged=$4 unstaged=$5 rev=$6 misc=$7
local msg tmp
local -i i
local -xA hook_com
# The _origs are needed because hooks can change values and there would
# be no way to get the originals back for later hooks (a hook is run for
# each message, that's being created).
hook_com=(
action "$1"
action_orig "$1"
branch "$2"
branch_orig "$2"
base "$3"
base_orig "$3"
staged "$4"
staged_orig "$4"
unstaged "$5"
unstaged_orig "$5"
revision "$6"
revision_orig "$6"
vcs "${vcs}"
vcs_orig "${vcs}"
)
shift 6
i=0
for tmp in "$@"; do
hook_com[misc$((i++))]="${tmp}"
done
hook_com[misc]=${(j:,:)argv}
hook_com[misc_orig]=${hook_com[misc]}
hook_com[base-name]="${${hook_com[base]}:t}"
hook_com[base-name_orig]="${hook_com[base_name]}"
hook_com[subdir]="$(VCS_INFO_reposub ${hook_com[base]})"
hook_com[subdir_orig]="${hook_com[subdir]}"
## description:
# action: a string that signals a certain non-default condition in the
@ -13,18 +45,15 @@ local action=$1 branch=$2 base=$3 staged=$4 unstaged=$5 rev=$6 misc=$7
# base: the full name of the repository's root directory.
# staged: non-empty if the repository contains staged changes.
# unstaged: non-empty if the repository contains unstaged changes.
# rev: an identifier of the currently checked out revision.
# misc: a string that may contain anything the author likes.
# revision: an identifier of the currently checked out revision.
# misc0..N: a set of strings that may contain anything the author likes.
# the backends should document what they put in it and when.
#
# If an argument has no valid value for a given backend, an empty value
# should be provided. eg:
# VCS_INFO_formats '' "${foobranch}" "${foobase}" '' '' '' "${foomisc}"
local msg
local -i i j
if [[ -n ${action} ]] ; then
if [[ -n ${hook_com[action]} ]] ; then
zstyle -a ":vcs_info:${vcs}:${usercontext}:${rrn}" actionformats msgs
(( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b|%a]-'
else
@ -32,29 +61,33 @@ else
(( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b]-'
fi
if [[ -n ${staged} ]] ; then
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" stagedstr staged
[[ -z ${staged} ]] && staged='S'
if [[ -n ${hook_com[staged]} ]] ; then
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" stagedstr tmp
[[ -z ${tmp} ]] && hook_com[staged]='S' || hook_com[staged]=${tmp}
fi
if [[ -n ${unstaged} ]] ; then
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" unstagedstr unstaged
[[ -z ${unstaged} ]] && unstaged='U'
if [[ -n ${hook_com[unstaged]} ]] ; then
zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" unstagedstr tmp
[[ -z ${tmp} ]] && hook_com[unstaged]='U' || hook_com[unstaged]=${tmp}
fi
(( ${#msgs} > maxexports )) && msgs[$(( maxexports + 1 )),-1]=()
for i in {1..${#msgs}} ; do
zformat -f msg ${msgs[$i]} \
a:${action} \
b:${branch} \
c:${staged} \
i:${rev} \
m:${misc} \
r:${base:t} \
s:${vcs} \
u:${unstaged} \
R:${base} \
S:"$(VCS_INFO_reposub ${base})"
msgs[$i]=${msg}
if VCS_INFO_hook "set-message" $(( $i - 1 )) "${msgs[$i]}"; then
zformat -f msg ${msgs[$i]} \
a:${hook_com[action]} \
b:${hook_com[branch]} \
c:${hook_com[staged]} \
i:${hook_com[revision]} \
m:${hook_com[misc]} \
r:${hook_com[base-name]} \
s:${hook_com[vcs]} \
u:${hook_com[unstaged]} \
R:${hook_com[base]} \
S:${hook_com[subdir]}
msgs[$i]=${msg}
else
msgs[$i]=${hook_com[message]}
fi
done
return 0

View file

@ -18,6 +18,7 @@ static_functions=(
VCS_INFO_check_com
VCS_INFO_formats
VCS_INFO_get_cmd
VCS_INFO_hook
VCS_INFO_maxexports
VCS_INFO_nvcsformats
VCS_INFO_realpath