blob: ef2e5b79def1d2c39ad3977b0cdefd31f834a540 [file] [log] [blame]
Eitan Adler3fc60b52012-04-17 00:24:58 -04001#!/usr/bin/env bash
Robert R Evansa4d02422010-10-02 15:07:29 -07002
Travis Swicegood0c2f3092011-02-28 13:46:22 -06003THEME_PROMPT_HOST='\H'
John Schulzd5645e72010-11-09 23:21:19 -05004SCM_THEME_PROMPT_DIRTY=' ✗'
5SCM_THEME_PROMPT_CLEAN=' ✓'
6SCM_THEME_PROMPT_PREFIX=' |'
7SCM_THEME_PROMPT_SUFFIX='|'
Robert R Evansa4d02422010-10-02 15:07:29 -07008
John Schulzb2b629e2011-10-09 14:24:10 -04009SCM_GIT='git'
John Schulzd5645e72010-11-09 23:21:19 -050010SCM_GIT_CHAR='±'
11
John Schulzb2b629e2011-10-09 14:24:10 -040012SCM_HG='hg'
John Schulzd5645e72010-11-09 23:21:19 -050013SCM_HG_CHAR='☿'
14
John Schulzb2b629e2011-10-09 14:24:10 -040015SCM_SVN='svn'
John Schulzd5645e72010-11-09 23:21:19 -050016SCM_SVN_CHAR='⑆'
17
John Schulzb2b629e2011-10-09 14:24:10 -040018SCM_NONE='NONE'
JFSIIIccab4852011-06-18 11:55:22 -040019SCM_NONE_CHAR='○'
John Schulzd5645e72010-11-09 23:21:19 -050020
21RVM_THEME_PROMPT_PREFIX=' |'
22RVM_THEME_PROMPT_SUFFIX='|'
23
Ryan0713fdc2011-06-08 11:32:50 -100024VIRTUALENV_THEME_PROMPT_PREFIX=' |'
25VIRTUALENV_THEME_PROMPT_SUFFIX='|'
26
Victor Castell76fcb582011-11-05 13:08:34 +010027RBENV_THEME_PROMPT_PREFIX=' |'
28RBENV_THEME_PROMPT_SUFFIX='|'
29
Hendrik Mansd356ecb2012-01-24 14:30:01 +010030RBFU_THEME_PROMPT_PREFIX=' |'
31RBFU_THEME_PROMPT_SUFFIX='|'
32
John Schulzd5645e72010-11-09 23:21:19 -050033function scm {
xiaogaozicd7eaaa2012-05-04 22:51:48 +080034 if [[ -f .git/HEAD ]]; then SCM=$SCM_GIT
Christophe Aguettazc06ecc52014-03-15 11:38:25 +010035 elif which git &> /dev/null && [[ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]]; then SCM=$SCM_GIT
John Schulzb2b629e2011-10-09 14:24:10 -040036 elif [[ -d .hg ]]; then SCM=$SCM_HG
Christophe Aguettaz714f0e62014-03-14 16:01:20 +010037 elif which hg &> /dev/null && [[ -n "$(hg root 2> /dev/null)" ]]; then SCM=$SCM_HG
John Schulzb2b629e2011-10-09 14:24:10 -040038 elif [[ -d .svn ]]; then SCM=$SCM_SVN
39 else SCM=$SCM_NONE
Robert R Evans1f923a92010-10-03 09:41:36 -070040 fi
Robert R Evansa4d02422010-10-02 15:07:29 -070041}
42
John Schulzb2b629e2011-10-09 14:24:10 -040043function scm_prompt_char {
John Schulzd5645e72010-11-09 23:21:19 -050044 if [[ -z $SCM ]]; then scm; fi
John Schulzb2b629e2011-10-09 14:24:10 -040045 if [[ $SCM == $SCM_GIT ]]; then SCM_CHAR=$SCM_GIT_CHAR
46 elif [[ $SCM == $SCM_HG ]]; then SCM_CHAR=$SCM_HG_CHAR
47 elif [[ $SCM == $SCM_SVN ]]; then SCM_CHAR=$SCM_SVN_CHAR
48 else SCM_CHAR=$SCM_NONE_CHAR
49 fi
50}
51
52function scm_prompt_vars {
53 scm
54 scm_prompt_char
55 SCM_DIRTY=0
56 SCM_STATE=''
57 [[ $SCM == $SCM_GIT ]] && git_prompt_vars && return
58 [[ $SCM == $SCM_HG ]] && hg_prompt_vars && return
59 [[ $SCM == $SCM_SVN ]] && svn_prompt_vars && return
Robert R Evans698509a2010-10-09 21:46:28 -070060}
61
John Schulzd5645e72010-11-09 23:21:19 -050062function scm_prompt_info {
John Schulzb2b629e2011-10-09 14:24:10 -040063 scm
64 scm_prompt_char
65 SCM_DIRTY=0
66 SCM_STATE=''
67 [[ $SCM == $SCM_GIT ]] && git_prompt_info && return
68 [[ $SCM == $SCM_HG ]] && hg_prompt_info && return
69 [[ $SCM == $SCM_SVN ]] && svn_prompt_info && return
John Schulzd5645e72010-11-09 23:21:19 -050070}
Robert R Evans698509a2010-10-09 21:46:28 -070071
John Schulzb2b629e2011-10-09 14:24:10 -040072function git_prompt_vars {
Eduardo Bellido Bellido38575182013-11-12 23:54:07 +010073 SCM_GIT_AHEAD=''
74 SCM_GIT_BEHIND=''
75 SCM_GIT_STASH=''
hequn4eea1552014-04-02 18:41:28 +080076 if [[ "$(git config --get bash-it.hide-status)" != "1" ]]; then
77 local status="$(git status -bs --porcelain 2> /dev/null)"
78 if [[ -n "$(grep -v ^# <<< "${status}")" ]]; then
79 SCM_DIRTY=1
80 SCM_STATE=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
81 else
82 SCM_DIRTY=0
83 SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
84 fi
John Schulzd5645e72010-11-09 23:21:19 -050085 else
John Schulzb2b629e2011-10-09 14:24:10 -040086 SCM_DIRTY=0
Eduardo Bellido Bellido38575182013-11-12 23:54:07 +010087 SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
John Schulzd5645e72010-11-09 23:21:19 -050088 fi
John Schulzb2b629e2011-10-09 14:24:10 -040089 SCM_PREFIX=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
90 SCM_SUFFIX=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
Travis Swicegood51416052014-04-01 10:41:00 -050091
92 local ref=$(git symbolic-ref -q --short HEAD 2> /dev/null)
93 if [[ -n "$ref" ]]; then
94 SCM_BRANCH=$ref
95 SCM_IS_BRANCH=1
96 SCM_IS_TAG=0
97 else
98 SCM_BRANCH=$(git describe --tags --exact-match 2> /dev/null)
99 SCM_IS_TAG=1
100 SCM_IS_BRANCH=0
101 fi
102 # SCM_BRANCH=$(git symbolic-ref -q --short HEAD || git describe --tags --exact-match 2> /dev/null)
John Schulzb2b629e2011-10-09 14:24:10 -0400103 SCM_CHANGE=$(git rev-parse HEAD 2>/dev/null)
Eduardo Bellido Bellido38575182013-11-12 23:54:07 +0100104 local ahead_re='.+ahead ([0-9]+).+'
105 local behind_re='.+behind ([0-9]+).+'
106 [[ "${status}" =~ ${ahead_re} ]] && SCM_GIT_AHEAD=" ${SCM_GIT_AHEAD_CHAR}${BASH_REMATCH[1]}"
107 [[ "${status}" =~ ${behind_re} ]] && SCM_GIT_BEHIND=" ${SCM_GIT_BEHIND_CHAR}${BASH_REMATCH[1]}"
Christophe Aguettazc06ecc52014-03-15 11:38:25 +0100108 local stash_count="$(git stash list 2> /dev/null | wc -l | tr -d ' ')"
Eduardo Bellido Bellido38575182013-11-12 23:54:07 +0100109 [[ "${stash_count}" -gt 0 ]] && SCM_GIT_STASH=" {${stash_count}}"
John Schulzd5645e72010-11-09 23:21:19 -0500110}
111
John Schulzb2b629e2011-10-09 14:24:10 -0400112function svn_prompt_vars {
John Schulzd5645e72010-11-09 23:21:19 -0500113 if [[ -n $(svn status 2> /dev/null) ]]; then
John Schulzb2b629e2011-10-09 14:24:10 -0400114 SCM_DIRTY=1
115 SCM_STATE=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
John Schulzd5645e72010-11-09 23:21:19 -0500116 else
John Schulzb2b629e2011-10-09 14:24:10 -0400117 SCM_DIRTY=0
118 SCM_STATE=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
John Schulzd5645e72010-11-09 23:21:19 -0500119 fi
John Schulzb2b629e2011-10-09 14:24:10 -0400120 SCM_PREFIX=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
121 SCM_SUFFIX=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
122 SCM_BRANCH=$(svn info 2> /dev/null | awk -F/ '/^URL:/ { for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return
123 SCM_CHANGE=$(svn info 2> /dev/null | sed -ne 's#^Revision: ##p' )
John Schulzd5645e72010-11-09 23:21:19 -0500124}
125
John Schulzb2b629e2011-10-09 14:24:10 -0400126function hg_prompt_vars {
Daniel Leavittbb990312011-06-17 14:38:49 -0700127 if [[ -n $(hg status 2> /dev/null) ]]; then
John Schulzb2b629e2011-10-09 14:24:10 -0400128 SCM_DIRTY=1
129 SCM_STATE=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
Daniel Leavittbb990312011-06-17 14:38:49 -0700130 else
John Schulzb2b629e2011-10-09 14:24:10 -0400131 SCM_DIRTY=0
132 SCM_STATE=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
Daniel Leavittbb990312011-06-17 14:38:49 -0700133 fi
John Schulzb2b629e2011-10-09 14:24:10 -0400134 SCM_PREFIX=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
135 SCM_SUFFIX=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
Conrado Buhrer70e4ac92013-04-10 13:57:21 -0300136 SCM_BRANCH=$(hg summary 2> /dev/null | grep branch: | awk '{print $2}')
137 SCM_CHANGE=$(hg summary 2> /dev/null | grep parent: | awk '{print $2}')
Daniel Leavittbb990312011-06-17 14:38:49 -0700138}
139
John Schulzd5645e72010-11-09 23:21:19 -0500140function rvm_version_prompt {
Robert R Evansb8ce9e62010-10-14 09:10:26 -0700141 if which rvm &> /dev/null; then
142 rvm=$(rvm tools identifier) || return
143 echo -e "$RVM_THEME_PROMPT_PREFIX$rvm$RVM_THEME_PROMPT_SUFFIX"
144 fi
Florian Baumann8c619772010-11-22 11:44:28 +0100145}
Ryan0713fdc2011-06-08 11:32:50 -1000146
Victor Castell76fcb582011-11-05 13:08:34 +0100147function rbenv_version_prompt {
148 if which rbenv &> /dev/null; then
Daniel Leavitt5659a732012-04-24 23:08:40 -0700149 rbenv=$(rbenv version-name) || return
Marshall Yount231d7fc2014-01-16 12:04:47 -0600150 $(rbenv commands | grep -q gemset) && gemset=$(rbenv gemset active 2> /dev/null) && rbenv="$rbenv@${gemset%% *}"
Victor Castell76fcb582011-11-05 13:08:34 +0100151 echo -e "$RBENV_THEME_PROMPT_PREFIX$rbenv$RBENV_THEME_PROMPT_SUFFIX"
152 fi
153}
154
Hendrik Mansd356ecb2012-01-24 14:30:01 +0100155function rbfu_version_prompt {
156 if [[ $RBFU_RUBY_VERSION ]]; then
157 echo -e "${RBFU_THEME_PROMPT_PREFIX}${RBFU_RUBY_VERSION}${RBFU_THEME_PROMPT_SUFFIX}"
158 fi
159}
160
aram priceb48a0f22013-11-03 17:58:09 -0800161function chruby_version_prompt {
162 if declare -f -F chruby &> /dev/null; then
163 if declare -f -F chruby_auto &> /dev/null; then
164 chruby_auto
165 fi
aram price306f7b12014-02-04 12:06:02 -0800166
167 ruby_version=$(ruby --version | awk '{print $1, $2;}') || return
168
169 if [[ ! $(chruby | grep '*') ]]; then
170 ruby_version="${ruby_version} (system)"
171 fi
172 echo -e "${CHRUBY_THEME_PROMPT_PREFIX}${ruby_version}${CHRUBY_THEME_PROMPT_SUFFIX}"
aram priceb48a0f22013-11-03 17:58:09 -0800173 fi
174}
175
Hendrik Mans2e8be862012-01-24 14:31:23 +0100176function ruby_version_prompt {
aram priceb48a0f22013-11-03 17:58:09 -0800177 echo -e "$(rbfu_version_prompt)$(rbenv_version_prompt)$(rvm_version_prompt)$(chruby_version_prompt)"
Hendrik Mans2e8be862012-01-24 14:31:23 +0100178}
179
Ryan0713fdc2011-06-08 11:32:50 -1000180function virtualenv_prompt {
manojldsf93feb62013-02-14 10:38:12 +0530181 if [[ -n "$VIRTUAL_ENV" ]]; then
182 virtualenv=`basename "$VIRTUAL_ENV"`
Ryan0713fdc2011-06-08 11:32:50 -1000183 echo -e "$VIRTUALENV_THEME_PROMPT_PREFIX$virtualenv$VIRTUALENV_THEME_PROMPT_SUFFIX"
184 fi
185}
John Schulzb2b629e2011-10-09 14:24:10 -0400186
187# backwards-compatibility
188function git_prompt_info {
189 git_prompt_vars
190 echo -e "$SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_SUFFIX"
191}
192
193function svn_prompt_info {
194 svn_prompt_vars
195 echo -e "$SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_SUFFIX"
196}
197
198function hg_prompt_info() {
199 hg_prompt_vars
200 echo -e "$SCM_PREFIX$SCM_BRANCH:${SCM_CHANGE#*:}$SCM_STATE$SCM_SUFFIX"
201}
202
203function scm_char {
204 scm_prompt_char
205 echo -e "$SCM_CHAR"
206}
207
208function prompt_char {
209 scm_char
210}
aram price306f7b12014-02-04 12:06:02 -0800211