]>
Commit | Line | Data |
---|---|---|
1 | # NOTE: | |
2 | # This code is known to work with bash | |
3 | ||
4 | # the code below requires bash 4.x, skip if earlier | |
5 | test ${BASH_VERSION%%.*} -lt 4 && return 1 | |
6 | ||
7 | # To use it, source this file and set $PROMPT_COMMAND env var: | |
8 | # PROMPT_COMMAND=__bash_prompt_command | |
9 | ||
10 | # | |
11 | # A colorized bash prompt | |
12 | # - shows current branch | |
13 | # - shows if branch is up to date/ahead/behind | |
14 | # - shows if last command exited with error (red) | |
15 | # | |
16 | __bash_prompt_command() { | |
17 | local previous_return_value=$? | |
18 | ||
19 | local RED="\[\033[0;31m\]" | |
20 | local YELLOW="\[\033[0;33m\]" | |
21 | local GREEN="\[\033[0;32m\]" | |
22 | local BLUE="\[\033[0;34m\]" | |
23 | local LIGHT_RED="\[\033[1;31m\]" | |
24 | local LIGHT_GREEN="\[\033[1;32m\]" | |
25 | local WHITE="\[\033[1;37m\]" | |
26 | local LIGHT_GRAY="\[\033[0;37m\]" | |
27 | local COLOR_NONE="\[\e[0m\]" | |
28 | ||
29 | # if we are in rpm subdir and have exactly one .spec in the dir, include package version | |
30 | __package_update_rpmversion | |
31 | local rpmver=$(__package_rpmversion) | |
32 | ||
33 | local prompt="${BLUE}[${RED}\w${GREEN}${rpmver:+($rpmver)}$(__bash_parse_git_branch)${BLUE}]${COLOR_NONE} " | |
34 | if [ $previous_return_value -eq 0 ]; then | |
35 | PS1="${prompt}➔ " | |
36 | else | |
37 | PS1="${prompt}${RED}➔${COLOR_NONE} " | |
38 | fi | |
39 | } | |
40 | ||
41 | # helper for __bash_prompt_command | |
42 | # command line (git) coloring | |
43 | # note we use "\" here to avoid any "git" previous alias/func | |
44 | __bash_parse_git_branch() { | |
45 | # not in git dir. return early | |
46 | git rev-parse --git-dir &> /dev/null || return | |
47 | ||
48 | local state remote branch base local | |
49 | ||
50 | # without branch, nothing is shown; don't bother further | |
51 | branch=$(git symbolic-ref --short HEAD 2>/dev/null) || return | |
52 | ||
53 | if [ -n "$(git status -s 2> /dev/null)" ]; then | |
54 | state="${RED}★" | |
55 | fi | |
56 | ||
57 | # http://stackoverflow.com/a/3278427 | |
58 | remote=$(git rev-parse '@{u}' 2>/dev/null) | |
59 | base=$(git merge-base @ '@{u}' 2>/dev/null) | |
60 | if [[ -n "$remote" && -n "$base" ]]; then | |
61 | local=$(git rev-parse @) | |
62 | ||
63 | if [[ $local = $remote ]]; then | |
64 | remote="" | |
65 | elif [[ $local = $base ]]; then | |
66 | remote="${YELLOW}↓" | |
67 | elif [[ $remote = $base ]]; then | |
68 | remote="${YELLOW}↑" | |
69 | else | |
70 | remote="${YELLOW}↕" | |
71 | fi | |
72 | else | |
73 | remote="" | |
74 | fi | |
75 | ||
76 | echo " (${branch})${remote}${state}" | |
77 | } | |
78 | ||
79 | # cache requires bash 4.x | |
80 | declare -A __package_update_rpmversion_cache=() | |
81 | __package_update_rpmversion() { | |
82 | # extract vars from cache | |
83 | set -- ${__package_update_rpmversion_cache[$PWD]} | |
84 | local specfile=$1 version=$2 mtime=$3 | |
85 | ||
86 | # invalidate cache | |
87 | if [ -f "$specfile" ]; then | |
88 | local stat | |
89 | stat=$(stat -c %Y $specfile) | |
90 | if [ $mtime ] && [ $stat -gt $mtime ]; then | |
91 | unset version | |
92 | fi | |
93 | mtime=$stat | |
94 | else | |
95 | # reset cache, .spec may be renamed | |
96 | unset version specfile | |
97 | fi | |
98 | ||
99 | # we have cached version | |
100 | test -n "$version" && return | |
101 | ||
102 | # needs to be one file | |
103 | specfile=${specfile:-$(\ls *.spec 2>/dev/null)} | |
104 | if [ ! -f "$specfile" ]; then | |
105 | unset __package_update_rpmversion_cache[$PWD] | |
106 | return | |
107 | fi | |
108 | ||
109 | mtime=${mtime:-$(stat -c %Y $specfile)} | |
110 | ||
111 | # give only first version (ignore subpackages) | |
112 | version=$(rpm --define "_specdir $PWD" --specfile $specfile -q --qf '%{VERSION}\n' | head -n1) | |
113 | __package_update_rpmversion_cache[$PWD]="$specfile ${version:-ERR} $mtime" | |
114 | } | |
115 | ||
116 | __package_rpmversion() { | |
117 | # extract vars from cache | |
118 | set -- ${__package_update_rpmversion_cache[$PWD]} | |
119 | # print version | |
120 | echo $2 | |
121 | } |