-
Notifications
You must be signed in to change notification settings - Fork 86
/
.bash-powerline.sh
160 lines (139 loc) · 6.21 KB
/
.bash-powerline.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/usr/bin/env bash
__powerline() {
# Unicode symbols
readonly PS_SYMBOL_DARWIN=''
readonly PS_SYMBOL_LINUX='$'
readonly PS_SYMBOL_OTHER='%'
readonly GIT_BRANCH_SYMBOL='⑂ '
readonly GIT_BRANCH_CHANGED_SYMBOL='+'
readonly GIT_NEED_PUSH_SYMBOL='⇡'
readonly GIT_NEED_PULL_SYMBOL='⇣'
# Solarized colorscheme
if [[ $(tput colors) -ge 256 ]] 2>/dev/null; then
readonly FG_BASE03="\[$(tput setaf 234)\]"
readonly FG_BASE02="\[$(tput setaf 235)\]"
readonly FG_BASE01="\[$(tput setaf 240)\]"
readonly FG_BASE00="\[$(tput setaf 241)\]"
readonly FG_BASE0="\[$(tput setaf 244)\]"
readonly FG_BASE1="\[$(tput setaf 245)\]"
readonly FG_BASE2="\[$(tput setaf 254)\]"
readonly FG_BASE3="\[$(tput setaf 230)\]"
readonly BG_BASE03="\[$(tput setab 234)\]"
readonly BG_BASE02="\[$(tput setab 235)\]"
readonly BG_BASE01="\[$(tput setab 240)\]"
readonly BG_BASE00="\[$(tput setab 241)\]"
readonly BG_BASE0="\[$(tput setab 244)\]"
readonly BG_BASE1="\[$(tput setab 245)\]"
readonly BG_BASE2="\[$(tput setab 254)\]"
readonly BG_BASE3="\[$(tput setab 230)\]"
readonly FG_YELLOW="\[$(tput setaf 136)\]"
readonly FG_ORANGE="\[$(tput setaf 166)\]"
readonly FG_RED="\[$(tput setaf 160)\]"
readonly FG_MAGENTA="\[$(tput setaf 125)\]"
readonly FG_VIOLET="\[$(tput setaf 61)\]"
readonly FG_BLUE="\[$(tput setaf 33)\]"
readonly FG_CYAN="\[$(tput setaf 37)\]"
readonly FG_GREEN="\[$(tput setaf 64)\]"
readonly BG_YELLOW="\[$(tput setab 136)\]"
readonly BG_ORANGE="\[$(tput setab 166)\]"
readonly BG_RED="\[$(tput setab 160)\]"
readonly BG_MAGENTA="\[$(tput setab 125)\]"
readonly BG_VIOLET="\[$(tput setab 61)\]"
readonly BG_BLUE="\[$(tput setab 33)\]"
readonly BG_CYAN="\[$(tput setab 37)\]"
readonly BG_GREEN="\[$(tput setab 64)\]"
else
readonly FG_BASE03="\[$(tput setaf 8)\]"
readonly FG_BASE02="\[$(tput setaf 0)\]"
readonly FG_BASE01="\[$(tput setaf 10)\]"
readonly FG_BASE00="\[$(tput setaf 11)\]"
readonly FG_BASE0="\[$(tput setaf 12)\]"
readonly FG_BASE1="\[$(tput setaf 14)\]"
readonly FG_BASE2="\[$(tput setaf 7)\]"
readonly FG_BASE3="\[$(tput setaf 15)\]"
readonly BG_BASE03="\[$(tput setab 8)\]"
readonly BG_BASE02="\[$(tput setab 0)\]"
readonly BG_BASE01="\[$(tput setab 10)\]"
readonly BG_BASE00="\[$(tput setab 11)\]"
readonly BG_BASE0="\[$(tput setab 12)\]"
readonly BG_BASE1="\[$(tput setab 14)\]"
readonly BG_BASE2="\[$(tput setab 7)\]"
readonly BG_BASE3="\[$(tput setab 15)\]"
readonly FG_YELLOW="\[$(tput setaf 3)\]"
readonly FG_ORANGE="\[$(tput setaf 9)\]"
readonly FG_RED="\[$(tput setaf 1)\]"
readonly FG_MAGENTA="\[$(tput setaf 5)\]"
readonly FG_VIOLET="\[$(tput setaf 13)\]"
readonly FG_BLUE="\[$(tput setaf 4)\]"
readonly FG_CYAN="\[$(tput setaf 6)\]"
readonly FG_GREEN="\[$(tput setaf 2)\]"
readonly BG_YELLOW="\[$(tput setab 3)\]"
readonly BG_ORANGE="\[$(tput setab 9)\]"
readonly BG_RED="\[$(tput setab 1)\]"
readonly BG_MAGENTA="\[$(tput setab 5)\]"
readonly BG_VIOLET="\[$(tput setab 13)\]"
readonly BG_BLUE="\[$(tput setab 4)\]"
readonly BG_CYAN="\[$(tput setab 6)\]"
readonly BG_GREEN="\[$(tput setab 2)\]"
fi
readonly DIM="\[$(tput dim)\]"
readonly REVERSE="\[$(tput rev)\]"
readonly RESET="\[$(tput sgr0)\]"
readonly BOLD="\[$(tput bold)\]"
if [[ -z "$PS_SYMBOL" ]]; then
case "$(uname)" in
Darwin)
PS_SYMBOL=$PS_SYMBOL_DARWIN
;;
Linux)
PS_SYMBOL=$PS_SYMBOL_LINUX
;;
*)
PS_SYMBOL=$PS_SYMBOL_OTHER
esac
fi
__git_info() {
[ -x "$(which git)" ] || return # git not found
local git_eng="env LANG=C git" # force git output in English to make our work easier
# get current branch name or short SHA1 hash for detached head
local branch="$($git_eng symbolic-ref --short HEAD 2>/dev/null || $git_eng describe --tags --always 2>/dev/null)"
[ -n "$branch" ] || return # git branch not found
local marks
# branch is modified?
[ -n "$($git_eng status --porcelain)" ] && marks+=" $GIT_BRANCH_CHANGED_SYMBOL"
# how many commits local branch is ahead/behind of remote?
local stat="$($git_eng status --porcelain --branch | grep '^##' | grep -o '\[.\+\]$')"
local aheadN="$(echo $stat | grep -o 'ahead [[:digit:]]\+' | grep -o '[[:digit:]]\+')"
local behindN="$(echo $stat | grep -o 'behind [[:digit:]]\+' | grep -o '[[:digit:]]\+')"
[ -n "$aheadN" ] && marks+=" $GIT_NEED_PUSH_SYMBOL$aheadN"
[ -n "$behindN" ] && marks+=" $GIT_NEED_PULL_SYMBOL$behindN"
# print the git branch segment without a trailing newline
printf " $GIT_BRANCH_SYMBOL$branch$marks "
}
ps1() {
# Check the exit code of the previous command and display different
# colors in the prompt accordingly.
if [ $? -eq 0 ]; then
local BG_EXIT="$BG_GREEN"
else
local BG_EXIT="$BG_RED"
fi
PS1="$BG_BASE1$FG_BASE3 \w $RESET"
# Bash by default expands the content of PS1 unless promptvars is disabled.
# We must use another layer of reference to prevent expanding any user
# provided strings, which would cause security issues.
# POC: https://github.com/njhartwell/pw3nage
# Related fix in git-bash: https://github.com/git/git/blob/9d77b0405ce6b471cb5ce3a904368fc25e55643d/contrib/completion/git-prompt.sh#L324
if shopt -q promptvars; then
__powerline_git_info="$(__git_info)"
PS1+="$BG_BLUE$FG_BASE3\${__powerline_git_info}$RESET"
else
# promptvars is disabled. Avoid creating unnecessary env var.
PS1+="$BG_BLUE$FG_BASE3$(__git_info)$RESET"
fi
PS1+="$BG_EXIT$FG_BASE3 $PS_SYMBOL $RESET "
}
PROMPT_COMMAND=ps1
}
__powerline
unset __powerline