svn.plugin.zsh
2279 bytes
1svn_prompt_info() {
2 local info display
3 info="$(LANG= svn info 2>/dev/null)" || return 1
4
5 if [[ "$SVN_SHOW_BRANCH" = true ]]; then
6 display="$(svn_get_branch_name "$info")"
7 else
8 display="$(svn_get_repo_name "$info")"
9 fi
10
11 printf '%s%s%s%s%s%s%s%s%s%s' \
12 "$ZSH_PROMPT_BASE_COLOR" \
13 "$ZSH_THEME_SVN_PROMPT_PREFIX" \
14 "$ZSH_THEME_REPO_NAME_COLOR" \
15 "${display:gs/%/%%}" \
16 "$ZSH_PROMPT_BASE_COLOR" \
17 "$ZSH_THEME_SVN_PROMPT_SUFFIX" \
18 "$ZSH_PROMPT_BASE_COLOR" \
19 "$(svn_dirty $info)" \
20 "$(svn_dirty_pwd)" \
21 "$ZSH_PROMPT_BASE_COLOR"
22}
23
24in_svn() {
25 svn info &>/dev/null
26}
27
28svn_get_repo_name() {
29 local info name
30 info="${1:-$(LANG= svn info 2>/dev/null)}"
31 name="$(sed -n 's/^Repository\ Root:\ .*\///p' <<< "$info")"
32 omz_urldecode "$name"
33}
34
35svn_get_branch_name() {
36 local info branch
37 info="${1:-$(LANG= svn info 2>/dev/null)}"
38 branch=$(
39 awk -F/ '/^URL:/ {
40 for (i=0; i<=NF; i++) {
41 if ($i == "branches" || $i == "tags" ) {
42 print $(i+1)
43 break
44 };
45 if ($i == "trunk") {
46 print $i
47 break
48 }
49 }
50 }' <<< "$info"
51 )
52 branch="$(omz_urldecode "$branch")"
53
54 echo "${branch:-$(svn_get_repo_name "$info")}"
55}
56
57svn_get_rev_nr() {
58 sed -n 's/Revision:\ //p' <<<"${1:-$(LANG= svn info 2>/dev/null)}"
59}
60
61svn_dirty() {
62 svn_dirty_choose "${1:-$(LANG= svn info 2>/dev/null)}" $ZSH_THEME_SVN_PROMPT_DIRTY $ZSH_THEME_SVN_PROMPT_CLEAN
63}
64
65svn_dirty_choose() {
66 local root
67 root=$(sed -n 's/^Working Copy Root Path: //p' <<< "${1:-$(LANG= svn info 2>/dev/null)}")
68 if LANG= svn status "$root" 2>/dev/null | command grep -Eq '^\s*[ACDIM!?L]'; then
69 # Grep exits with 0 when "One or more lines were selected", return "dirty".
70 echo $2
71 else
72 # Otherwise, no lines were found, or an error occurred. Return clean.
73 echo $3
74 fi
75}
76
77svn_dirty_pwd () {
78 svn_dirty_choose_pwd $ZSH_THEME_SVN_PROMPT_DIRTY_PWD $ZSH_THEME_SVN_PROMPT_CLEAN_PWD
79}
80
81svn_dirty_choose_pwd () {
82 if LANG= svn status "$PWD" 2>/dev/null | command grep -Eq '^\s*[ACDIM!?L]'; then
83 # Grep exits with 0 when "One or more lines were selected", return "dirty".
84 echo $1
85 else
86 # Otherwise, no lines were found, or an error occurred. Return clean.
87 echo $2
88 fi
89}