]> git.madduck.net Git - etc/zsh.git/blob - .zsh/zshrc/85_git_prompt

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

do the git prompt thing proper
[etc/zsh.git] / .zsh / zshrc / 85_git_prompt
1 # zshrc/85_git_prompt
2 #
3 # Make git information available to the prompt
4 #
5 # Copyright © 1994–2008 martin f. krafft <madduck@madduck.net>
6 # Released under the terms of the Artistic Licence 2.0
7 #
8 # Source repository: http://git.madduck.net/v/etc/zsh.git
9 #
10 # Shamelessly based on http://glandium.org/blog/?p=170
11 #
12
13 __git_get_repo_root()
14 {
15   local relroot
16   relroot="$(git rev-parse --show-cdup 2>/dev/null)" || return 1
17   if [ -n "$relroot" ]; then
18     readlink -f "$relroot"
19   else
20     echo $PWD
21   fi
22 }
23
24 __git_get_branch()
25 {
26   local ref
27   ref=$(git symbolic-ref -q HEAD 2>/dev/null \
28      || git-name-rev --name-only HEAD 2>/dev/null)
29   echo "${ref#refs/heads/}"
30 }
31
32 __get_root_offsets()
33 {
34   local pwda reporoot loc
35   pwda=(${(s:/:)PWD})
36   reporoot=(${(s:/:)1})
37   echo $((1 - $#reporoot)) $(($#pwda - $#reporoot))
38 }
39
40 __get_prompt_path_components()
41 {
42   local reporoot
43   reporoot="$1"
44
45   set -- $(__get_root_offsets "$reporoot")
46   if [ "$2" -le 0 ]; then
47     echo %~
48   else
49     echo "%${1}~" "%${2}~"
50   fi
51 }
52
53 __vcs_get_repo_type()
54 {
55   if __git_get_repo_root >/dev/null; then
56     echo git
57   else
58     echo NONE
59   fi
60 }
61
62 __vcs_set_prompt_variables()
63 {
64   local pre branch post
65   local MAXLEN=25
66
67   case "${1:-$(__vcs_get_repo_type)}" in
68     git)
69       local reporoot="$(__git_get_repo_root)"
70       set -- $(__get_prompt_path_components "$reporoot")
71       branch="$(__git_get_branch)"
72       post="${(%)2}"
73       local prelen="$((MAXLEN - $#post - $#branch))"
74       [ $prelen -lt 10 ] && prelen=10
75       pre="%${prelen}<..<${1}%<<"
76       pre="${(%)pre}"
77       ;;
78     *)
79       local p="%${MAXLEN}<..<%~%<<"
80       #TODO find a better way so we don't have to nuke $psvar, but since the
81       #     %(nv.true.false) check for prompts checks element count, not
82       #     content, that's all we get for now
83       psvar=("${(%)p}")
84       return
85   esac
86
87   psvar[1]="$pre"
88   psvar[2]="$branch"
89   psvar[3]="$post"
90 }
91
92 update_git_vars_if_git_ran() {
93   local vcs="$(__vcs_get_repo_type)"
94   case "$(history $(($HISTCMD - 1)))" in
95     # $vcs appeared in last command, so be sure to update
96     *${vcs}*) __vcs_set_prompt_variables
97   esac
98 }
99 precmd_functions+=update_git_vars_if_git_ran
100
101 update_git_vars() {
102   __vcs_set_prompt_variables
103 }
104 chpwd_functions+=update_git_vars
105
106 # call it once
107 update_git_vars
108
109 # vim:ft=zsh