From: John Schulz Date: Sun, 9 Oct 2011 18:24:10 +0000 (-0400) Subject: New prompt functions and variables X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=b2b629eb1ff8be47ae3f063532f3120427f23790;p=common%2Fbash_it.git New prompt functions and variables * `(git|svn|hg)_promp_vars` only assign values to the variables but do not `echo` * `(git|svn|hg)_promp_info` still `echo`s, but now calls `*_prompt_info` first * Introduce `SCM_CHANGE` to store the changeset id * Introduce `SCM_BRANCH` to store the branch name --- diff --git a/themes/base.theme.bash b/themes/base.theme.bash index feee64e..05db36e 100644 --- a/themes/base.theme.bash +++ b/themes/base.theme.bash @@ -6,15 +6,16 @@ SCM_THEME_PROMPT_CLEAN=' ✓' SCM_THEME_PROMPT_PREFIX=' |' SCM_THEME_PROMPT_SUFFIX='|' -GIT='git' +SCM_GIT='git' SCM_GIT_CHAR='±' -HG='hg' +SCM_HG='hg' SCM_HG_CHAR='☿' -SVN='svn' +SCM_SVN='svn' SCM_SVN_CHAR='⑆' +SCM_NONE='NONE' SCM_NONE_CHAR='○' RVM_THEME_PROMPT_PREFIX=' |' @@ -24,76 +25,85 @@ VIRTUALENV_THEME_PROMPT_PREFIX=' |' VIRTUALENV_THEME_PROMPT_SUFFIX='|' function scm { - if [[ -d .git ]]; then SCM=$GIT - elif [[ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]]; then SCM=$GIT - elif [[ -d .hg ]]; then SCM=$HG - elif [[ -n "$(hg root 2> /dev/null)" ]]; then SCM=$HG - elif [[ -d .svn ]]; then SCM=$SVN - else SCM='NONE' + if [[ -d .git ]]; then SCM=$SCM_GIT + elif [[ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]]; then SCM=$SCM_GIT + elif [[ -d .hg ]]; then SCM=$SCM_HG + elif [[ -n "$(hg root 2> /dev/null)" ]]; then SCM=$SCM_HG + elif [[ -d .svn ]]; then SCM=$SCM_SVN + else SCM=$SCM_NONE fi } -function scm_char { +function scm_prompt_char { if [[ -z $SCM ]]; then scm; fi - [[ $SCM == $GIT ]] && echo $SCM_GIT_CHAR && return - [[ $SCM == $HG ]] && echo $SCM_HG_CHAR && return - [[ $SCM == $SVN ]] && echo $SCM_SVN_CHAR && return - echo $SCM_NONE_CHAR + if [[ $SCM == $SCM_GIT ]]; then SCM_CHAR=$SCM_GIT_CHAR + elif [[ $SCM == $SCM_HG ]]; then SCM_CHAR=$SCM_HG_CHAR + elif [[ $SCM == $SCM_SVN ]]; then SCM_CHAR=$SCM_SVN_CHAR + else SCM_CHAR=$SCM_NONE_CHAR + fi } -function scm_prompt_info { - if [[ -z $SCM ]]; then scm; fi - [[ $SCM == $GIT ]] && git_prompt_info && return - [[ $SCM == $HG ]] && hg_prompt_info && return - [[ $SCM == $SVN ]] && svn_prompt_info && return +function scm_prompt_vars { + scm + scm_prompt_char + SCM_DIRTY=0 + SCM_STATE='' + [[ $SCM == $SCM_GIT ]] && git_prompt_vars && return + [[ $SCM == $SCM_HG ]] && hg_prompt_vars && return + [[ $SCM == $SCM_SVN ]] && svn_prompt_vars && return } -# Stolen from Steve Losh -# left in for backwards-compatibility -function prompt_char { - char=$(scm_char); - echo -e "$char" +function scm_prompt_info { + scm + scm_prompt_char + SCM_DIRTY=0 + SCM_STATE='' + [[ $SCM == $SCM_GIT ]] && git_prompt_info && return + [[ $SCM == $SCM_HG ]] && hg_prompt_info && return + [[ $SCM == $SCM_SVN ]] && svn_prompt_info && return } -function git_prompt_info { +function git_prompt_vars { if [[ -n $(git status -s 2> /dev/null |grep -v ^# |grep -v "working directory clean") ]]; then - state=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} + SCM_DIRTY=1 + SCM_STATE=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} else - state=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} + SCM_DIRTY=0 + SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} fi - prefix=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} - suffix=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} - ref=$(git symbolic-ref HEAD 2> /dev/null) || return - - echo -e "$prefix${ref#refs/heads/}$state$suffix" + SCM_PREFIX=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} + SCM_SUFFIX=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} + local ref=$(git symbolic-ref HEAD 2> /dev/null) + SCM_BRANCH=${ref#refs/heads/} + SCM_CHANGE=$(git rev-parse HEAD 2>/dev/null) } -function svn_prompt_info { +function svn_prompt_vars { if [[ -n $(svn status 2> /dev/null) ]]; then - state=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} + SCM_DIRTY=1 + SCM_STATE=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} else - state=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} + SCM_DIRTY=0 + SCM_STATE=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} fi - prefix=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} - suffix=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} - ref=$(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 - - [[ -z $ref ]] && return - echo -e "$prefix$ref$state$suffix" + SCM_PREFIX=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} + SCM_SUFFIX=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} + 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 + SCM_CHANGE=$(svn info 2> /dev/null | sed -ne 's#^Revision: ##p' ) } -function hg_prompt_info() { +function hg_prompt_vars { if [[ -n $(hg status 2> /dev/null) ]]; then - state=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} + SCM_DIRTY=1 + SCM_STATE=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} else - state=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} + SCM_DIRTY=0 + SCM_STATE=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} fi - prefix=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} - suffix=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} - branch=$(hg summary 2> /dev/null | grep branch | awk '{print $2}') - changeset=$(hg summary 2> /dev/null | grep parent | awk '{print $2}') - - echo -e "$prefix$branch:${changeset#*:}$state$suffix" + SCM_PREFIX=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} + SCM_SUFFIX=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} + SCM_BRANCH=$(hg summary 2> /dev/null | grep branch | awk '{print $2}') + SCM_CHANGE=$(hg summary 2> /dev/null | grep parent | awk '{print $2}') } function rvm_version_prompt { @@ -109,3 +119,28 @@ function virtualenv_prompt { echo -e "$VIRTUALENV_THEME_PROMPT_PREFIX$virtualenv$VIRTUALENV_THEME_PROMPT_SUFFIX" fi } + +# backwards-compatibility +function git_prompt_info { + git_prompt_vars + echo -e "$SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_SUFFIX" +} + +function svn_prompt_info { + svn_prompt_vars + echo -e "$SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_SUFFIX" +} + +function hg_prompt_info() { + hg_prompt_vars + echo -e "$SCM_PREFIX$SCM_BRANCH:${SCM_CHANGE#*:}$SCM_STATE$SCM_SUFFIX" +} + +function scm_char { + scm_prompt_char + echo -e "$SCM_CHAR" +} + +function prompt_char { + scm_char +}