Skip to content

Instantly share code, notes, and snippets.

@jpbochi
Created August 6, 2019 10:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jpbochi/83c787fd84a741e63b1cf2ce9d9eeb2a to your computer and use it in GitHub Desktop.
Save jpbochi/83c787fd84a741e63b1cf2ce9d9eeb2a to your computer and use it in GitHub Desktop.
bash PROMPT_COMMAND + PS1 for git status
#!/usr/bin/env bash
# copied from http://mediadoneright.com/content/ultimate-git-ps1-bash-prompt
# Customize BASH PS1 prompt to show current GIT repository and branch.
# by Mike Stewart - http://MediaDoneRight.com
# TODO: scope the following env vars to this file only. They can be seen with `declare -p`
# Reset
Color_Off="\[\033[0m\]" # Text Reset
# Regular Colors
Black="\[\033[0;30m\]" # Black
Red="\[\033[0;31m\]" # Red
Green="\[\033[0;32m\]" # Green
Yellow="\[\033[0;33m\]" # Yellow
Blue="\[\033[0;34m\]" # Blue
Purple="\[\033[0;35m\]" # Purple
Cyan="\[\033[0;36m\]" # Cyan
White="\[\033[0;37m\]" # White
# Bold
# BBlack="\[\033[1;30m\]" # Black
# BRed="\[\033[1;31m\]" # Red
# BGreen="\[\033[1;32m\]" # Green
# BYellow="\[\033[1;33m\]" # Yellow
# BBlue="\[\033[1;34m\]" # Blue
# BPurple="\[\033[1;35m\]" # Purple
# BCyan="\[\033[1;36m\]" # Cyan
# BWhite="\[\033[1;37m\]" # White
# # Underline
# UBlack="\[\033[4;30m\]" # Black
# URed="\[\033[4;31m\]" # Red
# UGreen="\[\033[4;32m\]" # Green
# UYellow="\[\033[4;33m\]" # Yellow
# UBlue="\[\033[4;34m\]" # Blue
# UPurple="\[\033[4;35m\]" # Purple
# UCyan="\[\033[4;36m\]" # Cyan
# UWhite="\[\033[4;37m\]" # White
# # Background
# On_Black="\[\033[40m\]" # Black
# On_Red="\[\033[41m\]" # Red
# On_Green="\[\033[42m\]" # Green
# On_Yellow="\[\033[43m\]" # Yellow
# On_Blue="\[\033[44m\]" # Blue
# On_Purple="\[\033[45m\]" # Purple
# On_Cyan="\[\033[46m\]" # Cyan
# On_White="\[\033[47m\]" # White
# # High Intensty
# IBlack="\[\033[0;90m\]" # Black
# IRed="\[\033[0;91m\]" # Red
# IGreen="\[\033[0;92m\]" # Green
# IYellow="\[\033[0;93m\]" # Yellow
# IBlue="\[\033[0;94m\]" # Blue
# IPurple="\[\033[0;95m\]" # Purple
# ICyan="\[\033[0;96m\]" # Cyan
# IWhite="\[\033[0;97m\]" # White
# # Bold High Intensty
# BIBlack="\[\033[1;90m\]" # Black
# BIRed="\[\033[1;91m\]" # Red
# BIGreen="\[\033[1;92m\]" # Green
# BIYellow="\[\033[1;93m\]" # Yellow
# BIBlue="\[\033[1;94m\]" # Blue
# BIPurple="\[\033[1;95m\]" # Purple
# BICyan="\[\033[1;96m\]" # Cyan
# BIWhite="\[\033[1;97m\]" # White
# # High Intensty backgrounds
# On_IBlack="\[\033[0;100m\]" # Black
# On_IRed="\[\033[0;101m\]" # Red
# On_IGreen="\[\033[0;102m\]" # Green
# On_IYellow="\[\033[0;103m\]" # Yellow
# On_IBlue="\[\033[0;104m\]" # Blue
# On_IPurple="\[\033[10;95m\]" # Purple
# On_ICyan="\[\033[0;106m\]" # Cyan
# On_IWhite="\[\033[0;107m\]" # White
# Various variables you might want for your PS1 prompt instead
# Time12h="\T"
# Time12a="\@"
Time24h="\t"
# Time24hShort="\A"
PathShort="\w"
# PathFull="\W"
# NewLine="\n"
# Jobs="\j"
function __ps1_exit_indicator() {
local EXIT="$1"
if [[ $EXIT != "0" ]] && [[ $EXIT != "" ]]; then
echo " [$EXIT]"
fi
}
function gst_color() {
if [ -z "$1" ]; then
PS_GST_END='' # no git status
elif ! \grep -o '^[^#]' <<< "$1" --quiet; then
printf "${Green} (" # git status is clean
PS_GST_END=')'
# elif ! \grep -e '^[12#] [.][^.]' -e '^?' --quiet <<< "$1"; then
# printf "${Yellow} <" # all changes are staged
# PS_GST_END='>'
else
printf "${Red} [" # there are non-staged and/or untracked files, or unmerged changes
PS_GST_END=']'
fi
}
function gst_branch() {
# `<<<` is a Here String (see http://www.tldp.org/LDP/abs/html/x17837.html)
local branch=$(\grep '^# branch.head' <<< "$1" | cut -d' ' -f3 &)
printf "$branch"
}
function gst_staged() {
[ "$1" ] && local count=$(\grep -e '^[^#?] .[.]' --count <<< "$1" &) && [ "$count" != '0' ] && printf " +$count"
}
function gst_not_staged() {
[ "$1" ] && local count=$(\grep -e '^[^#?] .[^.]' --count <<< "$1" &) && [ "$count" != '0' ] && printf " ~$count"
}
function gst_not_tracked() {
[ "$1" ] && local count=$(\grep -e '^?' --count <<< "$1" &) && [ "$count" != '0' ] && printf " …$count"
}
function gst_any() {
[ "$1" ] && ( ! \grep -e '^[^#]' --quiet <<< "$1" ) && printf ' ✓'
}
function gst_to_ps1() {
local gst="$1"
PS_GST_END=''
# https://bashitout.com/2013/05/18/Ampersands-on-the-command-line.html
gst_color "$gst"
gst_branch "$gst" & \
gst_staged "$gst" & \
gst_not_staged "$gst" & \
gst_not_tracked "$gst" & \
gst_any "$gst"
wait && echo "${PS_GST_END}"
}
function __prompt_command() {
PS1=$Cyan$Time24h$Color_Off"\${_cmd_[\#]-$Purple\$(__ps1_exit_indicator \$?)}\${_cmd_[\#]=}"$Color_Off
PS1+='/ \h:'$Blue$PathShort
local gst=$(git status --porcelain=2 --branch 2> /dev/null)
if [ "$gst" != "$PS_GST_CACHE" ]; then
PS_GST_CACHE_GITPS1="$(gst_to_ps1 "$gst")"
fi
PS_GST_CACHE="$gst"
PS1+="${PS_GST_CACHE_GITPS1}${Color_Off}"
PS1+="\n🜚 "
}
function __prompt_command_no_cache() {
PS_GST_CACHE=''
__prompt_command
}
function __light_prompt_command() {
PS1=$Cyan$Time24h$Color_Off"\${_cmd_[\#]-$Purple\$(__ps1_exit_indicator \$?)}\${_cmd_[\#]=}"$Color_Off
PS1+='/ \h:'$Blue$PathShort$Color_Off'\n🜚 '
}
export PS_GST_CACHE=''
export PS_GST_CACHE_GITPS1=''
export PROMPT_COMMAND=__prompt_command
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment