[PATCH 2/2] git-prompt.zsh: introduce thin ZSH wrapper

2013-05-11 Thread Ramkumar Ramachandra
To facilitate a colored prompt in ZSH, write a thin wrapper around
git-prompt.sh, factoring out and overriding the coloring logic.  Since
ZSH lacks a PROMPT_COMMAND, instruct the user to execute __git_ps1
inside precmd().

Signed-off-by: Ramkumar Ramachandra artag...@gmail.com
---
 contrib/completion/git-prompt.sh  | 73 +--
 contrib/completion/git-prompt.zsh | 59 +++
 2 files changed, 99 insertions(+), 33 deletions(-)
 create mode 100644 contrib/completion/git-prompt.zsh

diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 08c9b22..0bc51ad 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -222,6 +222,45 @@ __git_ps1_show_upstream ()
 
 }
 
+# Helper function that is meant to be called from __git_ps1.  It
+# builds up a gitstring injecting color codes into the appropriate
+# places.
+__git_ps1_colorize_gitstring ()
+{
+   local c_red='\e[31m'
+   local c_green='\e[32m'
+   local c_lblue='\e[1;34m'
+   local c_clear='\e[0m'
+   local bad_color=$c_red
+   local ok_color=$c_green
+   local branch_color=$c_clear
+   local flags_color=$c_lblue
+   local branchstring=$c${b##refs/heads/}
+
+   if [ $detached = no ]; then
+   branch_color=$ok_color
+   else
+   branch_color=$bad_color
+   fi
+
+   # Setting gitstring directly with \[ and \] around colors
+   # is necessary to prevent wrapping issues!
+   gitstring=\[$branch_color\]$branchstring\[$c_clear\]
+
+   if [ $w = * ]; then
+   gitstring=$gitstring\[$bad_color\]$w
+   fi
+   if [ -n $i ]; then
+   gitstring=$gitstring\[$ok_color\]$i
+   fi
+   if [ -n $s ]; then
+   gitstring=$gitstring\[$flags_color\]$s
+   fi
+   if [ -n $u ]; then
+   gitstring=$gitstring\[$bad_color\]$u
+   fi
+   gitstring=$gitstring\[$c_clear\]$r$p
+}
 
 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
 # when called from PS1 using command substitution
@@ -363,39 +402,7 @@ __git_ps1 ()
if [ $pcmode = yes ]; then
local gitstring=
if [ -n ${GIT_PS1_SHOWCOLORHINTS-} ]; then
-   local c_red='\e[31m'
-   local c_green='\e[32m'
-   local c_lblue='\e[1;34m'
-   local c_clear='\e[0m'
-   local bad_color=$c_red
-   local ok_color=$c_green
-   local branch_color=$c_clear
-   local flags_color=$c_lblue
-   local branchstring=$c${b##refs/heads/}
-
-   if [ $detached = no ]; then
-   branch_color=$ok_color
-   else
-   branch_color=$bad_color
-   fi
-
-   # Setting gitstring directly with \[ and \] 
around colors
-   # is necessary to prevent wrapping issues!
-   
gitstring=\[$branch_color\]$branchstring\[$c_clear\]
-
-   if [ $w = * ]; then
-   gitstring=$gitstring\[$bad_color\]$w
-   fi
-   if [ -n $i ]; then
-   gitstring=$gitstring\[$ok_color\]$i
-   fi
-   if [ -n $s ]; then
-   gitstring=$gitstring\[$flags_color\]$s
-   fi
-   if [ -n $u ]; then
-   gitstring=$gitstring\[$bad_color\]$u
-   fi
-   gitstring=$gitstring\[$c_clear\]$r$p
+   __git_ps1_colorize_gitstring
else
gitstring=$c${b##refs/heads/}${f:+$f}$r$p
fi
diff --git a/contrib/completion/git-prompt.zsh 
b/contrib/completion/git-prompt.zsh
new file mode 100644
index 000..dc164dd
--- /dev/null
+++ b/contrib/completion/git-prompt.zsh
@@ -0,0 +1,59 @@
+# git prompt support for zsh: wrapper around git-prompt.sh
+#
+# To enable:
+#
+#1) Copy this file and git-prompt.sh to ~/.zsh/prompt
+#2) Add the following lines to your .zshrc:
+#
+#  source ~/.zsh/prompt/git-prompt.zsh
+#  GIT_PS1_SHOWCOLORHINTS=true
+#  precmd () { __git_ps1 %n| :%~$  %s }
+#
+#3) You can now add the following to ~/.zshrc and expect the
+#   characters to be displayed in color:
+#
+#  GIT_PS1_DESCRIBE_STYLE=branch
+#  GIT_PS1_SHOWUPSTREAM=auto
+#  

Re: [PATCH 2/2] git-prompt.zsh: introduce thin ZSH wrapper

2013-05-11 Thread Felipe Contreras
On Sat, May 11, 2013 at 11:25 AM, Ramkumar Ramachandra
artag...@gmail.com wrote:
 To facilitate a colored prompt in ZSH, write a thin wrapper around
 git-prompt.sh, factoring out and overriding the coloring logic.  Since
 ZSH lacks a PROMPT_COMMAND, instruct the user to execute __git_ps1
 inside precmd().

I think this is two logical changes into one.

 --- /dev/null
 +++ b/contrib/completion/git-prompt.zsh
 @@ -0,0 +1,59 @@
 +# git prompt support for zsh: wrapper around git-prompt.sh
 +#
 +# To enable:
 +#
 +#1) Copy this file and git-prompt.sh to ~/.zsh/prompt
 +#2) Add the following lines to your .zshrc:
 +#
 +#  source ~/.zsh/prompt/git-prompt.zsh
 +#  GIT_PS1_SHOWCOLORHINTS=true
 +#  precmd () { __git_ps1 %n| :%~$  %s }
 +#
 +#3) You can now add the following to ~/.zshrc and expect the
 +#   characters to be displayed in color:
 +#
 +#  GIT_PS1_DESCRIBE_STYLE=branch
 +#  GIT_PS1_SHOWUPSTREAM=auto
 +#  GIT_PS1_SHOWDIRTYSTATE=true
 +#  GIT_PS1_SHOWUNTRACKEDFILES=true
 +
 +test -z $script  script=$(dirname 
 ${funcsourcetrace[1]%:*})/git-prompt.sh
 +ZSH_VERSION='' . $script

I've been thinking that this method of loading the script is not the
best; we should probably have a list of locations where distributions
usually put this file. So if we could avoid the creation of of a new
file, that would be great.

 +autoload colors
 +colors
 +
 +__git_ps1_colorize_gitstring ()
 +{
 +   local c_red='%F{red}'
 +   local c_green='%F{green}'
 +   local c_lblue='%F{blue}'
 +   local c_clear='%f'
 +   local bad_color=$c_red
 +   local ok_color=$c_green
 +   local branch_color=$c_clear
 +   local flags_color=$c_lblue
 +   local branchstring=$c${b##refs/heads/}

This is the only real difference with bash colors, no? I think it's
overkill to create a new file, and load the old one, only to override
part of a function. We should probably start with everything in the
same file, and only later if we find it's necessary, split.

 +   if [ $detached = no ]; then
 +   branch_color=$ok_color
 +   else
 +   branch_color=$bad_color
 +   fi
 +
 +   gitstring=$branch_color$branchstring$c_clear
 +
 +   if [ $w = * ]; then
 +   gitstring=$gitstring$bad_color$w
 +   fi
 +   if [ -n $i ]; then
 +   gitstring=$gitstring$ok_color$i
 +   fi
 +   if [ -n $s ]; then
 +   gitstring=$gitstring$flags_color$s
 +   fi
 +   if [ -n $u ]; then
 +   gitstring=$gitstring$bad_color$u
 +   fi
 +   gitstring=$gitstring$c_clear$r$p
 +}
 --

-- 
Felipe Contreras
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html