summaryrefslogtreecommitdiff
path: root/.bash-powerline.sh
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2020-01-05 11:58:15 +0100
committerMarc Vertes <mvertes@free.fr>2020-01-05 11:58:15 +0100
commit8a7798da0f8fc4d336d3d11408bc654390a8e655 (patch)
treee77dff74de74900e45ff96318b2c291957d98963 /.bash-powerline.sh
parente0c4cb9e45f339883d9ae7aeb52958c95c5ed839 (diff)
add .bashpowerline
Diffstat (limited to '.bash-powerline.sh')
-rw-r--r--.bash-powerline.sh94
1 files changed, 94 insertions, 0 deletions
diff --git a/.bash-powerline.sh b/.bash-powerline.sh
new file mode 100644
index 0000000..65bdf38
--- /dev/null
+++ b/.bash-powerline.sh
@@ -0,0 +1,94 @@
+#!/usr/bin/env bash
+
+## Uncomment to disable git info
+#POWERLINE_GIT=0
+
+__powerline() {
+ # Colorscheme
+ readonly RESET='\[\033[m\]'
+ readonly COLOR_CWD='\[\033[0;34m\]' # blue
+ readonly COLOR_GIT='\[\033[0;36m\]' # cyan
+ #readonly COLOR_SUCCESS='\[\033[0;32m\]' # green
+ readonly COLOR_SUCCESS='\[\033[0;34m\]' # blue
+ readonly COLOR_FAILURE='\[\033[0;31m\]' # red
+
+ readonly SYMBOL_GIT_BRANCH='⑂'
+ readonly SYMBOL_GIT_MODIFIED='*'
+ readonly SYMBOL_GIT_PUSH='↑'
+ readonly SYMBOL_GIT_PULL='↓'
+
+ if [[ -z "$PS_SYMBOL" ]]; then
+ case "$(uname)" in
+ # Darwin) PS_SYMBOL='';;
+ Darwin) PS_SYMBOL='$';;
+ Linux) PS_SYMBOL='$';;
+ *) PS_SYMBOL='%';;
+ esac
+ fi
+
+ __git_info() {
+ [[ $POWERLINE_GIT = 0 ]] && return # disabled
+ hash git 2>/dev/null || 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
+ local ref=$($git_eng symbolic-ref --short HEAD 2>/dev/null)
+
+ if [[ -n "$ref" ]]; then
+ # prepend branch symbol
+ ref=$SYMBOL_GIT_BRANCH$ref
+ else
+ # get tag name or short unique hash
+ ref=$($git_eng describe --tags --always 2>/dev/null)
+ fi
+
+ [[ -n "$ref" ]] || return # not a git repo
+
+ local marks
+
+ # scan first two lines of output from `git status`
+ while IFS= read -r line; do
+ if [[ $line =~ ^## ]]; then # header line
+ [[ $line =~ ahead\ ([0-9]+) ]] && marks+=" $SYMBOL_GIT_PUSH${BASH_REMATCH[1]}"
+ [[ $line =~ behind\ ([0-9]+) ]] && marks+=" $SYMBOL_GIT_PULL${BASH_REMATCH[1]}"
+ else # branch is modified if output contains more lines after the header line
+ marks="$SYMBOL_GIT_MODIFIED$marks"
+ break
+ fi
+ done < <($git_eng status --porcelain --branch 2>/dev/null) # note the space between the two <
+
+ # print the git branch segment without a trailing newline
+ printf " $ref$marks"
+ }
+
+ ps1() {
+ # Check the exit code of the previous command and display different
+ # colors in the prompt accordingly.
+ if [ $? -eq 0 ]; then
+ local symbol="$COLOR_SUCCESS $PS_SYMBOL $RESET"
+ else
+ local symbol="$COLOR_FAILURE $PS_SYMBOL $RESET"
+ fi
+
+ local cwd="$COLOR_CWD\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)"
+ local git="$COLOR_GIT\${__powerline_git_info}$RESET"
+ else
+ # promptvars is disabled. Avoid creating unnecessary env var.
+ local git="$COLOR_GIT$(__git_info)$RESET"
+ fi
+
+ PS1="$cwd$git$symbol"
+ }
+
+ PROMPT_COMMAND="ps1${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
+}
+
+__powerline
+unset __powerline