]> git.pld-linux.org Git - packages/rpm-build-tools.git/blame - bash-prompt.sh
bash-prompt: skip comparing with remote if upstream not defined for branch
[packages/rpm-build-tools.git] / bash-prompt.sh
CommitLineData
9d0d2184 1# NOTE:
893f1bfe 2# This code is known to work with bash
9d0d2184 3
5b76c9e3 4# the code below requires bash 4.x, skip if earlier
1a003a0e 5test ${BASH_VERSION%%.*} -lt 4 && return 1
5b76c9e3 6
9d0d2184
ER
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
893f1bfe 12# - shows current branch
9d0d2184
ER
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
893f1bfe 46 git rev-parse --git-dir &> /dev/null || return
9d0d2184 47
9d0d2184
ER
48 local state remote branch
49
893f1bfe
ER
50 # without branch, nothing is shown; don't bother further
51 branch=$(git symbolic-ref --short HEAD 2>/dev/null) || return
9d0d2184 52
893f1bfe 53 if [ -n "$(git status -s 2> /dev/null)" ]; then
bcc4434f 54 state="${RED}★"
9d0d2184
ER
55 fi
56
893f1bfe 57 # http://stackoverflow.com/a/3278427
de250aba
ER
58 remote=$(git rev-parse '@{u}' 2>/dev/null)
59 if [[ -n "$remote" ]]; then
60 local=$(git rev-parse @)
61 base=$(git merge-base @ '@{u}')
9d0d2184 62
de250aba
ER
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
9d0d2184
ER
72 fi
73
893f1bfe 74 echo " (${branch})${remote}${state}"
9d0d2184
ER
75}
76
77# cache requires bash 4.x
8eb455ec 78declare -A __package_update_rpmversion_cache=()
9d0d2184
ER
79__package_update_rpmversion() {
80 # extract vars from cache
81 set -- ${__package_update_rpmversion_cache[$PWD]}
82 local specfile=$1 version=$2 mtime=$3
83
84 # invalidate cache
85 if [ -f "$specfile" ]; then
86 local stat
87 stat=$(stat -c %Y $specfile)
88 if [ $mtime ] && [ $stat -gt $mtime ]; then
89 unset version
90 fi
91 mtime=$stat
92 else
93 # reset cache, .spec may be renamed
94 unset version specfile
95 fi
96
97 # we have cached version
98 test -n "$version" && return
99
100 # needs to be one file
101 specfile=${specfile:-$(\ls *.spec 2>/dev/null)}
102 if [ ! -f "$specfile" ]; then
103 unset __package_update_rpmversion_cache[$PWD]
104 return
105 fi
106
107 mtime=${mtime:-$(stat -c %Y $specfile)}
108
109 # give only first version (ignore subpackages)
110 version=$(rpm --define "_specdir $PWD" --specfile $specfile -q --qf '%{VERSION}\n' | head -n1)
e4fc5755 111 __package_update_rpmversion_cache[$PWD]="$specfile ${version:-ERR} $mtime"
9d0d2184
ER
112}
113
114__package_rpmversion() {
115 # extract vars from cache
116 set -- ${__package_update_rpmversion_cache[$PWD]}
117 # print version
118 echo $2
119}
This page took 0.114864 seconds and 4 git commands to generate.