Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

vcs_info: check-for-changes style



vcs_info: the git backend can now tell you about staged or unstaged
changes within a repository.

Includes documentation updates.

---

I saw a comment on a guy's blog who has done a git-aware prompt for zsh in
which the person commenting mentioned vcs_info. The person blogging replied
by 'well, can it tell me whether there are staged or unstaged changes in my
repository?'. The answer used to be 'no'. But no more. :)

Note that this feature might annoy you if you're working primarily in big
repos (and older hardware).

The git backend is pretty snappy itself. Even on my laptop at 600MHz I'm
noticing no delay. Not even in a linux-2.6 repository.

Enabling 'check-for-changes' gives me a very noticeable delay in the linux
repo. It's bearable (but hey, bearable is very subjective, isn't it?) in
a warm cache situation. I wouldn't enable it in a repo that size
myself...

It's okay on medium sized repos and nearly not measurable on small
repositories.

Because of that penalty the feature is disabled by default. Choose for yourself.


 Doc/Zsh/contrib.yo                                 |   30 ++++++++++++++++++++
 Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr  |    2 +-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_cdv  |    2 +-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs  |    2 +-
 .../VCS_Info/Backends/VCS_INFO_get_data_darcs      |    2 +-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_git  |   12 ++++++-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_hg   |    2 +-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_mtn  |    2 +-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_p4   |    2 +-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_svk  |    2 +-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_svn  |    2 +-
 Functions/VCS_Info/Backends/VCS_INFO_get_data_tla  |    2 +-
 Functions/VCS_Info/VCS_INFO_formats                |   22 +++++++++++++-
 13 files changed, 70 insertions(+), 14 deletions(-)

diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index ad8246f..43dba25 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -516,6 +516,27 @@ Say, tt(~/.zsh) is a directory under version control, in which you do
 not want var(vcs_info) to be active, do:
 example(zstyle ':vcs_info:*' disable-patterns "$HOME/.zsh+LPAR()|/*+RPAR()")
 )
+kindex(check-for-changes)
+item(tt(check-for-changes))(
+If enabled, this style (currently only used by the tt(git) backend) causes the
+tt(%c) and tt(%u) format escapes to be filled with information. The strings
+filled into these escapes can be controlled via the var(stagedstr) and
+var(unstagedstr) styles.
+
+Note, that the actions taken if this style is enabled are potentially expensive
+(read: they take time, depending on how big the current repository is).
+Therefore, it is disabled by default.
+)
+kindex(stagedstr)
+item(tt(stagedstr))(
+This string will be used in the tt(%c) escape if there are staged changes in
+the repository.
+)
+kindex(unstagedstr)
+item(tt(unstagedstr))(
+This string will be used in the tt(%u) escape if there are unstaged changes in
+the repository.
+)
 kindex(command)
 item(tt(command))(
 This style causes var(vcs_info) to use the supplied string as the command
@@ -576,7 +597,12 @@ sitem(tt(nvcsformats))("")
 sitem(tt(max-exports))(2)
 sitem(tt(enable))(ALL)
 sitem(tt(disable))((empty list))
+sitem(tt(disable-patterns))((empty list))
+sitem(tt(check-for-changes))(false)
+sitem(tt(stagedstr))((string: "S"))
+sitem(tt(unstagedstr))((string: "U"))
 sitem(tt(command))((empty string))
+sitem(tt(use-server))(false)
 sitem(tt(use-simple))(false)
 sitem(tt(use-prompt-escapes))(true)
 endsitem()
@@ -589,6 +615,10 @@ sitem(tt(%s))(The vcs in use (git, hg, svn etc.))
 sitem(tt(%b))(Information about the current branch.)
 sitem(tt(%a))(An identifier, that describes the action. Only makes sense in
 actionformats.)
+sitem(tt(%c))(The string from the var(stagedstr) style if there are staged
+changes in the repository.)
+sitem(tt(%u))(The string from the var(unstagedstr) style if there are unstaged
+changes in the repository.)
 sitem(tt(%R))(base directory of the repository.)
 sitem(tt(%r))(repository name. If tt(%R) is var(/foo/bar/repoXY), tt(%r) is
 var(repoXY).)
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr b/Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr
index 31618d3..1030c06 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_bzr
@@ -22,5 +22,5 @@ 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]}"
-VCS_INFO_formats '' "${bzrbr}" "${bzrbase}"
+VCS_INFO_formats '' "${bzrbr}" "${bzrbase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_cdv b/Functions/VCS_Info/Backends/VCS_INFO_get_data_cdv
index be8b4d8..2c516ea 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_cdv
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_cdv
@@ -7,5 +7,5 @@ local cdvbase
 
 cdvbase=${vcs_comm[basedir]}
 rrn=${cdvbase:t}
-VCS_INFO_formats '' "${cdvbase:t}" "${cdvbase}"
+VCS_INFO_formats '' "${cdvbase:t}" "${cdvbase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs b/Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs
index fa1ceca..1c222ce 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs
@@ -14,5 +14,5 @@ cvsbranch=$(< ./CVS/Repository)
 rrn=${cvsbase:t}
 cvsbranch=${cvsbranch##${rrn}/}
 [[ -z ${cvsbranch} ]] && cvsbranch=${rrn}
-VCS_INFO_formats '' "${cvsbranch}" "${cvsbase}"
+VCS_INFO_formats '' "${cvsbranch}" "${cvsbase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_darcs b/Functions/VCS_Info/Backends/VCS_INFO_get_data_darcs
index 9fd3554..a1ebbb6 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_darcs
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_darcs
@@ -7,5 +7,5 @@ local darcsbase
 
 darcsbase=${vcs_comm[basedir]}
 rrn=${darcsbase:t}
-VCS_INFO_formats '' "${darcsbase:t}" "${darcsbase}"
+VCS_INFO_formats '' "${darcsbase:t}" "${darcsbase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
index 23545e5..75d39cc 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
@@ -3,7 +3,7 @@
 ## Distributed under the same BSD-ish license as zsh itself.
 
 setopt localoptions extendedglob NO_shwordsplit
-local gitdir gitbase gitbranch gitaction
+local gitdir gitbase gitbranch gitaction gitunstaged gitstaged
 
 VCS_INFO_git_getaction () {
     local gitaction='' gitdir=$1
@@ -96,9 +96,17 @@ if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then
     return 1
 fi
 
+if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" "check-for-changes" ; then
+    # Default: off - these are potentially expensive on big repositories
+    ${vcs_comm[cmd]} diff --no-ext-diff --ignore-submodules --quiet --exit-code ||
+        gitunstaged=1
+    ${vcs_comm[cmd]} diff-index --cached --quiet --ignore-submodules HEAD ||
+        gitstaged=1
+fi
+
 VCS_INFO_adjust
 gitaction="$(VCS_INFO_git_getaction ${gitdir})"
 gitbase=${PWD%/${$( ${vcs_comm[cmd]} rev-parse --show-prefix )%/##}}
 rrn=${gitbase:t}
-VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}"
+VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}" "${gitstaged}" "${gitunstaged}"
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
index af9d85c..fb7c450 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
@@ -8,5 +8,5 @@ local hgbranch hgbase
 hgbase=${vcs_comm[basedir]}
 rrn=${hgbase:t}
 hgbranch=$(< ${hgbase}/.hg/branch)
-VCS_INFO_formats '' "${hgbranch}" "${hgbase}"
+VCS_INFO_formats '' "${hgbranch}" "${hgbase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_mtn b/Functions/VCS_Info/Backends/VCS_INFO_get_data_mtn
index 688c85e..63f0601 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_mtn
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_mtn
@@ -8,5 +8,5 @@ local mtnbranch mtnbase
 mtnbase=${vcs_comm[basedir]}
 rrn=${mtnbase:t}
 mtnbranch=${${(M)${(f)"$( ${vcs_comm[cmd]} status )"}:#(#s)Current branch:*}/*: /}
-VCS_INFO_formats '' "${mtnbranch}" "${mtnbase}"
+VCS_INFO_formats '' "${mtnbranch}" "${mtnbase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_p4 b/Functions/VCS_Info/Backends/VCS_INFO_get_data_p4
index dccd9d3..ac87faf 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_p4
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_p4
@@ -21,4 +21,4 @@ p4branch="%b:%r"
 zformat -f p4branch "${p4branch}" "b:${p4info[Client_name]}" \
 "r:$change"
 
-VCS_INFO_formats '' "${p4branch}" "${p4base}"
+VCS_INFO_formats '' "${p4branch}" "${p4base}" '' ''
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_svk b/Functions/VCS_Info/Backends/VCS_INFO_get_data_svk
index fa9548c..48e5edb 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_svk
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_svk
@@ -9,5 +9,5 @@ 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]}"
-VCS_INFO_formats '' "${svkbranch}" "${svkbase}"
+VCS_INFO_formats '' "${svkbranch}" "${svkbase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_svn b/Functions/VCS_Info/Backends/VCS_INFO_get_data_svn
index 57ff5d8..e180805 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_svn
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_svn
@@ -24,5 +24,5 @@ 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]}"
-VCS_INFO_formats '' "${svnbranch}" "${svnbase}"
+VCS_INFO_formats '' "${svnbranch}" "${svnbase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_tla b/Functions/VCS_Info/Backends/VCS_INFO_get_data_tla
index cbc48c0..69a82eb 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_tla
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_tla
@@ -9,5 +9,5 @@ tlabase="$(VCS_INFO_realpath ${vcs_comm[basedir]})"
 rrn=${tlabase:t}
 # tree-id gives us something like 'foo@xxxxxxxxxxx/demo--1.0--patch-4', so:
 tlabranch=${${"$( ${vcs_comm[cmd]} tree-id )"}/*\//}
-VCS_INFO_formats '' "${tlabranch}" "${tlabase}"
+VCS_INFO_formats '' "${tlabranch}" "${tlabase}" '' ''
 return 0
diff --git a/Functions/VCS_Info/VCS_INFO_formats b/Functions/VCS_Info/VCS_INFO_formats
index 3468335..72030cc 100644
--- a/Functions/VCS_Info/VCS_INFO_formats
+++ b/Functions/VCS_Info/VCS_INFO_formats
@@ -3,7 +3,7 @@
 ## Distributed under the same BSD-ish license as zsh itself.
 
 setopt localoptions noksharrays NO_shwordsplit
-local action=$1 branch=$2 base=$3
+local action=$1 branch=$2 base=$3 staged=$4 unstaged=$5
 local msg
 local -i i j
 
@@ -15,9 +15,27 @@ 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'
+fi
+
+if [[ -n ${unstaged} ]] ; then
+    zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" unstagedstr unstaged
+    [[ -z ${unstaged} ]] && unstaged='U'
+fi
+
 (( ${#msgs} > maxexports )) && msgs[$(( maxexports + 1 )),-1]=()
 for i in {1..${#msgs}} ; do
-    zformat -f msg ${msgs[$i]} a:${action} b:${branch} s:${vcs} r:${base:t} R:${base} S:"$(VCS_INFO_reposub ${base})"
+    zformat -f msg ${msgs[$i]}                      \
+                    a:${action}                     \
+                    b:${branch}                     \
+                    c:${staged}                     \
+                    r:${base:t}                     \
+                    s:${vcs}                        \
+                    u:${unstaged}                   \
+                    R:${base}                       \
+                    S:"$(VCS_INFO_reposub ${base})"
     msgs[$i]=${msg}
 done
 return 0
-- 
1.6.1.2.350.g88cc



Messages sorted by: Reverse Date, Date, Thread, Author