+
+# bash_prompt; adapted from
+# https://github.com/necolas/dotfiles/blob/master/shell/bash_prompt and
+# https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh
+
+_recurse_submodules() {
+ local command="$@"
+ local output="$($command 2>/dev/null)"
+ if [ -n "$output" ]; then
+ echo -n "$output"
+ return
+ fi
+ git submodule --quiet foreach $command 2>/dev/null
+}
+
+prompt_git() {
+ local s=""
+ local branchName=""
+
+ # check if the current directory is in a git repository
+ if git rev-parse --is-inside-work-tree &>/dev/null; then
+
+ # check if the current directory is in .git before running git checks
+ if [ "$(git rev-parse --is-inside-git-dir 2> /dev/null)" == "false" ]; then
+
+ # ensure index is up to date
+ #git update-index --really-refresh -q &>/dev/null
+
+ # check for unstaged changes
+ if [ -n "$(_recurse_submodules git ls-files --modified :/)" ]; then
+ s="$s*";
+ fi
+
+ # check for uncommitted changes in the index
+ if [ -n "$(_recurse_submodules git diff --ignore-submodules --cached)" ]; then
+ s="$s+";
+ fi
+
+ # check for stashed files
+ if [ -n "$(_recurse_submodules git rev-parse --verify refs/stash)" ]; then
+ s="$s$";
+ fi
+
+ # check for untracked files
+ if [ -n "$(_recurse_submodules git ls-files --others --exclude-standard :/)" ]; then
+ s="$s%";
+ fi
+
+ fi
+
+ # get the short symbolic ref
+ # if HEAD isn't a symbolic ref, get the short SHA
+ # otherwise, just give up
+ branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \
+ git rev-parse --short HEAD 2> /dev/null || \
+ printf "(unknown)")"
+
+ up=`git rev-parse --abbrev-ref @{u} 2>/dev/null`
+ if [ -n "$up" -a "$up" != "@{u}" ]; then
+ local left right
+ set -- `git rev-list --count --left-right @{u}...HEAD`
+ left=$1
+ right=$2
+ if [ "$left" -gt 0 ]; then
+ s="$s-$left"
+ fi
+ if [ "$right" -gt 0 ]; then
+ s="$s+$right"
+ fi
+ fi
+
+ [ -n "$s" ] && s=" $s"
+ printf " (%s)" "$branchName$s"
+ fi
+}
+
+#if test -x /usr/bin/git >/dev/null 2>&1; then
+# if [ "`type -t __git_ps1`" != function ]; then
+# git_sh_prompt=`git --exec-path`/git-sh-prompt
+# test -r $git_sh_prompt && . $git_sh_prompt || :
+# fi
+# if [ "`type -t __git_ps1`" = function ]; then
+# GIT_PS1_SHOWDIRTYSTATE=true
+# GIT_PS1_SHOWSTASHSTATE=true
+# GIT_PS1_SHOWUNTRACKEDFILES=true
+# GIT_PS1_SHOWUPSTREAM=verbose
+# fi
+#fi
+
+set_prompt() {
+ PS1=''
+ local _SHORT_PROMPT='[\A`cgmem_which_prompt`] \u@${HOSTNAME::5}:`short_curdir`'
+ # display the user, host and current working directory
+ # in the terminal title
+ case "$TERM" in
+ *rxvt*|screen*|*term*|vt100)
+ PS1+="\033]0;${debian_chroot:+($debian_chroot)}\u@\h:\w\007" # Set xterm title/icon
+ case "$TERM" in
+ screen*)
+ PS1+="\033P${PS1}\033\\\\" # Set xterm title/icon under screen/tmux
+ if [ -z "$MC_SID" ]; then
+ PS1+="\033k${_SHORT_PROMPT}\033\\\\" # Set screen/tmux caption
+ fi
+ ;;
+ esac
+ ;;
+ esac
+
+ # This is for .screenrc: shelltitle "\$ |$SHELL"
+ #PS1+='\033k\033\\'
+
+ PS1="\[$PS1\]"
+ PS1+='${debian_chroot:+($debian_chroot)}'
+ PS1+=${_SHORT_PROMPT}
+ if test -x /usr/bin/git >/dev/null 2>&1; then
+ #if [ "`type -t __git_ps1`" = function ]; then
+ # PS1+='$(__git_ps1)'
+ #else
+ PS1+='$(prompt_git)'
+ #fi
+ fi
+ PS1+=' $SHLVL\$ '
+}