svn-fast-info.plugin.zsh 2.45 KB
Newer Older
LFDM's avatar
LFDM committed
1
# vim:ft=zsh ts=2 sw=2 sts=2 et
Brice Dutheil's avatar
Brice Dutheil committed
2
3
4
5
6
7
8
9
10
11
#
# Faster alternative to the current SVN plugin implementation.
#
# Works with svn 1.6, 1.7, 1.8.
# Use `svn_prompt_info` method to enquire the svn data.
# It's faster because his efficient use of svn (single svn call) done in the `parse_svn` function
# Also changed prompt suffix *after* the svn dirty marker
#
# *** IMPORTANT *** DO NO USE with the simple svn plugin, this plugin acts as a replacement of it.

12
function svn_prompt_info() {
LFDM's avatar
LFDM committed
13
14
15
  local info
  info=$(svn info 2>&1) || return 1; # capture stdout and stderr
  local repo_need_upgrade=$(svn_repo_need_upgrade $info)
Brice Dutheil's avatar
Brice Dutheil committed
16

LFDM's avatar
LFDM committed
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  if [ -n $repo_need_upgrade ]; then
    printf '%s%s%s%s%s%s%s\n' \
      $ZSH_PROMPT_BASE_COLOR \
      $ZSH_THEME_SVN_PROMPT_PREFIX \
      $ZSH_PROMPT_BASE_COLOR \
      $repo_need_upgrade \
      $ZSH_PROMPT_BASE_COLOR \
      $ZSH_THEME_SVN_PROMPT_SUFFIX \
      $ZSH_PROMPT_BASE_COLOR \
  else
    # something left for you to fix -
    # repo name and rev aren't used here, did you forget them?
    # especially since you set a repo name color
    # if the prompt is alright this way, leave it as is and just
    # delete the comment. The functions itself could stay imo,
    # gives others the chance to use them.
    printf '%s%s%s%s%s%s%s%s%s\n' \
      $ZSH_PROMPT_BASE_COLOR \
      $ZSH_THEME_SVN_PROMPT_PREFIX \
      $ZSH_THEME_REPO_NAME_COLOR \
      $(svn_get_branch_name $info)
      ${svn_branch_name}\
      $ZSH_PROMPT_BASE_COLOR
      $(svn_dirty_choose $info)
      $ZSH_PROMPT_BASE_COLOR
      $ZSH_THEME_SVN_PROMPT_SUFFIX\
      $ZSH_PROMPT_BASE_COLOR
  fi
Brice Dutheil's avatar
Brice Dutheil committed
45
46
47
}

function svn_repo_need_upgrade() {
LFDM's avatar
LFDM committed
48
49
  grep -q "E155036" <<< ${1:-$(svn info 2> /dev/null)} && \
    echo "E155036: upgrade repo with svn upgrade"
Brice Dutheil's avatar
Brice Dutheil committed
50
51
52
}

function svn_get_branch_name() {
LFDM's avatar
LFDM committed
53
54
55
  echo ${1:-$(svn info 2> /dev/null)} |\
    grep '^URL:' | egrep -o '(tags|branches)/[^/]+|trunk' |\
    egrep -o '[^/]+$'
Brice Dutheil's avatar
Brice Dutheil committed
56
57
58
}

function svn_get_repo_name() {
LFDM's avatar
LFDM committed
59
60
61
62
63
64
  # I think this can be further cleaned up as well, not sure how,
  # as I can't test it
  local svn_root
  local info=${1:-$(svn info 2> /dev/null)}
  echo $info | sed 's/Repository\ Root:\ .*\///p' | read svn_root
  echo $info | sed "s/URL:\ .*$svn_root\///p"
Brice Dutheil's avatar
Brice Dutheil committed
65
66
67
}

function svn_get_revision() {
LFDM's avatar
LFDM committed
68
69
  # does this work as it should?
  echo ${1:-$(svn info 2> /dev/null)} | sed 's/Revision: //p'
Brice Dutheil's avatar
Brice Dutheil committed
70
71
72
}

function svn_dirty_choose() {
LFDM's avatar
LFDM committed
73
74
75
76
77
  if svn status | grep -E '^\s*[ACDIM!?L]' &> /dev/null; then
    echo $ZSH_THEME_SVN_PROMPT_DIRTY
  else
    echo $ZSH_THEME_SVN_PROMPT_CLEAN
  fi
Brice Dutheil's avatar
Brice Dutheil committed
78
}