From cab4384bdb27f01a340323312cbcd8129d8d0569 Mon Sep 17 00:00:00 2001 From: Peter Palfrader Date: Sat, 27 Jun 2009 10:33:51 +0000 Subject: Add vcs-info git-svn-id: svn+ssh://asteria.noreply.org/svn/weaselutils/trunk@398 bc3d92e2-beff-0310-a7cd-cc87d7ac0ede --- zshfunc/vcs-info/VCS_INFO_adjust | 4 + zshfunc/vcs-info/VCS_INFO_bzr_detect | 6 + zshfunc/vcs-info/VCS_INFO_bzr_get_data | 23 + zshfunc/vcs-info/VCS_INFO_cdv_detect | 6 + zshfunc/vcs-info/VCS_INFO_cdv_get_data | 7 + zshfunc/vcs-info/VCS_INFO_check_com | 4 + zshfunc/vcs-info/VCS_INFO_cvs_detect | 5 + zshfunc/vcs-info/VCS_INFO_cvs_get_data | 15 + zshfunc/vcs-info/VCS_INFO_darcs_detect | 6 + zshfunc/vcs-info/VCS_INFO_darcs_get_data | 7 + zshfunc/vcs-info/VCS_INFO_detect_by_dir | 22 + zshfunc/vcs-info/VCS_INFO_formats | 27 + zshfunc/vcs-info/VCS_INFO_git_detect | 9 + zshfunc/vcs-info/VCS_INFO_git_get_data | 17 + zshfunc/vcs-info/VCS_INFO_git_getaction | 47 ++ zshfunc/vcs-info/VCS_INFO_git_getbranch | 35 ++ zshfunc/vcs-info/VCS_INFO_hg_detect | 6 + zshfunc/vcs-info/VCS_INFO_hg_get_data | 15 + zshfunc/vcs-info/VCS_INFO_maxexports | 8 + zshfunc/vcs-info/VCS_INFO_mtn_detect | 6 + zshfunc/vcs-info/VCS_INFO_mtn_get_data | 8 + zshfunc/vcs-info/VCS_INFO_nvcsformats | 11 + zshfunc/vcs-info/VCS_INFO_realpath | 11 + zshfunc/vcs-info/VCS_INFO_reposub | 11 + zshfunc/vcs-info/VCS_INFO_set | 24 + zshfunc/vcs-info/VCS_INFO_svk_detect | 34 ++ zshfunc/vcs-info/VCS_INFO_svk_get_data | 9 + zshfunc/vcs-info/VCS_INFO_svn_detect | 5 + zshfunc/vcs-info/VCS_INFO_svn_get_data | 17 + zshfunc/vcs-info/VCS_INFO_tla_detect | 5 + zshfunc/vcs-info/VCS_INFO_tla_get_data | 9 + zshfunc/vcs-info/grml-vcs-info | 844 +++++++++++++++++++++++++++++++ zshfunc/vcs-info/vcs_info | 68 +++ zshfunc/vcs-info/vcs_info_lastmsg | 14 + zshfunc/vcs-info/vcs_info_printsys | 3 + 35 files changed, 1348 insertions(+) create mode 100644 zshfunc/vcs-info/VCS_INFO_adjust create mode 100644 zshfunc/vcs-info/VCS_INFO_bzr_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_bzr_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_cdv_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_cdv_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_check_com create mode 100644 zshfunc/vcs-info/VCS_INFO_cvs_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_cvs_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_darcs_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_darcs_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_detect_by_dir create mode 100644 zshfunc/vcs-info/VCS_INFO_formats create mode 100644 zshfunc/vcs-info/VCS_INFO_git_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_git_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_git_getaction create mode 100644 zshfunc/vcs-info/VCS_INFO_git_getbranch create mode 100644 zshfunc/vcs-info/VCS_INFO_hg_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_hg_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_maxexports create mode 100644 zshfunc/vcs-info/VCS_INFO_mtn_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_mtn_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_nvcsformats create mode 100644 zshfunc/vcs-info/VCS_INFO_realpath create mode 100644 zshfunc/vcs-info/VCS_INFO_reposub create mode 100644 zshfunc/vcs-info/VCS_INFO_set create mode 100644 zshfunc/vcs-info/VCS_INFO_svk_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_svk_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_svn_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_svn_get_data create mode 100644 zshfunc/vcs-info/VCS_INFO_tla_detect create mode 100644 zshfunc/vcs-info/VCS_INFO_tla_get_data create mode 100644 zshfunc/vcs-info/grml-vcs-info create mode 100644 zshfunc/vcs-info/vcs_info create mode 100644 zshfunc/vcs-info/vcs_info_lastmsg create mode 100644 zshfunc/vcs-info/vcs_info_printsys (limited to 'zshfunc') diff --git a/zshfunc/vcs-info/VCS_INFO_adjust b/zshfunc/vcs-info/VCS_INFO_adjust new file mode 100644 index 0000000..2d2c6d0 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_adjust @@ -0,0 +1,4 @@ +VCS_INFO_adjust () { #{{{ + [[ -n ${vcs_comm[overwrite_name]} ]] && vcs=${vcs_comm[overwrite_name]} + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_bzr_detect b/zshfunc/vcs-info/VCS_INFO_bzr_detect new file mode 100644 index 0000000..3faa78d --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_bzr_detect @@ -0,0 +1,6 @@ +VCS_INFO_bzr_detect() { #{{{ + VCS_INFO_check_com bzr || return 1 + vcs_comm[detect_need_file]=branch/format + VCS_INFO_detect_by_dir '.bzr' + return $? +} diff --git a/zshfunc/vcs-info/VCS_INFO_bzr_get_data b/zshfunc/vcs-info/VCS_INFO_bzr_get_data new file mode 100644 index 0000000..e0931dc --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_bzr_get_data @@ -0,0 +1,23 @@ +VCS_INFO_bzr_get_data () { # {{{ + setopt localoptions noksharrays + local bzrbase bzrbr + local -a bzrinfo + + if zstyle -t ":vcs_info:${vcs}:${usercontext}" "use-simple" ; then + bzrbase=${vcs_comm[basedir]} + bzrinfo[2]=${bzrbase:t} + if [[ -f ${bzrbase}/.bzr/branch/last-revision ]] ; then + bzrinfo[1]=$(< ${bzrbase}/.bzr/branch/last-revision) + bzrinfo[1]=${${bzrinfo[1]}%% *} + fi + else + bzrbase=${${(M)${(f)"$( bzr info )"}:# ##branch\ root:*}/*: ##/} + bzrinfo=( ${${${(M)${(f)"$( bzr version-info )"}:#(#s)(revno|branch-nick)*}/*: /}/*\//} ) + bzrbase="$(VCS_INFO_realpath ${bzrbase})" + fi + + zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat bzrbr || bzrbr="%b:%r" + zformat -f bzrbr "${bzrbr}" "b:${bzrinfo[2]}" "r:${bzrinfo[1]}" + VCS_INFO_formats '' "${bzrbr}" "${bzrbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_cdv_detect b/zshfunc/vcs-info/VCS_INFO_cdv_detect new file mode 100644 index 0000000..5f05823 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_cdv_detect @@ -0,0 +1,6 @@ +VCS_INFO_cdv_detect() { #{{{ + VCS_INFO_check_com cdv || return 1 + vcs_comm[detect_need_file]=format + VCS_INFO_detect_by_dir '.cdv' + return $? +} diff --git a/zshfunc/vcs-info/VCS_INFO_cdv_get_data b/zshfunc/vcs-info/VCS_INFO_cdv_get_data new file mode 100644 index 0000000..8c812cc --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_cdv_get_data @@ -0,0 +1,7 @@ +VCS_INFO_cdv_get_data () { # {{{ + local cdvbase + + cdvbase=${vcs_comm[basedir]} + VCS_INFO_formats '' "${cdvbase:t}" "${cdvbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_check_com b/zshfunc/vcs-info/VCS_INFO_check_com new file mode 100644 index 0000000..7895241 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_check_com @@ -0,0 +1,4 @@ +VCS_INFO_check_com () { #{{{ + (( ${+commands[$1]} )) && [[ -x ${commands[$1]} ]] && return 0 + return 1 +} diff --git a/zshfunc/vcs-info/VCS_INFO_cvs_detect b/zshfunc/vcs-info/VCS_INFO_cvs_detect new file mode 100644 index 0000000..d3d2b2a --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_cvs_detect @@ -0,0 +1,5 @@ +VCS_INFO_cvs_detect() { #{{{ + VCS_INFO_check_com svn || return 1 + [[ -d "./CVS" ]] && [[ -r "./CVS/Repository" ]] && return 0 + return 1 +} diff --git a/zshfunc/vcs-info/VCS_INFO_cvs_get_data b/zshfunc/vcs-info/VCS_INFO_cvs_get_data new file mode 100644 index 0000000..b8b9ad3 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_cvs_get_data @@ -0,0 +1,15 @@ +VCS_INFO_cvs_get_data () { # {{{ + local cvsbranch cvsbase basename + + cvsbase="." + while [[ -d "${cvsbase}/../CVS" ]]; do + cvsbase="${cvsbase}/.." + done + cvsbase="$(VCS_INFO_realpath ${cvsbase})" + cvsbranch=$(< ./CVS/Repository) + basename=${cvsbase:t} + cvsbranch=${cvsbranch##${basename}/} + [[ -z ${cvsbranch} ]] && cvsbranch=${basename} + VCS_INFO_formats '' "${cvsbranch}" "${cvsbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_darcs_detect b/zshfunc/vcs-info/VCS_INFO_darcs_detect new file mode 100644 index 0000000..ff79327 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_darcs_detect @@ -0,0 +1,6 @@ +VCS_INFO_darcs_detect() { #{{{ + VCS_INFO_check_com darcs || return 1 + vcs_comm[detect_need_file]=format + VCS_INFO_detect_by_dir '_darcs' + return $? +} diff --git a/zshfunc/vcs-info/VCS_INFO_darcs_get_data b/zshfunc/vcs-info/VCS_INFO_darcs_get_data new file mode 100644 index 0000000..eddbd89 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_darcs_get_data @@ -0,0 +1,7 @@ +VCS_INFO_darcs_get_data () { # {{{ + local darcsbase + + darcsbase=${vcs_comm[basedir]} + VCS_INFO_formats '' "${darcsbase:t}" "${darcsbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_detect_by_dir b/zshfunc/vcs-info/VCS_INFO_detect_by_dir new file mode 100644 index 0000000..e0e7da3 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_detect_by_dir @@ -0,0 +1,22 @@ +VCS_INFO_detect_by_dir() { #{{{ + local dirname=$1 + local basedir="." realbasedir + + realbasedir="$(VCS_INFO_realpath ${basedir})" + while [[ ${realbasedir} != '/' ]]; do + if [[ -n ${vcs_comm[detect_need_file]} ]] ; then + [[ -d ${basedir}/${dirname} ]] && \ + [[ -e ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \ + break + else + [[ -d ${basedir}/${dirname} ]] && break + fi + + basedir=${basedir}/.. + realbasedir="$(VCS_INFO_realpath ${basedir})" + done + + [[ ${realbasedir} == "/" ]] && return 1 + vcs_comm[basedir]=${realbasedir} + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_formats b/zshfunc/vcs-info/VCS_INFO_formats new file mode 100644 index 0000000..b22d5aa --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_formats @@ -0,0 +1,27 @@ +VCS_INFO_formats () { # {{{ + setopt localoptions noksharrays + local action=$1 branch=$2 base=$3 + local msg + local -i i + + if [[ -n ${action} ]] ; then + zstyle -a ":vcs_info:${vcs}:${usercontext}" actionformats msgs + (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b|%a]-' + else + zstyle -a ":vcs_info:${vcs}:${usercontext}" formats msgs + (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b]-' + fi + + (( ${#msgs} > maxexports )) && msgs[$(( maxexports + 1 )),-1]=() + for i in {1..${#msgs}} ; do + zformat -f msg ${msgs[$i]} \ + a:${action} \ + b:${branch} \ + r:${base:t} \ + s:${vcs} \ + R:${base} \ + S:"$(VCS_INFO_reposub ${base})" + msgs[$i]=${msg} + done + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_git_detect b/zshfunc/vcs-info/VCS_INFO_git_detect new file mode 100644 index 0000000..a57b276 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_git_detect @@ -0,0 +1,9 @@ +VCS_INFO_git_detect() { #{{{ + if VCS_INFO_check_com git && git rev-parse --is-inside-work-tree &> /dev/null ; then + vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1 + if [[ -d ${vcs_comm[gitdir]}/svn ]] ; then vcs_comm[overwrite_name]='git-svn' + elif [[ -d ${vcs_comm[gitdir]}/refs/remotes/p4 ]] ; then vcs_comm[overwrite_name]='git-p4' ; fi + return 0 + fi + return 1 +} diff --git a/zshfunc/vcs-info/VCS_INFO_git_get_data b/zshfunc/vcs-info/VCS_INFO_git_get_data new file mode 100644 index 0000000..ce73b5c --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_git_get_data @@ -0,0 +1,17 @@ +VCS_INFO_git_get_data () { # {{{ + setopt localoptions extendedglob + local gitdir gitbase gitbranch gitaction + + gitdir=${vcs_comm[gitdir]} + gitbranch="$(VCS_INFO_git_getbranch ${gitdir})" + + if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then + return 1 + fi + + VCS_INFO_adjust + gitaction="$(VCS_INFO_git_getaction ${gitdir})" + gitbase=${PWD%/${$( git rev-parse --show-prefix )%/##}} + VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_git_getaction b/zshfunc/vcs-info/VCS_INFO_git_getaction new file mode 100644 index 0000000..3593f28 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_git_getaction @@ -0,0 +1,47 @@ +VCS_INFO_git_getaction () { #{{{ + local gitaction='' gitdir=$1 + local tmp + + for tmp in "${gitdir}/rebase-apply" \ + "${gitdir}/rebase" \ + "${gitdir}/../.dotest" ; do + if [[ -d ${tmp} ]] ; then + if [[ -f "${tmp}/rebasing" ]] ; then + gitaction="rebase" + elif [[ -f "${tmp}/applying" ]] ; then + gitaction="am" + else + gitaction="am/rebase" + fi + printf '%s' ${gitaction} + return 0 + fi + done + + for tmp in "${gitdir}/rebase-merge/interactive" \ + "${gitdir}/.dotest-merge/interactive" ; do + if [[ -f "${tmp}" ]] ; then + printf '%s' "rebase-i" + return 0 + fi + done + + for tmp in "${gitdir}/rebase-merge" \ + "${gitdir}/.dotest-merge" ; do + if [[ -d "${tmp}" ]] ; then + printf '%s' "rebase-m" + return 0 + fi + done + + if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then + printf '%s' "merge" + return 0 + fi + + if [[ -f "${gitdir}/BISECT_LOG" ]] ; then + printf '%s' "bisect" + return 0 + fi + return 1 +} diff --git a/zshfunc/vcs-info/VCS_INFO_git_getbranch b/zshfunc/vcs-info/VCS_INFO_git_getbranch new file mode 100644 index 0000000..03c5fa5 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_git_getbranch @@ -0,0 +1,35 @@ +VCS_INFO_git_getbranch () { #{{{ + local gitbranch gitdir=$1 + local gitsymref='git symbolic-ref HEAD' + + if [[ -d "${gitdir}/rebase-apply" ]] \ + || [[ -d "${gitdir}/rebase" ]] \ + || [[ -d "${gitdir}/../.dotest" ]] \ + || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then + gitbranch="$(${(z)gitsymref} 2> /dev/null)" + [[ -z ${gitbranch} ]] && [[ -r ${gitdir}/rebase-apply/head-name ]] \ + && gitbranch="$(< ${gitdir}/rebase-apply/head-name)" + + elif [[ -f "${gitdir}/rebase-merge/interactive" ]] \ + || [[ -d "${gitdir}/rebase-merge" ]] ; then + gitbranch="$(< ${gitdir}/rebase-merge/head-name)" + + elif [[ -f "${gitdir}/.dotest-merge/interactive" ]] \ + || [[ -d "${gitdir}/.dotest-merge" ]] ; then + gitbranch="$(< ${gitdir}/.dotest-merge/head-name)" + + else + gitbranch="$(${(z)gitsymref} 2> /dev/null)" + + if [[ $? -ne 0 ]] ; then + gitbranch="$(git describe --exact-match HEAD 2>/dev/null)" + + if [[ $? -ne 0 ]] ; then + gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..." + fi + fi + fi + + printf '%s' "${gitbranch##refs/heads/}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_hg_detect b/zshfunc/vcs-info/VCS_INFO_hg_detect new file mode 100644 index 0000000..ea13422 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_hg_detect @@ -0,0 +1,6 @@ +VCS_INFO_hg_detect() { #{{{ + VCS_INFO_check_com hg || return 1 + vcs_comm[detect_need_file]=store + VCS_INFO_detect_by_dir '.hg' + return $? +} diff --git a/zshfunc/vcs-info/VCS_INFO_hg_get_data b/zshfunc/vcs-info/VCS_INFO_hg_get_data new file mode 100644 index 0000000..314d343 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_hg_get_data @@ -0,0 +1,15 @@ +VCS_INFO_hg_get_data () { # {{{ + local hgbranch hgbase file + + hgbase=${vcs_comm[basedir]} + + file="${hgbase}/.hg/branch" + if [[ -r ${file} ]] ; then + hgbranch=$(< ${file}) + else + hgbranch='default' + fi + + VCS_INFO_formats '' "${hgbranch}" "${hgbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_maxexports b/zshfunc/vcs-info/VCS_INFO_maxexports new file mode 100644 index 0000000..c0b3c1f --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_maxexports @@ -0,0 +1,8 @@ +VCS_INFO_maxexports () { #{{{ + zstyle -s ":vcs_info:${vcs}:${usercontext}" "max-exports" maxexports || maxexports=2 + if [[ ${maxexports} != <-> ]] || (( maxexports < 1 )); then + printf 'vcs_info(): expecting numeric arg >= 1 for max-exports (got %s).\n' ${maxexports} + printf 'Defaulting to 2.\n' + maxexports=2 + fi +} diff --git a/zshfunc/vcs-info/VCS_INFO_mtn_detect b/zshfunc/vcs-info/VCS_INFO_mtn_detect new file mode 100644 index 0000000..91f019d --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_mtn_detect @@ -0,0 +1,6 @@ +VCS_INFO_mtn_detect() { #{{{ + VCS_INFO_check_com mtn || return 1 + vcs_comm[detect_need_file]=revision + VCS_INFO_detect_by_dir '_MTN' + return $? +} diff --git a/zshfunc/vcs-info/VCS_INFO_mtn_get_data b/zshfunc/vcs-info/VCS_INFO_mtn_get_data new file mode 100644 index 0000000..1edbb63 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_mtn_get_data @@ -0,0 +1,8 @@ +VCS_INFO_mtn_get_data () { # {{{ + local mtnbranch mtnbase + + mtnbase=${vcs_comm[basedir]} + mtnbranch=${${(M)${(f)"$( mtn status )"}:#(#s)Current branch:*}/*: /} + VCS_INFO_formats '' "${mtnbranch}" "${mtnbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_nvcsformats b/zshfunc/vcs-info/VCS_INFO_nvcsformats new file mode 100644 index 0000000..eed0e32 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_nvcsformats @@ -0,0 +1,11 @@ +VCS_INFO_nvcsformats () { #{{{ + setopt localoptions noksharrays + local c v + + if [[ $1 == 'preinit' ]] ; then + c=default + v=preinit + fi + zstyle -a ":vcs_info:${v:-$vcs}:${c:-$usercontext}" nvcsformats msgs + (( ${#msgs} > maxexports )) && msgs[${maxexports},-1]=() +} diff --git a/zshfunc/vcs-info/VCS_INFO_realpath b/zshfunc/vcs-info/VCS_INFO_realpath new file mode 100644 index 0000000..ba4a12a --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_realpath @@ -0,0 +1,11 @@ +VCS_INFO_realpath () { #{{{ + # a portable 'readlink -f' + # forcing a subshell, to ensure chpwd() is not removed + # from the calling shell (if VCS_INFO_realpath() is called + # manually). + ( + (( ${+functions[chpwd]} )) && unfunction chpwd + setopt chaselinks + cd $1 2>/dev/null && pwd + ) +} diff --git a/zshfunc/vcs-info/VCS_INFO_reposub b/zshfunc/vcs-info/VCS_INFO_reposub new file mode 100644 index 0000000..0eb81d4 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_reposub @@ -0,0 +1,11 @@ +VCS_INFO_reposub () { #{{{ + setopt localoptions extendedglob + local base=${1%%/##} + + [[ ${PWD} == ${base}/* ]] || { + printf '.' + return 1 + } + printf '%s' ${PWD#$base/} + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_set b/zshfunc/vcs-info/VCS_INFO_set new file mode 100644 index 0000000..4cd2999 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_set @@ -0,0 +1,24 @@ +VCS_INFO_set () { #{{{ + setopt localoptions noksharrays + local -i i j + + if [[ $1 == '--clear' ]] ; then + for i in {0..9} ; do + unset VCS_INFO_message_${i}_ + done + fi + if [[ $1 == '--nvcs' ]] ; then + [[ $2 == 'preinit' ]] && (( maxexports == 0 )) && (( maxexports = 1 )) + for i in {0..$((maxexports - 1))} ; do + typeset -gx VCS_INFO_message_${i}_= + done + VCS_INFO_nvcsformats $2 + fi + + (( ${#msgs} - 1 < 0 )) && return 0 + for i in {0..$(( ${#msgs} - 1 ))} ; do + (( j = i + 1 )) + typeset -gx VCS_INFO_message_${i}_=${msgs[$j]} + done + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_svk_detect b/zshfunc/vcs-info/VCS_INFO_svk_detect new file mode 100644 index 0000000..1bd4c7f --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_svk_detect @@ -0,0 +1,34 @@ +VCS_INFO_svk_detect() { #{{{ + setopt localoptions noksharrays extendedglob + local -a info + local -i fhash + fhash=0 + + VCS_INFO_check_com svk || return 1 + [[ -f ~/.svk/config ]] || return 1 + + # This detection function is a bit different from the others. + # We need to read svk's config file to detect a svk repository + # in the first place. Therefore, we'll just proceed and read + # the other information, too. This is more then any of the + # other detections do but this takes only one file open for + # svk at most. VCS_INFO_svk_get_data() get simpler, too. :-) + while IFS= read -r line ; do + if [[ -n ${vcs_comm[basedir]} ]] ; then + line=${line## ##} + [[ ${line} == depotpath:* ]] && vcs_comm[branch]=${line##*/} + [[ ${line} == revision:* ]] && vcs_comm[revision]=${line##*[[:space:]]##} + [[ -n ${vcs_comm[branch]} ]] && [[ -n ${vcs_comm[revision]} ]] && break + continue + fi + (( fhash > 0 )) && [[ ${line} == ' '[^[:space:]]*:* ]] && break + [[ ${line} == ' hash:'* ]] && fhash=1 && continue + (( fhash == 0 )) && continue + [[ ${PWD}/ == ${${line## ##}%:*}/* ]] && vcs_comm[basedir]=${${line## ##}%:*} + done < ~/.svk/config + + [[ -n ${vcs_comm[basedir]} ]] && \ + [[ -n ${vcs_comm[branch]} ]] && \ + [[ -n ${vcs_comm[revision]} ]] && return 0 + return 1 +} diff --git a/zshfunc/vcs-info/VCS_INFO_svk_get_data b/zshfunc/vcs-info/VCS_INFO_svk_get_data new file mode 100644 index 0000000..70d61b5 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_svk_get_data @@ -0,0 +1,9 @@ +VCS_INFO_svk_get_data () { # {{{ + local svkbranch svkbase + + svkbase=${vcs_comm[basedir]} + zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svkbranch || svkbranch="%b:%r" + zformat -f svkbranch "${svkbranch}" "b:${vcs_comm[branch]}" "r:${vcs_comm[revision]}" + VCS_INFO_formats '' "${svkbranch}" "${svkbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_svn_detect b/zshfunc/vcs-info/VCS_INFO_svn_detect new file mode 100644 index 0000000..83595db --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_svn_detect @@ -0,0 +1,5 @@ +VCS_INFO_svn_detect() { #{{{ + VCS_INFO_check_com svn || return 1 + [[ -d ".svn" ]] && return 0 + return 1 +} diff --git a/zshfunc/vcs-info/VCS_INFO_svn_get_data b/zshfunc/vcs-info/VCS_INFO_svn_get_data new file mode 100644 index 0000000..fccf016 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_svn_get_data @@ -0,0 +1,17 @@ +VCS_INFO_svn_get_data () { # {{{ + setopt localoptions noksharrays + local svnbase svnbranch + local -a svninfo + + svnbase="." + while [[ -d "${svnbase}/../.svn" ]]; do + svnbase="${svnbase}/.." + done + svnbase="$(VCS_INFO_realpath ${svnbase})" + svninfo=( ${${${(M)${(f)"$( svn info )"}:#(#s)(URL|Revision)*}/*: /}/*\//} ) + + zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svnbranch || svnbranch="%b:%r" + zformat -f svnbranch "${svnbranch}" "b:${svninfo[1]}" "r:${svninfo[2]}" + VCS_INFO_formats '' "${svnbranch}" "${svnbase}" + return 0 +} diff --git a/zshfunc/vcs-info/VCS_INFO_tla_detect b/zshfunc/vcs-info/VCS_INFO_tla_detect new file mode 100644 index 0000000..f91c96d --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_tla_detect @@ -0,0 +1,5 @@ +VCS_INFO_tla_detect() { #{{{ + VCS_INFO_check_com tla || return 1 + vcs_comm[basedir]="$(tla tree-root 2> /dev/null)" && return 0 + return 1 +} diff --git a/zshfunc/vcs-info/VCS_INFO_tla_get_data b/zshfunc/vcs-info/VCS_INFO_tla_get_data new file mode 100644 index 0000000..130ac77 --- /dev/null +++ b/zshfunc/vcs-info/VCS_INFO_tla_get_data @@ -0,0 +1,9 @@ +VCS_INFO_tla_get_data () { # {{{ + local tlabase tlabranch + + tlabase="$(VCS_INFO_realpath ${vcs_comm[basedir]})" + # tree-id gives us something like 'foo@example.com/demo--1.0--patch-4', so: + tlabranch=${${"$( tla tree-id )"}/*\//} + VCS_INFO_formats '' "${tlabranch}" "${tlabase}" + return 0 +} diff --git a/zshfunc/vcs-info/grml-vcs-info b/zshfunc/vcs-info/grml-vcs-info new file mode 100644 index 0000000..a12f5bf --- /dev/null +++ b/zshfunc/vcs-info/grml-vcs-info @@ -0,0 +1,844 @@ +# downloaded from http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc +# Sat, 27 Jun 2009 12:20:18 +0200 +# +# buchered for cvs_info + +# Filename: /etc/zsh/zshrc +# Purpose: config file for zsh (z shell) +# Authors: grml-team (grml.org), (c) Michael Prokop +# Bug-Reports: see http://grml.org/bugs/ +# License: This file is licensed under the GPL v2. + + + +# The following code is imported from the file 'zsh/functions/vcs_info' +# from , +# which distributed under the same terms as zsh itself. + +# we will be using two variables, so let the code know now. +#zstyle ':vcs_info:*' max-exports 2 + +# vcs_info() documentation: +#{{{ +# REQUIREMENTS: +#{{{ +# This functionality requires zsh version >= 4.1.*. +#}}} +# +# LOADING: +#{{{ +# To load vcs_info(), copy this file to your $fpath[] and do: +# % autoload -Uz vcs_info && vcs_info +# +# To work, vcs_info() needs 'setopt prompt_subst' in your setup. +#}}} +# +# QUICKSTART: +#{{{ +# To get vcs_info() working quickly (including colors), you can do the +# following (assuming, you loaded vcs_info() properly - see above): +# +# % RED=$'%{\e[31m%}' +# % GR=$'%{\e[32m%}' +# % MA=$'%{\e[35m%}' +# % YE=$'%{\e[33m%}' +# % NC=$'%{\e[0m%}' +# +# % zstyle ':vcs_info:*' actionformats \ +# "${MA}(${NC}%s${MA})${YE}-${MA}[${GR}%b${YE}|${RED}%a${MA}]${NC} " +# +# % zstyle ':vcs_info:*' formats \ +# "${MA}(${NC}%s${MA})${Y}-${MA}[${GR}%b${MA}]${NC}%} " +# +# % zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YE}%r" +# +# % precmd () { vcs_info } +# % PS1='${MA}[${GR}%n${MA}] ${MA}(${RED}%!${MA}) ${YE}%3~ ${VCS_INFO_message_0_}${NC}%# ' +# +# Obviously, the las two lines are there for demonstration: You need to +# call vcs_info() from your precmd() function (see 'SPECIAL FUNCTIONS' in +# 'man zshmisc'). Once that is done you need a *single* quoted +# '${VCS_INFO_message_0_}' in your prompt. +# +# Now call the 'vcs_info_printsys' utility from the command line: +# +# % vcs_info_printsys +# # list of supported version control backends: +# # disabled systems are prefixed by a hash sign (#) +# git +# hg +# bzr +# darcs +# svk +# mtn +# svn +# cvs +# cdv +# tla +# # flavours (cannot be used in the disable style; they +# # are disabled with their master [git-svn -> git]): +# git-p4 +# git-svn +# +# Ten version control backends as you can see. You may not want all +# of these. Because there is no point in running the code to detect +# systems you do not use. ever. So, there is a way to disable some +# backends altogether: +# +# % zstyle ':vcs_info:*' disable bzr cdv darcs mtn svk tla +# +# If you rerun 'vcs_info_printsys' now, you will see the backends listed +# in the 'disable' style marked as diabled by a hash sign. That means the +# detection of these systems is skipped *completely*. No wasted time there. +# +# For more control, read the reference below. +#}}} +# +# CONFIGURATION: +#{{{ +# The vcs_info() feature can be configured via zstyle. +# +# First, the context in which we are working: +# :vcs_info:: +# +# ...where is one of: +# - git, git-svn, git-p4, hg, darcs, bzr, cdv, mtn, svn, cvs, svk or tla. +# +# ...and is a freely configurable string, assignable by the +# user as the first argument to vcs_info() (see its description below). +# +# There is are three special values for : The first is named +# 'init', that is in effect as long as there was no decision what vcs +# backend to use. The second is 'preinit; it is used *before* vcs_info() +# is run, when initializing the data exporting variables. The third +# special value is 'formats' and is used by the 'vcs_info_lastmsg' for +# looking up its styles. +# +# There are two pre-defined values for : +# default - the one used if none is specified +# command - used by vcs_info_lastmsg to lookup its styles. +# +# You may *not* use 'print_systems_' as a user-context string, because it +# is used internally. +# +# You can of course use ':vcs_info:*' to match all VCSs in all +# user-contexts at once. +# +# Another special context is 'formats', which is used by the +# vcs_info_lastmsg() utility function (see below). +# +# +# This is a description of all styles, that are looked up: +# formats - A list of formats, used when actionformats is not +# used (which is most of the time). +# actionformats - A list of formats, used if a there is a special +# action going on in your current repository; +# (like an interactive rebase or a merge conflict) +# branchformat - Some backends replace %b in the formats and +# actionformats styles above, not only by a branch +# name but also by a revision number. This style +# let's you modify how that string should look like. +# nvcsformats - These "formats" are exported, when we didn't detect +# a version control system for the current directory. +# This is useful, if you want vcs_info() to completely +# take over the generation of your prompt. +# You would do something like +# PS1='${VCS_INFO_message_0_}' +# to accomplish that. +# max-exports - Defines the maximum number if VCS_INFO_message_*_ +# variables vcs_info() will export. +# enable - Checked in the 'init' context. If set to false, +# vcs_info() will do nothing. +# disable - Provide a list of systems, you don't want +# the vcs_info() to check for repositories +# (checked in the 'init' context, too). +# disable-patterns - A list of patterns that are checked against $PWD. +# If the pattern matches, vcs_info will be disabled. +# Say, ~/.zsh is a directory under version control, +# in which you do not want vcs_info to be active, do: +# zstyle ':vcs_info:*' disable-patterns "$HOME/.zsh+(|/*)" +# use-simple - If there are two different ways of gathering +# information, you can select the simpler one +# by setting this style to true; the default +# is to use the not-that-simple code, which is +# potentially a lot slower but might be more +# accurate in all possible cases. +# use-prompt-escapes - determines if we assume that the assembled +# string from vcs_info() includes prompt escapes. +# (Used by vcs_info_lastmsg(). +# +# The use-simple style is only available for the bzr backend. +# +# The default values for these in all contexts are: +# formats " (%s)-[%b|%a]-" +# actionformats " (%s)-[%b]-" +# branchformat "%b:%r" (for bzr, svn and svk) +# nvcsformats "" +# max-exports 2 +# enable true +# disable (empty list) +# disable-patterns (empty list) +# use-simple false +# use-prompt-escapes true +# +# +# In normal formats and actionformats, the following replacements +# are done: +# %s - The vcs in use (git, hg, svn etc.) +# %b - Information about the current branch. +# %a - An identifier, that describes the action. +# Only makes sense in actionformats. +# %R - base directory of the repository. +# %r - repository name +# If %R is '/foo/bar/repoXY', %r is 'repoXY'. +# %S - subdirectory within a repository. if $PWD is +# '/foo/bar/reposXY/beer/tasty', %S is 'beer/tasty'. +# +# +# In branchformat these replacements are done: +# %b - the branch name +# %r - the current revision number +# +# Not all vcs backends have to support all replacements. +# nvcsformat does not perform *any* replacements. It is just a string. +#}}} +# +# ODDITIES: +#{{{ +# If you want to use the %b (bold off) prompt expansion in 'formats', which +# expands %b itself, use %%b. That will cause the vcs_info() expansion to +# replace %%b with %b. So zsh's prompt expansion mechanism can handle it. +# Similarly, to hand down %b from branchformat, use %%%%b. Sorry for this +# inconvenience, but it cannot be easily avoided. Luckily we do not clash +# with a lot of prompt expansions and this only needs to be done for those. +# See 'man zshmisc' for details about EXPANSION OF PROMPT SEQUENCES. +#}}} +# +# FUNCTION DESCRIPTIONS (public API): +#{{{ +# vcs_info() +# The main function, that runs all backends and assembles +# all data into ${VCS_INFO_message_*_}. This is the function +# you want to call from precmd() if you want to include +# up-to-date information in your prompt (see VARIABLE +# DESCRIPTION below). +# +# vcs_info_printsys() +# Prints a list of all supported version control systems. +# Useful to find out possible contexts (and which of them are enabled) +# or values for the 'disable' style. +# +# vcs_info_lastmsg() +# Outputs the last ${VCS_INFO_message_*_} value. Takes into account +# the value of the use-prompt-escapes style in ':vcs_info:formats'. +# It also only prints max-exports values. +# +# All functions named VCS_INFO_* are for internal use only. +#}}} +# +# VARIABLE DESCRIPTION: +#{{{ +# ${VCS_INFO_message_N_} (Note the trailing underscore) +# Where 'N' is an integer, eg: VCS_INFO_message_0_ +# These variables are the storage for the informational message the +# last vcs_info() call has assembled. These are strongly connected +# to the formats, actionformats and nvcsformats styles described +# above. Those styles are lists. the first member of that list gets +# expanded into ${VCS_INFO_message_0_}, the second into +# ${VCS_INFO_message_1_} and the Nth into ${VCS_INFO_message_N-1_}. +# These parameters are exported into the environment. +# (See the max-exports style above.) +#}}} +# +# EXAMPLES: +#{{{ +# Don't use vcs_info at all (even though it's in your prompt): +# % zstyle ':vcs_info:*' enable false +# +# Disable the backends for bzr and svk: +# % zstyle ':vcs_info:*' disable bzr svk +# +# Provide a special formats for git: +# % zstyle ':vcs_info:git:*' formats ' GIT, BABY! [%b]' +# % zstyle ':vcs_info:git:*' actionformats ' GIT ACTION! [%b|%a]' +# +# Use the quicker bzr backend (if you do, please report if it does +# the-right-thing[tm] - thanks): +# % zstyle ':vcs_info:bzr:*' use-simple true +# +# Display the revision number in yellow for bzr and svn: +# % zstyle ':vcs_info:(svn|bzr):*' branchformat '%b%{'${fg[yellow]}'%}:%r' +# +# If you want colors, make sure you enclose the color codes in %{...%}, +# if you want to use the string provided by vcs_info() in prompts. +# +# Here is how to print the vcs infomation as a command: +# % alias vcsi='vcs_info command; vcs_info_lastmsg' +# +# This way, you can even define different formats for output via +# vcs_info_lastmsg() in the ':vcs_info:command:*' namespace. +#}}} +#}}} +# utilities +VCS_INFO_adjust () { #{{{ + [[ -n ${vcs_comm[overwrite_name]} ]] && vcs=${vcs_comm[overwrite_name]} + return 0 +} +# }}} +VCS_INFO_check_com () { #{{{ + (( ${+commands[$1]} )) && [[ -x ${commands[$1]} ]] && return 0 + return 1 +} +# }}} +VCS_INFO_formats () { # {{{ + setopt localoptions noksharrays + local action=$1 branch=$2 base=$3 + local msg + local -i i + + if [[ -n ${action} ]] ; then + zstyle -a ":vcs_info:${vcs}:${usercontext}" actionformats msgs + (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b|%a]-' + else + zstyle -a ":vcs_info:${vcs}:${usercontext}" formats msgs + (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b]-' + fi + + (( ${#msgs} > maxexports )) && msgs[$(( maxexports + 1 )),-1]=() + for i in {1..${#msgs}} ; do + zformat -f msg ${msgs[$i]} \ + a:${action} \ + b:${branch} \ + r:${base:t} \ + s:${vcs} \ + R:${base} \ + S:"$(VCS_INFO_reposub ${base})" + msgs[$i]=${msg} + done + return 0 +} +# }}} +VCS_INFO_maxexports () { #{{{ + zstyle -s ":vcs_info:${vcs}:${usercontext}" "max-exports" maxexports || maxexports=2 + if [[ ${maxexports} != <-> ]] || (( maxexports < 1 )); then + printf 'vcs_info(): expecting numeric arg >= 1 for max-exports (got %s).\n' ${maxexports} + printf 'Defaulting to 2.\n' + maxexports=2 + fi +} +# }}} +VCS_INFO_nvcsformats () { #{{{ + setopt localoptions noksharrays + local c v + + if [[ $1 == 'preinit' ]] ; then + c=default + v=preinit + fi + zstyle -a ":vcs_info:${v:-$vcs}:${c:-$usercontext}" nvcsformats msgs + (( ${#msgs} > maxexports )) && msgs[${maxexports},-1]=() +} +# }}} +VCS_INFO_realpath () { #{{{ + # a portable 'readlink -f' + # forcing a subshell, to ensure chpwd() is not removed + # from the calling shell (if VCS_INFO_realpath() is called + # manually). + ( + (( ${+functions[chpwd]} )) && unfunction chpwd + setopt chaselinks + cd $1 2>/dev/null && pwd + ) +} +# }}} +VCS_INFO_reposub () { #{{{ + setopt localoptions extendedglob + local base=${1%%/##} + + [[ ${PWD} == ${base}/* ]] || { + printf '.' + return 1 + } + printf '%s' ${PWD#$base/} + return 0 +} +# }}} +VCS_INFO_set () { #{{{ + setopt localoptions noksharrays + local -i i j + + if [[ $1 == '--clear' ]] ; then + for i in {0..9} ; do + unset VCS_INFO_message_${i}_ + done + fi + if [[ $1 == '--nvcs' ]] ; then + [[ $2 == 'preinit' ]] && (( maxexports == 0 )) && (( maxexports = 1 )) + for i in {0..$((maxexports - 1))} ; do + typeset -gx VCS_INFO_message_${i}_= + done + VCS_INFO_nvcsformats $2 + fi + + (( ${#msgs} - 1 < 0 )) && return 0 + for i in {0..$(( ${#msgs} - 1 ))} ; do + (( j = i + 1 )) + typeset -gx VCS_INFO_message_${i}_=${msgs[$j]} + done + return 0 +} +# }}} +# information gathering +VCS_INFO_bzr_get_data () { # {{{ + setopt localoptions noksharrays + local bzrbase bzrbr + local -a bzrinfo + + if zstyle -t ":vcs_info:${vcs}:${usercontext}" "use-simple" ; then + bzrbase=${vcs_comm[basedir]} + bzrinfo[2]=${bzrbase:t} + if [[ -f ${bzrbase}/.bzr/branch/last-revision ]] ; then + bzrinfo[1]=$(< ${bzrbase}/.bzr/branch/last-revision) + bzrinfo[1]=${${bzrinfo[1]}%% *} + fi + else + bzrbase=${${(M)${(f)"$( bzr info )"}:# ##branch\ root:*}/*: ##/} + bzrinfo=( ${${${(M)${(f)"$( bzr version-info )"}:#(#s)(revno|branch-nick)*}/*: /}/*\//} ) + bzrbase="$(VCS_INFO_realpath ${bzrbase})" + fi + + zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat bzrbr || bzrbr="%b:%r" + zformat -f bzrbr "${bzrbr}" "b:${bzrinfo[2]}" "r:${bzrinfo[1]}" + VCS_INFO_formats '' "${bzrbr}" "${bzrbase}" + return 0 +} +# }}} +VCS_INFO_cdv_get_data () { # {{{ + local cdvbase + + cdvbase=${vcs_comm[basedir]} + VCS_INFO_formats '' "${cdvbase:t}" "${cdvbase}" + return 0 +} +# }}} +VCS_INFO_cvs_get_data () { # {{{ + local cvsbranch cvsbase basename + + cvsbase="." + while [[ -d "${cvsbase}/../CVS" ]]; do + cvsbase="${cvsbase}/.." + done + cvsbase="$(VCS_INFO_realpath ${cvsbase})" + cvsbranch=$(< ./CVS/Repository) + basename=${cvsbase:t} + cvsbranch=${cvsbranch##${basename}/} + [[ -z ${cvsbranch} ]] && cvsbranch=${basename} + VCS_INFO_formats '' "${cvsbranch}" "${cvsbase}" + return 0 +} +# }}} +VCS_INFO_darcs_get_data () { # {{{ + local darcsbase + + darcsbase=${vcs_comm[basedir]} + VCS_INFO_formats '' "${darcsbase:t}" "${darcsbase}" + return 0 +} +# }}} +VCS_INFO_git_getaction () { #{{{ + local gitaction='' gitdir=$1 + local tmp + + for tmp in "${gitdir}/rebase-apply" \ + "${gitdir}/rebase" \ + "${gitdir}/../.dotest" ; do + if [[ -d ${tmp} ]] ; then + if [[ -f "${tmp}/rebasing" ]] ; then + gitaction="rebase" + elif [[ -f "${tmp}/applying" ]] ; then + gitaction="am" + else + gitaction="am/rebase" + fi + printf '%s' ${gitaction} + return 0 + fi + done + + for tmp in "${gitdir}/rebase-merge/interactive" \ + "${gitdir}/.dotest-merge/interactive" ; do + if [[ -f "${tmp}" ]] ; then + printf '%s' "rebase-i" + return 0 + fi + done + + for tmp in "${gitdir}/rebase-merge" \ + "${gitdir}/.dotest-merge" ; do + if [[ -d "${tmp}" ]] ; then + printf '%s' "rebase-m" + return 0 + fi + done + + if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then + printf '%s' "merge" + return 0 + fi + + if [[ -f "${gitdir}/BISECT_LOG" ]] ; then + printf '%s' "bisect" + return 0 + fi + return 1 +} +# }}} +VCS_INFO_git_getbranch () { #{{{ + local gitbranch gitdir=$1 + local gitsymref='git symbolic-ref HEAD' + + if [[ -d "${gitdir}/rebase-apply" ]] \ + || [[ -d "${gitdir}/rebase" ]] \ + || [[ -d "${gitdir}/../.dotest" ]] \ + || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then + gitbranch="$(${(z)gitsymref} 2> /dev/null)" + [[ -z ${gitbranch} ]] && [[ -r ${gitdir}/rebase-apply/head-name ]] \ + && gitbranch="$(< ${gitdir}/rebase-apply/head-name)" + + elif [[ -f "${gitdir}/rebase-merge/interactive" ]] \ + || [[ -d "${gitdir}/rebase-merge" ]] ; then + gitbranch="$(< ${gitdir}/rebase-merge/head-name)" + + elif [[ -f "${gitdir}/.dotest-merge/interactive" ]] \ + || [[ -d "${gitdir}/.dotest-merge" ]] ; then + gitbranch="$(< ${gitdir}/.dotest-merge/head-name)" + + else + gitbranch="$(${(z)gitsymref} 2> /dev/null)" + + if [[ $? -ne 0 ]] ; then + gitbranch="$(git describe --exact-match HEAD 2>/dev/null)" + + if [[ $? -ne 0 ]] ; then + gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..." + fi + fi + fi + + printf '%s' "${gitbranch##refs/heads/}" + return 0 +} +# }}} +VCS_INFO_git_get_data () { # {{{ + setopt localoptions extendedglob + local gitdir gitbase gitbranch gitaction + + gitdir=${vcs_comm[gitdir]} + gitbranch="$(VCS_INFO_git_getbranch ${gitdir})" + + if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then + return 1 + fi + + VCS_INFO_adjust + gitaction="$(VCS_INFO_git_getaction ${gitdir})" + gitbase=${PWD%/${$( git rev-parse --show-prefix )%/##}} + VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}" + return 0 +} +# }}} +VCS_INFO_hg_get_data () { # {{{ + local hgbranch hgbase file + + hgbase=${vcs_comm[basedir]} + + file="${hgbase}/.hg/branch" + if [[ -r ${file} ]] ; then + hgbranch=$(< ${file}) + else + hgbranch='default' + fi + + VCS_INFO_formats '' "${hgbranch}" "${hgbase}" + return 0 +} +# }}} +VCS_INFO_mtn_get_data () { # {{{ + local mtnbranch mtnbase + + mtnbase=${vcs_comm[basedir]} + mtnbranch=${${(M)${(f)"$( mtn status )"}:#(#s)Current branch:*}/*: /} + VCS_INFO_formats '' "${mtnbranch}" "${mtnbase}" + return 0 +} +# }}} +VCS_INFO_svk_get_data () { # {{{ + local svkbranch svkbase + + svkbase=${vcs_comm[basedir]} + zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svkbranch || svkbranch="%b:%r" + zformat -f svkbranch "${svkbranch}" "b:${vcs_comm[branch]}" "r:${vcs_comm[revision]}" + VCS_INFO_formats '' "${svkbranch}" "${svkbase}" + return 0 +} +# }}} +VCS_INFO_svn_get_data () { # {{{ + setopt localoptions noksharrays + local svnbase svnbranch + local -a svninfo + + svnbase="." + while [[ -d "${svnbase}/../.svn" ]]; do + svnbase="${svnbase}/.." + done + svnbase="$(VCS_INFO_realpath ${svnbase})" + svninfo=( ${${${(M)${(f)"$( svn info )"}:#(#s)(URL|Revision)*}/*: /}/*\//} ) + + zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svnbranch || svnbranch="%b:%r" + zformat -f svnbranch "${svnbranch}" "b:${svninfo[1]}" "r:${svninfo[2]}" + VCS_INFO_formats '' "${svnbranch}" "${svnbase}" + return 0 +} +# }}} +VCS_INFO_tla_get_data () { # {{{ + local tlabase tlabranch + + tlabase="$(VCS_INFO_realpath ${vcs_comm[basedir]})" + # tree-id gives us something like 'foo@example.com/demo--1.0--patch-4', so: + tlabranch=${${"$( tla tree-id )"}/*\//} + VCS_INFO_formats '' "${tlabranch}" "${tlabase}" + return 0 +} +# }}} +# detection +VCS_INFO_detect_by_dir() { #{{{ + local dirname=$1 + local basedir="." realbasedir + + realbasedir="$(VCS_INFO_realpath ${basedir})" + while [[ ${realbasedir} != '/' ]]; do + if [[ -n ${vcs_comm[detect_need_file]} ]] ; then + [[ -d ${basedir}/${dirname} ]] && \ + [[ -e ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \ + break + else + [[ -d ${basedir}/${dirname} ]] && break + fi + + basedir=${basedir}/.. + realbasedir="$(VCS_INFO_realpath ${basedir})" + done + + [[ ${realbasedir} == "/" ]] && return 1 + vcs_comm[basedir]=${realbasedir} + return 0 +} +# }}} +VCS_INFO_bzr_detect() { #{{{ + VCS_INFO_check_com bzr || return 1 + vcs_comm[detect_need_file]=branch/format + VCS_INFO_detect_by_dir '.bzr' + return $? +} +# }}} +VCS_INFO_cdv_detect() { #{{{ + VCS_INFO_check_com cdv || return 1 + vcs_comm[detect_need_file]=format + VCS_INFO_detect_by_dir '.cdv' + return $? +} +# }}} +VCS_INFO_cvs_detect() { #{{{ + VCS_INFO_check_com svn || return 1 + [[ -d "./CVS" ]] && [[ -r "./CVS/Repository" ]] && return 0 + return 1 +} +# }}} +VCS_INFO_darcs_detect() { #{{{ + VCS_INFO_check_com darcs || return 1 + vcs_comm[detect_need_file]=format + VCS_INFO_detect_by_dir '_darcs' + return $? +} +# }}} +VCS_INFO_git_detect() { #{{{ + if VCS_INFO_check_com git && git rev-parse --is-inside-work-tree &> /dev/null ; then + vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1 + if [[ -d ${vcs_comm[gitdir]}/svn ]] ; then vcs_comm[overwrite_name]='git-svn' + elif [[ -d ${vcs_comm[gitdir]}/refs/remotes/p4 ]] ; then vcs_comm[overwrite_name]='git-p4' ; fi + return 0 + fi + return 1 +} +# }}} +VCS_INFO_hg_detect() { #{{{ + VCS_INFO_check_com hg || return 1 + vcs_comm[detect_need_file]=store + VCS_INFO_detect_by_dir '.hg' + return $? +} +# }}} +VCS_INFO_mtn_detect() { #{{{ + VCS_INFO_check_com mtn || return 1 + vcs_comm[detect_need_file]=revision + VCS_INFO_detect_by_dir '_MTN' + return $? +} +# }}} +VCS_INFO_svk_detect() { #{{{ + setopt localoptions noksharrays extendedglob + local -a info + local -i fhash + fhash=0 + + VCS_INFO_check_com svk || return 1 + [[ -f ~/.svk/config ]] || return 1 + + # This detection function is a bit different from the others. + # We need to read svk's config file to detect a svk repository + # in the first place. Therefore, we'll just proceed and read + # the other information, too. This is more then any of the + # other detections do but this takes only one file open for + # svk at most. VCS_INFO_svk_get_data() get simpler, too. :-) + while IFS= read -r line ; do + if [[ -n ${vcs_comm[basedir]} ]] ; then + line=${line## ##} + [[ ${line} == depotpath:* ]] && vcs_comm[branch]=${line##*/} + [[ ${line} == revision:* ]] && vcs_comm[revision]=${line##*[[:space:]]##} + [[ -n ${vcs_comm[branch]} ]] && [[ -n ${vcs_comm[revision]} ]] && break + continue + fi + (( fhash > 0 )) && [[ ${line} == ' '[^[:space:]]*:* ]] && break + [[ ${line} == ' hash:'* ]] && fhash=1 && continue + (( fhash == 0 )) && continue + [[ ${PWD}/ == ${${line## ##}%:*}/* ]] && vcs_comm[basedir]=${${line## ##}%:*} + done < ~/.svk/config + + [[ -n ${vcs_comm[basedir]} ]] && \ + [[ -n ${vcs_comm[branch]} ]] && \ + [[ -n ${vcs_comm[revision]} ]] && return 0 + return 1 +} +# }}} +VCS_INFO_svn_detect() { #{{{ + VCS_INFO_check_com svn || return 1 + [[ -d ".svn" ]] && return 0 + return 1 +} +# }}} +VCS_INFO_tla_detect() { #{{{ + VCS_INFO_check_com tla || return 1 + vcs_comm[basedir]="$(tla tree-root 2> /dev/null)" && return 0 + return 1 +} +# }}} +# public API +vcs_info_printsys () { # {{{ + vcs_info print_systems_ +} +# }}} +vcs_info_lastmsg () { # {{{ + local -i i + + VCS_INFO_maxexports + for i in {0..$((maxexports - 1))} ; do + printf '$VCS_INFO_message_%d_: "' $i + if zstyle -T ':vcs_info:formats:command' use-prompt-escapes ; then + print -nP ${(P)${:-VCS_INFO_message_${i}_}} + else + print -n ${(P)${:-VCS_INFO_message_${i}_}} + fi + printf '"\n' + done +} +# }}} +vcs_info () { # {{{ + local pat + local -i found + local -a VCSs disabled dps + local -x vcs usercontext + local -ix maxexports + local -ax msgs + local -Ax vcs_comm + + vcs="init" + VCSs=(git hg bzr darcs svk mtn svn cvs cdv tla) + case $1 in + (print_systems_) + zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled + print -l '# list of supported version control backends:' \ + '# disabled systems are prefixed by a hash sign (#)' + for vcs in ${VCSs} ; do + [[ -n ${(M)disabled:#${vcs}} ]] && printf '#' + printf '%s\n' ${vcs} + done + print -l '# flavours (cannot be used in the disable style; they' \ + '# are disabled with their master [git-svn -> git]):' \ + git-{p4,svn} + return 0 + ;; + ('') + [[ -z ${usercontext} ]] && usercontext=default + ;; + (*) [[ -z ${usercontext} ]] && usercontext=$1 + ;; + esac + + zstyle -T ":vcs_info:${vcs}:${usercontext}" "enable" || { + [[ -n ${VCS_INFO_message_0_} ]] && VCS_INFO_set --clear + return 0 + } + zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled + + zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable-patterns" dps + for pat in ${dps} ; do + if [[ ${PWD} == ${~pat} ]] ; then + [[ -n ${vcs_info_msg_0_} ]] && VCS_INFO_set --clear + return 0 + fi + done + + VCS_INFO_maxexports + + (( found = 0 )) + for vcs in ${VCSs} ; do + [[ -n ${(M)disabled:#${vcs}} ]] && continue + vcs_comm=() + VCS_INFO_${vcs}_detect && (( found = 1 )) && break + done + + (( found == 0 )) && { + VCS_INFO_set --nvcs + return 0 + } + + VCS_INFO_${vcs}_get_data || { + VCS_INFO_set --nvcs + return 1 + } + + VCS_INFO_set + return 0 +} + +#VCS_INFO_set --nvcs preinit +# }}} + +# Change vcs_info formats for the grml prompt. The 2nd format sets up +# $vcs_info_msg_1_ to contain "zsh: repo-name" used to set our screen title. +# TODO: The included vcs_info() version still uses $VCS_INFO_message_N_. +# That needs to be the use of $VCS_INFO_message_N_ needs to be changed +# to $vcs_info_msg_N_ as soon as we use the included version. +#if [[ "$TERM" == dumb ]] ; then +# zstyle ':vcs_info:*' actionformats "(%s%)-[%b|%a] " "zsh: %r" +# zstyle ':vcs_info:*' formats "(%s%)-[%b] " "zsh: %r" +#else +# # these are the same, just with a lot of colours: +# zstyle ':vcs_info:*' actionformats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} " \ +# "zsh: %r" +# zstyle ':vcs_info:*' formats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} " \ +# "zsh: %r" +# zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YELLOW}%r" +#fi + +# }}} diff --git a/zshfunc/vcs-info/vcs_info b/zshfunc/vcs-info/vcs_info new file mode 100644 index 0000000..1a90aa6 --- /dev/null +++ b/zshfunc/vcs-info/vcs_info @@ -0,0 +1,68 @@ +vcs_info () { # {{{ + local pat + local -i found + local -a VCSs disabled dps + local -x vcs usercontext + local -ix maxexports + local -ax msgs + local -Ax vcs_comm + + vcs="init" + VCSs=(git hg bzr darcs svk mtn svn cvs cdv tla) + case $1 in + (print_systems_) + zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled + print -l '# list of supported version control backends:' \ + '# disabled systems are prefixed by a hash sign (#)' + for vcs in ${VCSs} ; do + [[ -n ${(M)disabled:#${vcs}} ]] && printf '#' + printf '%s\n' ${vcs} + done + print -l '# flavours (cannot be used in the disable style; they' \ + '# are disabled with their master [git-svn -> git]):' \ + git-{p4,svn} + return 0 + ;; + ('') + [[ -z ${usercontext} ]] && usercontext=default + ;; + (*) [[ -z ${usercontext} ]] && usercontext=$1 + ;; + esac + + zstyle -T ":vcs_info:${vcs}:${usercontext}" "enable" || { + [[ -n ${VCS_INFO_message_0_} ]] && VCS_INFO_set --clear + return 0 + } + zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled + + zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable-patterns" dps + for pat in ${dps} ; do + if [[ ${PWD} == ${~pat} ]] ; then + [[ -n ${vcs_info_msg_0_} ]] && VCS_INFO_set --clear + return 0 + fi + done + + VCS_INFO_maxexports + + (( found = 0 )) + for vcs in ${VCSs} ; do + [[ -n ${(M)disabled:#${vcs}} ]] && continue + vcs_comm=() + VCS_INFO_${vcs}_detect && (( found = 1 )) && break + done + + (( found == 0 )) && { + VCS_INFO_set --nvcs + return 0 + } + + VCS_INFO_${vcs}_get_data || { + VCS_INFO_set --nvcs + return 1 + } + + VCS_INFO_set + return 0 +} diff --git a/zshfunc/vcs-info/vcs_info_lastmsg b/zshfunc/vcs-info/vcs_info_lastmsg new file mode 100644 index 0000000..6e00ddc --- /dev/null +++ b/zshfunc/vcs-info/vcs_info_lastmsg @@ -0,0 +1,14 @@ +vcs_info_lastmsg () { # {{{ + local -i i + + VCS_INFO_maxexports + for i in {0..$((maxexports - 1))} ; do + printf '$VCS_INFO_message_%d_: "' $i + if zstyle -T ':vcs_info:formats:command' use-prompt-escapes ; then + print -nP ${(P)${:-VCS_INFO_message_${i}_}} + else + print -n ${(P)${:-VCS_INFO_message_${i}_}} + fi + printf '"\n' + done +} diff --git a/zshfunc/vcs-info/vcs_info_printsys b/zshfunc/vcs-info/vcs_info_printsys new file mode 100644 index 0000000..c585393 --- /dev/null +++ b/zshfunc/vcs-info/vcs_info_printsys @@ -0,0 +1,3 @@ +vcs_info_printsys () { # {{{ + vcs_info print_systems_ +} -- cgit v1.2.3