From 8b42fd3974e734cb2d164299ccc3519d13789a10 Mon Sep 17 00:00:00 2001 From: Leonid Volnitsky Date: Thu, 2 Jul 2009 15:52:28 +0300 Subject: fixed: consistant tabulation. tabstop=8, tabs replaced with spaces --- README | 2 +- git-prompt.conf | 54 ++--- git-prompt.sh | 714 +++++++++++++++++++++++++++----------------------------- 3 files changed, 378 insertions(+), 392 deletions(-) diff --git a/README b/README index 82786d5..2817ace 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ GIT Prompt for BASH -Screenshots and docs at: http://volnitsky.com/project/git-prompt +Screenshots and docs are at: http://volnitsky.com/project/git-prompt diff --git a/git-prompt.conf b/git-prompt.conf index a9061ab..2ef616e 100644 --- a/git-prompt.conf +++ b/git-prompt.conf @@ -8,8 +8,8 @@ ########################################################### -# error_bell=off # sound terminal bell when command return code is not zero. (use setterm to set pitch and duration) -# max_file_list_length=100 # in characters +# error_bell=off # sound terminal bell when command return code is not zero. (use setterm to set pitch and duration) +# max_file_list_length=100 # in characters ############################################################ MODULES @@ -23,14 +23,14 @@ ########################################################### DEFAULT OBJECTS ### Default objects are not displayed. Example: -## default_user=lvv -## default_host="ahp" # remote host is always shown -## default_domain="lvvnet" +## default_user=lvv +## default_host="ahp" # remote host is always shown +## default_domain="lvvnet" ########################################################### CWD -## cwd_cmd='\w' # display full path -## cwd_cmd='\W' # display only last dir of path -cwd_cmd='cwd_truncate 40' # display last 30 chars of path +## cwd_cmd='\w' # display full path +## cwd_cmd='\W' # display only last dir of path +cwd_cmd='cwd_truncate 40' # display last 30 chars of path ########################################################### ETC @@ -40,13 +40,13 @@ cwd_cmd='cwd_truncate 40' # display last 30 chars of path ### directory, exit code, root color -# if [ 0`tput colors` -ge 8 ]; then # if terminal supports colors - # dir_color=CYAN - # rc_color=red - # root_id_color=magenta -# else # B/W terminal - # dir_color=bw_bold - # rc_color=bw_bold +# if [ 0`tput colors` -ge 8 ]; then # if terminal supports colors + # dir_color=CYAN + # rc_color=red + # root_id_color=magenta +# else # B/W terminal + # dir_color=bw_bold + # rc_color=bw_bold # fi @@ -56,21 +56,21 @@ cwd_cmd='cwd_truncate 40' # display last 30 chars of path ### Variable name is uppercase-short-hostname with appended "_host_color" ### Example per-host-color config: -## TASHA_host_color=cyan -## AL_host_color=green -## AHP_host_color=white +## TASHA_host_color=cyan +## AL_host_color=green +## AHP_host_color=white ##### VCS (version control system) state colors -# init_vcs_color=WHITE # initial -# clean_vcs_color=blue # nothing to commit (working directory clean) -# modified_vcs_color=red # Changed but not updated: -# added_vcs_color=green # Changes to be committed: -# mixed_vcs_color=yellow # -# untracked_vcs_color=BLUE # Untracked files: -# op_vcs_color=MAGENTA -# detached_vcs_color=RED +# init_vcs_color=WHITE # initial +# clean_vcs_color=blue # nothing to commit (working directory clean) +# modified_vcs_color=red # Changed but not updated: +# added_vcs_color=green # Changes to be committed: +# mixed_vcs_color=yellow # +# untracked_vcs_color=BLUE # Untracked files: +# op_vcs_color=MAGENTA +# detached_vcs_color=RED -: vim:ft=sh ts=8: +# :vim:ft=sh ts=8 sw=8 et: diff --git a/git-prompt.sh b/git-prompt.sh index 6adf581..580419d 100755 --- a/git-prompt.sh +++ b/git-prompt.sh @@ -1,92 +1,87 @@ -# don't set prompt if this is not interactive shell -[[ $- != *i* ]] && return + # don't set prompt if this is not interactive shell + [[ $- != *i* ]] && return ################################################################### CONFIG - ##### read config file if any. + ##### read config file if any. - unset dir_color rc_color root_id_color init_vcs_color clean_vcs_color - unset modified_vcs_color added_vcs_color mixed_vcs_color untracked_vcs_color op_vcs_color detached_vcs_color + unset dir_color rc_color root_id_color init_vcs_color clean_vcs_color + unset modified_vcs_color added_vcs_color mixed_vcs_color untracked_vcs_color op_vcs_color detached_vcs_color - conf=git-prompt.conf; [[ -r $conf ]] && . $conf - conf=/etc/git-prompt.conf; [[ -r $conf ]] && . $conf - conf=~/.git-prompt.conf; [[ -r $conf ]] && . $conf - unset conf + conf=git-prompt.conf; [[ -r $conf ]] && . $conf + conf=/etc/git-prompt.conf; [[ -r $conf ]] && . $conf + conf=~/.git-prompt.conf; [[ -r $conf ]] && . $conf + unset conf - ##### set defaults if not set + ##### set defaults if not set - git_module=${git_module:-on} - svn_module=${svn_module:-off} - hg_module=${hg_module:-on} - vim_module=${vim_module:-on} - error_bell=${error_bell:-off} + git_module=${git_module:-on} + svn_module=${svn_module:-off} + hg_module=${hg_module:-on} + vim_module=${vim_module:-on} + error_bell=${error_bell:-off} - #### dir, rc, root color - if [ 0`tput colors` -ge 8 ]; then # if terminal supports colors - dir_color=${dir_color:-CYAN} - rc_color=${rc_color:-red} - root_id_color=${root_id_color:-magenta} - else # only B/W - dir_color=${dir_color:-bw_bold} - rc_color=${rc_color:-bw_bold} - fi - - #### vcs state colors - init_vcs_color=${init_vcs_color:-WHITE} # initial - clean_vcs_color=${clean_vcs_color:-blue} # nothing to commit (working directory clean) - modified_vcs_color=${modified_vcs_color:-red} # Changed but not updated: - added_vcs_color=${added_vcs_color:-green} # Changes to be committed: - mixed_vcs_color=${mixed_vcs_color:-yellow} - untracked_vcs_color=${untracked_vcs_color:-BLUE} # Untracked files: - op_vcs_color=${op_vcs_color:-MAGENTA} - detached_vcs_color=${detached_vcs_color:-RED} - - max_file_list_length=${max_file_list_length:-100} + #### dir, rc, root color + if [ 0`tput colors` -ge 8 ]; then # if terminal supports colors + dir_color=${dir_color:-CYAN} + rc_color=${rc_color:-red} + root_id_color=${root_id_color:-magenta} + else # only B/W + dir_color=${dir_color:-bw_bold} + rc_color=${rc_color:-bw_bold} + fi - truncate_pwd=${truncate_pwd:-off} - max_pwd_length=${max_pwd_length:-30} - min_chars_per_pwd=${min_chars_per_pwd:-1} + #### vcs state colors + init_vcs_color=${init_vcs_color:-WHITE} # initial + clean_vcs_color=${clean_vcs_color:-blue} # nothing to commit (working directory clean) + modified_vcs_color=${modified_vcs_color:-red} # Changed but not updated: + added_vcs_color=${added_vcs_color:-green} # Changes to be committed: + mixed_vcs_color=${mixed_vcs_color:-yellow} + untracked_vcs_color=${untracked_vcs_color:-BLUE} # Untracked files: + op_vcs_color=${op_vcs_color:-MAGENTA} + detached_vcs_color=${detached_vcs_color:-RED} - upcase_hostname=${upcase_hostname:-on} + max_file_list_length=${max_file_list_length:-100} + upcase_hostname=${upcase_hostname:-on} ##################################################################### post config - ################# make PARSE_VCS_STATUS - PARSE_VCS_STATUS="" - [[ $git_module = "on" ]] && type git >&/dev/null && PARSE_VCS_STATUS="parse_git_status" - [[ $svn_module = "on" ]] && type svn >&/dev/null && PARSE_VCS_STATUS+="||parse_svn_status" - [[ $hg_module = "on" ]] && type hg >&/dev/null && PARSE_VCS_STATUS+="||parse_hg_status" - PARSE_VCS_STATUS+="||return" - ################# terminfo colors-16 - # - # black? 0 8 - # red 1 9 - # green 2 10 - # yellow 3 11 - # blue 4 12 - # magenta 5 13 - # cyan 6 14 - # white 7 15 - # - # terminfo setaf/setab - sets ansi foreground/background - # terminfo sgr0 - resets all attributes - # terminfo colors - number of colors - # - ################# Colors-256 - # To use foreground and background colors from the extension, you only - # have to remember two escape codes: - # Set the foreground color to index N: \033[38;5;${N}m - # Set the background color to index M: \033[48;5;${M}m - # To make vim aware of a present 256 color extension, you can either set - # the $TERM environment variable to xterm-256color or use vim's -T option - # to set the terminal. I'm using an alias in my bashrc to do this. At the - # moment I only know of two color schemes which is made for multi-color - # terminals like urxvt (88 colors) or xterm: inkpot and desert256, - - ### if term support colors, then use color prompt, else bold + ################# make PARSE_VCS_STATUS + PARSE_VCS_STATUS="" + [[ $git_module = "on" ]] && type git >&/dev/null && PARSE_VCS_STATUS="parse_git_status" + [[ $svn_module = "on" ]] && type svn >&/dev/null && PARSE_VCS_STATUS+="||parse_svn_status" + [[ $hg_module = "on" ]] && type hg >&/dev/null && PARSE_VCS_STATUS+="||parse_hg_status" + PARSE_VCS_STATUS+="||return" + ################# terminfo colors-16 + # + # black? 0 8 + # red 1 9 + # green 2 10 + # yellow 3 11 + # blue 4 12 + # magenta 5 13 + # cyan 6 14 + # white 7 15 + # + # terminfo setaf/setab - sets ansi foreground/background + # terminfo sgr0 - resets all attributes + # terminfo colors - number of colors + # + ################# Colors-256 + # To use foreground and background colors from the extension, you only + # have to remember two escape codes: + # Set the foreground color to index N: \033[38;5;${N}m + # Set the background color to index M: \033[48;5;${M}m + # To make vim aware of a present 256 color extension, you can either set + # the $TERM environment variable to xterm-256color or use vim's -T option + # to set the terminal. I'm using an alias in my bashrc to do this. At the + # moment I only know of two color schemes which is made for multi-color + # terminals like urxvt (88 colors) or xterm: inkpot and desert256, + + ### if term support colors, then use color prompt, else bold black='\['`tput sgr0; tput setaf 0`'\]' red='\['`tput sgr0; tput setaf 1`'\]' @@ -108,208 +103,201 @@ bw_bold='\['`tput bold`'\]' - on='' - off=': ' - - bell="\[`eval ${!error_bell} tput bel`\]" + on='' + off=': ' + + bell="\[`eval ${!error_bell} tput bel`\]" - colors_reset='\['`tput sgr0`'\]' + colors_reset='\['`tput sgr0`'\]' - # Workaround for UTF readline(?) bug. Disable bell when UTF - #locale |grep -qi UTF && bell='' + # Workaround for UTF readline(?) bug. Disable bell when UTF + #locale |grep -qi UTF && bell='' - # replace symbolic colors names to raw treminfo strings - init_vcs_color=${!init_vcs_color} - modified_vcs_color=${!modified_vcs_color} - untracked_vcs_color=${!untracked_vcs_color} - clean_vcs_color=${!clean_vcs_color} - added_vcs_color=${!added_vcs_color} - op_vcs_color=${!op_vcs_color} - mixed_vcs_color=${!mixed_vcs_color} - detached_vcs_color=${!detached_vcs_color} + # replace symbolic colors names to raw treminfo strings + init_vcs_color=${!init_vcs_color} + modified_vcs_color=${!modified_vcs_color} + untracked_vcs_color=${!untracked_vcs_color} + clean_vcs_color=${!clean_vcs_color} + added_vcs_color=${!added_vcs_color} + op_vcs_color=${!op_vcs_color} + mixed_vcs_color=${!mixed_vcs_color} + detached_vcs_color=${!detached_vcs_color} - ##################################################################### - # if label non empty, append 1 space - label=${1:+$1 } + ##################################################################### + # if label non empty, append 1 space + label=${1:+$1 } - unset PROMPT_COMMAND + unset PROMPT_COMMAND - ####### work around for MC bug - if [ -z "$TERM" -o "$TERM" = "dumb" -o -n "$MC_SID" ]; then - unset PROMPT_COMMAND - PS1='\w> ' - return 0 - fi + ####### work around for MC bug + if [ -z "$TERM" -o "$TERM" = "dumb" -o -n "$MC_SID" ]; then + unset PROMPT_COMMAND + PS1='\w> ' + return 0 + fi - export who_where + export who_where -truncate_working_directory() { - pwd=`echo $PWD | sed "s:^${HOME}:~:"` - [[ $truncate_pwd != "on" ]] && return - chars_per_dir=5 - while [[ $((chars_per_dir--)) -gt $((min_chars_per_pwd)) && `echo ${pwd} | wc -m` -gt $((max_pwd_length)) ]]; do - pwd=`echo ${pwd} | sed "s:[^\/~]*\(/.\{${chars_per_dir}\}\):\1:g"` - done - unset chars_per_dir - } cwd_truncate() { - # https://www.blog.montgomerie.net/pwd-in-the-title-bar-or-a-regex-adventure-in-bash - - [[ $truncate_pwd != "on" ]] && return - - local pwd_length=$1 + # based on: https://www.blog.montgomerie.net/pwd-in-the-title-bar-or-a-regex-adventure-in-bash + # TODO: never abbrivate last dir - # Get the current working directory. We'll format it in $dir. - local dir="$PWD" + [[ $truncate_pwd != "on" ]] && return - # Substitute a leading path that's in $HOME for "~" - if [[ "$HOME" == ${dir:0:${#HOME}} ]] ; then - dir="~${dir:${#HOME}}" - fi + local pwd_length=$1 - # Append a trailing slash if it's not there already. - #if [[ ${dir:${#dir}-1} != "/" ]] ; then - # dir="$dir/" - #fi + # Get the current working directory. We'll format it in $dir. + local dir="$PWD" - # Truncate if we're too long. - # We preserve the leading '/' or '~/', and substitute - # ellipses for some directories in the middle. - if [[ "$dir" =~ (~){0,1}/.*(.{${pwd_length}}) ]] ; then - local tilde=${BASH_REMATCH[1]} - local directory=${BASH_REMATCH[2]} - - # At this point, $directory is the truncated end-section of the - # path. We will now make it only contain full directory names - # (e.g. "ibrary/Mail" -> "/Mail"). - if [[ "$directory" =~ [^/]*(.*) ]] ; then - directory=${BASH_REMATCH[1]} - fi + # Substitute a leading path that's in $HOME for "~" + if [[ "$HOME" == ${dir:0:${#HOME}} ]] ; then + dir="~${dir:${#HOME}}" + fi - # Can't work out if it's possible to use the Unicode ellipsis, - # '…' (Unicode 2026). Directly embedding it in the string does not - # seem to work, and \u escape sequences ('\u2026') are not expanded. - #printf -v dir "$tilde/\u2026$s", $directory" - dir="$tilde/...$directory" - fi + # Append a trailing slash if it's not there already. + #if [[ ${dir:${#dir}-1} != "/" ]] ; then + # dir="$dir/" + #fi + + # Truncate if we're too long. + # We preserve the leading '/' or '~/', and substitute + # ellipses for some directories in the middle. + if [[ "$dir" =~ (~){0,1}/.*(.{${pwd_length}}) ]] ; then + local tilde=${BASH_REMATCH[1]} + local directory=${BASH_REMATCH[2]} + + # At this point, $directory is the truncated end-section of the + # path. We will now make it only contain full directory names + # (e.g. "ibrary/Mail" -> "/Mail"). + if [[ "$directory" =~ [^/]*(.*) ]] ; then + directory=${BASH_REMATCH[1]} + fi + + # Can't work out if it's possible to use the Unicode ellipsis, + # '…' (Unicode 2026). Directly embedding it in the string does not + # seem to work, and \u escape sequences ('\u2026') are not expanded. + #printf -v dir "$tilde/\u2026$s", $directory" + dir="$tilde/...$directory" + fi - cwd="$dir" -} + cwd="$dir" + } set_shell_title() { - xterm_title() { echo -n "]2;${@}" ; } # FIXME: replace hardcodes with terminfo codes + xterm_title() { echo -n "]2;${@}" ; } # FIXME: replace hardcodes with terminfo codes - screen_title() { - # FIXME: run this only if screen is in xterm (how to test for this?) - xterm_title "sCRn $label$plain_who_where $@" + screen_title() { + # FIXME: run this only if screen is in xterm (how to test for this?) + xterm_title "sCRn $label$plain_who_where $@" - # FIXME $STY not inherited though "su -" - [ "$STY" ] && screen -S $STY -X title "$*" - } + # FIXME $STY not inherited though "su -" + [ "$STY" ] && screen -S $STY -X title "$*" + } - case $TERM in + case $TERM in - screen*) - screen_title "$*" - ;; + screen*) + screen_title "$*" + ;; - xterm* | rxvt* | gnome-terminal | konsole | eterm | wterm ) - # is there a capability which we can to test - # for "set term title-bar" and its escapes? - #echo -n "]2;$label$plain_who_where $1" - xterm_title "$label$plain_who_where $@" - ;; + xterm* | rxvt* | gnome-terminal | konsole | eterm | wterm ) + # is there a capability which we can to test + # for "set term title-bar" and its escapes? + #echo -n "]2;$label$plain_who_where $1" + xterm_title "$label$plain_who_where $@" + ;; - *) - ;; - esac + *) + ;; + esac } export -f set_shell_title ###################################################### ID (user name) - id=`id -un` - id=${id#$default_user} + id=`id -un` + id=${id#$default_user} ########################################################### TTY - tty=`tty` - tty=`echo $tty | sed "s:/dev/pts/:p:; s:/dev/tty::" ` # RH tty devs - tty=`echo $tty | sed "s:/dev/vc/:vc:" ` # gentoo tty devs - - if [[ "$TERM" = "screen" ]] ; then - - # [ "$WINDOW" = "" ] && WINDOW="?" - # - # # if under screen then make tty name look like s1-p2 - # # tty="${WINDOW:+s}$WINDOW${WINDOW:+-}$tty" - # tty="${WINDOW:+s}$WINDOW" # replace tty name with screen number - tty="$WINDOW" # replace tty name with screen number - fi - - # we don't need tty name under X11 - case $TERM in - xterm* | rxvt* | gnome-terminal | konsole | eterm | wterm ) unset tty ;; - *);; - esac - - dir_color=${!dir_color} - rc_color=${!rc_color} - root_id_color=${!root_id_color} - - ########################################################### HOST - ### we don't display home host/domain $SSH_* set by SSHD or keychain - - # How to find out if session is local or remote? Working with "su -", ssh-agent, and so on ? - ## is sshd our parent? - # if { for ((pid=$$; $pid != 1 ; pid=`ps h -o pid --ppid $pid`)); do ps h -o command -p $pid; done | grep -q sshd && echo == REMOTE ==; } - #then - host=${HOSTNAME} - #host=`hostname --short` - if [[ $upcase_hostname = "on" ]]; then - host=`echo ${host%$default_host} | tr a-z A-Z` - else - host=${host%$default_host} - fi - + tty=`tty` + tty=`echo $tty | sed "s:/dev/pts/:p:; s:/dev/tty::" ` # RH tty devs + tty=`echo $tty | sed "s:/dev/vc/:vc:" ` # gentoo tty devs + + if [[ "$TERM" = "screen" ]] ; then + + # [ "$WINDOW" = "" ] && WINDOW="?" + # + # # if under screen then make tty name look like s1-p2 + # # tty="${WINDOW:+s}$WINDOW${WINDOW:+-}$tty" + # tty="${WINDOW:+s}$WINDOW" # replace tty name with screen number + tty="$WINDOW" # replace tty name with screen number + fi + + # we don't need tty name under X11 + case $TERM in + xterm* | rxvt* | gnome-terminal | konsole | eterm | wterm ) unset tty ;; + *);; + esac + + dir_color=${!dir_color} + rc_color=${!rc_color} + root_id_color=${!root_id_color} + + ########################################################### HOST + ### we don't display home host/domain $SSH_* set by SSHD or keychain + + # How to find out if session is local or remote? Working with "su -", ssh-agent, and so on ? + ## is sshd our parent? + # if { for ((pid=$$; $pid != 1 ; pid=`ps h -o pid --ppid $pid`)); do ps h -o command -p $pid; done | grep -q sshd && echo == REMOTE ==; } + #then + host=${HOSTNAME} + #host=`hostname --short` + if [[ $upcase_hostname = "on" ]]; then + host=`echo ${host%$default_host} | tr a-z A-Z` + else + host=${host%$default_host} + fi + host_color=${host}_host_color host_color=${!host_color} if [[ -z $host_color && -x /usr/bin/cksum ]] ; then - cksum_color_no=`echo $host | cksum | awk '{print $1%7}'` - color_index=(green yellow blue magenta cyan white) # FIXME: bw, color-256 - host_color=${color_index[cksum_color_no]} - fi + cksum_color_no=`echo $host | cksum | awk '{print $1%7}'` + color_index=(green yellow blue magenta cyan white) # FIXME: bw, color-256 + host_color=${color_index[cksum_color_no]} + fi - host_color=${!host_color} + host_color=${!host_color} - # we already should have short host name, but just in case - host=${host%.$localdomain} - host=${host%.$default_domain} + # we already should have short host name, but just in case + host=${host%.$localdomain} + host=${host%.$default_domain} #################################################################### WHO_WHERE - # [[user@]host[-tty]] - - if [[ -n $id || -n $host ]] ; then - [[ -n $id && -n $host ]] && at='@' || at='' - color_who_where="${id}$at${host:+$host_color$host}${tty:+ $tty}" - plain_who_where="${id}$at$host" - - # add trailing " " - color_who_where="$color_who_where " - plain_who_where="$plain_who_where " - - # if root then make it root_color - if [ "$id" == "root" ] ; then - color_who_where="$root_id_color$color_who_where$colors_reset" - fi - else - color_who_where='' - fi + # [[user@]host[-tty]] + + if [[ -n $id || -n $host ]] ; then + [[ -n $id && -n $host ]] && at='@' || at='' + color_who_where="${id}$at${host:+$host_color$host}${tty:+ $tty}" + plain_who_where="${id}$at$host" + + # add trailing " " + color_who_where="$color_who_where " + plain_who_where="$plain_who_where " + + # if root then make it root_color + if [ "$id" == "root" ] ; then + color_who_where="$root_id_color$color_who_where$colors_reset" + fi + else + color_who_where='' + fi + parse_svn_status() { @@ -330,39 +318,39 @@ parse_svn_status() { unset status modified added clean init added mixed untracked op detached eval `svn status 2>/dev/null | sed -n ' - s/^A \([^.].*\)/modified=modified; modified_files[${#modified_files[@]}+1]=\"\1\";/p - s/^M \([^.].*\)/modified=modified; modified_files[${#modified_files[@]}+1]=\"\1\";/p - s/^\? \([^.].*\)/untracked=untracked; untracked_files[${#untracked_files[@]}+1]=\"\1\";/p + s/^A \([^.].*\)/modified=modified; modified_files[${#modified_files[@]}+1]=\"\1\";/p + s/^M \([^.].*\)/modified=modified; modified_files[${#modified_files[@]}+1]=\"\1\";/p + s/^\? \([^.].*\)/untracked=untracked; untracked_files[${#untracked_files[@]}+1]=\"\1\";/p ' ` # TODO branch detection if standard repo layout - [[ -z $modified ]] && [[ -z $untracked ]] && clean=clean + [[ -z $modified ]] && [[ -z $untracked ]] && clean=clean vcs_info=svn:r$rev } parse_hg_status() { - - [[ -d ./.hg/ ]] || return 1 - - vcs=hg - - ### get status - unset status modified added clean init added mixed untracked op detached - - eval `hg status 2>/dev/null | - sed -n ' - s/^M \([^.].*\)/modified=modified; modified_files[${#modified_files[@]}+1]=\"\1\";/p - s/^A \([^.].*\)/added=added; added_files[${#added_files[@]}+1]=\"\1\";/p - s/^R \([^.].*\)/added=added;/p - s/^! \([^.].*\)/modified=modified;/p - s/^? \([^.].*\)/untracked=untracked; untracked_files[${#untracked_files[@]}+1]=\\"\1\\";/p - '` - - branch=`hg branch 2> /dev/null` - - [[ -z $modified ]] && [[ -z $untracked ]] && [[ -z $added ]] && clean=clean - vcs_info=${branch/default/D} + + [[ -d ./.hg/ ]] || return 1 + + vcs=hg + + ### get status + unset status modified added clean init added mixed untracked op detached + + eval `hg status 2>/dev/null | + sed -n ' + s/^M \([^.].*\)/modified=modified; modified_files[${#modified_files[@]}+1]=\"\1\";/p + s/^A \([^.].*\)/added=added; added_files[${#added_files[@]}+1]=\"\1\";/p + s/^R \([^.].*\)/added=added;/p + s/^! \([^.].*\)/modified=modified;/p + s/^? \([^.].*\)/untracked=untracked; untracked_files[${#untracked_files[@]}+1]=\\"\1\\";/p + '` + + branch=`hg branch 2> /dev/null` + + [[ -z $modified ]] && [[ -z $untracked ]] && [[ -z $added ]] && clean=clean + vcs_info=${branch/default/D} } parse_git_status() { @@ -379,44 +367,44 @@ parse_git_status() { unset status modified added clean init added mixed untracked op detached eval ` git status 2>/dev/null | - sed -n ' - s/^# On branch /branch=/p - s/^nothing to commit (working directory clean)/clean=clean/p - s/^# Initial commit/init=init/p - - s/^# \.\./: SKIP/ - - /^# Untracked files:/,/^[^#]/{ - s/^# Untracked files:/untracked=untracked;/p - s/^# \(.*\)/untracked_files[${#untracked_files[@]}+1]=\\"\1\\"/p - } - - /^# Changed but not updated:/,/^# [A-Z]/ { - s/^# Changed but not updated:/modified=modified;/p - s/^# modified: \.\./: SKIP/ - s/^# modified: \(.*\)/modified_files[${#modified_files[@]}+1]=\"\1\"/p - s/^# unmerged: \.\./: SKIP/ - s/^# unmerged: \(.*\)/modified_files[${#modified_files[@]}+1]=\"\1\"/p - } - - /^# Changes to be committed:/,/^# [A-Z]/ { - s/^# Changes to be committed:/added=added;/p - - s/^# modified: \.\./: SKIP/ - s/^# new file: \.\./: SKIP/ - s/^# renamed:[^>]*> \.\./: SKIP/ - s/^# copied:[^>]*> \.\./: SKIP/ - - s/^# modified: \(.*\)/added_files[${#added_files[@]}+1]=\"\1\"/p - s/^# new file: \(.*\)/added_files[${#added_files[@]}+1]=\"\1\"/p - s/^# renamed:[^>]*> \(.*\)/added_files[${#added_files[@]}+1]=\"\1\"/p - s/^# copied:[^>]*> \(.*\)/added_files[${#added_files[@]}+1]=\"\1\"/p - } - ' + sed -n ' + s/^# On branch /branch=/p + s/^nothing to commit (working directory clean)/clean=clean/p + s/^# Initial commit/init=init/p + + s/^# \.\./: SKIP/ + + /^# Untracked files:/,/^[^#]/{ + s/^# Untracked files:/untracked=untracked;/p + s/^# \(.*\)/untracked_files[${#untracked_files[@]}+1]=\\"\1\\"/p + } + + /^# Changed but not updated:/,/^# [A-Z]/ { + s/^# Changed but not updated:/modified=modified;/p + s/^# modified: \.\./: SKIP/ + s/^# modified: \(.*\)/modified_files[${#modified_files[@]}+1]=\"\1\"/p + s/^# unmerged: \.\./: SKIP/ + s/^# unmerged: \(.*\)/modified_files[${#modified_files[@]}+1]=\"\1\"/p + } + + /^# Changes to be committed:/,/^# [A-Z]/ { + s/^# Changes to be committed:/added=added;/p + + s/^# modified: \.\./: SKIP/ + s/^# new file: \.\./: SKIP/ + s/^# renamed:[^>]*> \.\./: SKIP/ + s/^# copied:[^>]*> \.\./: SKIP/ + + s/^# modified: \(.*\)/added_files[${#added_files[@]}+1]=\"\1\"/p + s/^# new file: \(.*\)/added_files[${#added_files[@]}+1]=\"\1\"/p + s/^# renamed:[^>]*> \(.*\)/added_files[${#added_files[@]}+1]=\"\1\"/p + s/^# copied:[^>]*> \(.*\)/added_files[${#added_files[@]}+1]=\"\1\"/p + } + ' ` if ! grep -q "^ref:" $git_dir/HEAD 2>/dev/null; then - detached=detached + detached=detached fi @@ -426,46 +414,44 @@ parse_git_status() { if [[ -d "$git_dir/.dotest" ]] ; then - if [[ -f "$git_dir/.dotest/rebasing" ]] ; then - op="rebase" + if [[ -f "$git_dir/.dotest/rebasing" ]] ; then + op="rebase" - elif [[ -f "$git_dir/.dotest/applying" ]] ; then - op="am" + elif [[ -f "$git_dir/.dotest/applying" ]] ; then + op="am" - else - op="am/rebase" + else + op="am/rebase" - fi + fi elif [[ -f "$git_dir/.dotest-merge/interactive" ]] ; then - op="rebase -i" - # ??? branch="$(cat "$git_dir/.dotest-merge/head-name")" + op="rebase -i" + # ??? branch="$(cat "$git_dir/.dotest-merge/head-name")" elif [[ -d "$git_dir/.dotest-merge" ]] ; then - op="rebase -m" - # ??? branch="$(cat "$git_dir/.dotest-merge/head-name")" + op="rebase -m" + # ??? branch="$(cat "$git_dir/.dotest-merge/head-name")" # lvv: not always works. Should ./.dotest be used instead? elif [[ -f "$git_dir/MERGE_HEAD" ]] ; then - op="merge" - # ??? branch="$(git symbolic-ref HEAD 2>/dev/null)" - + op="merge" + # ??? branch="$(git symbolic-ref HEAD 2>/dev/null)" + else - [[ -f "$git_dir/BISECT_LOG" ]] && op="bisect" - # ??? branch="$(git symbolic-ref HEAD 2>/dev/null)" || \ - # branch="$(git describe --exact-match HEAD 2>/dev/null)" || \ - # branch="$(cut -c1-7 "$git_dir/HEAD")..." + [[ -f "$git_dir/BISECT_LOG" ]] && op="bisect" + # ??? branch="$(git symbolic-ref HEAD 2>/dev/null)" || \ + # branch="$(git describe --exact-match HEAD 2>/dev/null)" || \ + # branch="$(cut -c1-7 "$git_dir/HEAD")..." fi #### GET GIT HEX-REVISION - rawhex=`git rev-parse HEAD 2>/dev/null` rawhex=${rawhex/HEAD/} rawhex=${rawhex:0:6} - ### branch - + #### branch branch=${branch/master/M} # another method of above: @@ -475,25 +461,25 @@ parse_git_status() { ### compose vcs_info if [[ $init ]]; then - vcs_info=M$white=init + vcs_info=M$white=init else - if [[ "$detached" ]] ; then - branch="/dev/null`" + if [[ "$detached" ]] ; then + branch="/dev/null`" - elif [[ "$op" ]]; then - branch="$op:$branch" - if [[ "$op" == "merge" ]] ; then - branch+="<--$(git name-rev --name-only $(<$git_dir/MERGE_HEAD))" - fi - #branch="<$branch>" - fi - vcs_info="$branch$white=$rawhex" + elif [[ "$op" ]]; then + branch="$op:$branch" + if [[ "$op" == "merge" ]] ; then + branch+="<--$(git name-rev --name-only $(<$git_dir/MERGE_HEAD))" + fi + #branch="<$branch>" + fi + vcs_info="$branch$white=$rawhex" fi } - + parse_vcs_status() { @@ -522,20 +508,20 @@ parse_vcs_status() { ### VIM ( not yet works for multiple files ) - if [[ $vim_module = "on" ]] ; then - unset vim_glob vim_file vim_files - old_nullglob=`shopt -p nullglob` - shopt -s nullglob - vim_glob=`echo .*.swp` - eval $old_nullglob - - if [[ $vim_glob ]]; then - vim_file=${vim_glob#.} - vim_file=${vim_file%.swp} - # if swap is newer, then unsaved vim session - [[ .${vim_file}.swp -nt $vim_file ]] && vim_files=$vim_file - fi - fi + if [[ $vim_module = "on" ]] ; then + unset vim_glob vim_file vim_files + old_nullglob=`shopt -p nullglob` + shopt -s nullglob + vim_glob=`echo .*.swp` + eval $old_nullglob + + if [[ $vim_glob ]]; then + vim_file=${vim_glob#.} + vim_file=${vim_file%.swp} + # if swap is newer, then unsaved vim session + [[ .${vim_file}.swp -nt $vim_file ]] && vim_files=$vim_file + fi + fi ### file list @@ -546,12 +532,12 @@ parse_vcs_status() { [[ ${vim_files} ]] && file_list+=" "${RED}VIM:${vim_files} file_list=${file_list:+:$file_list} - if [[ ${#file_list} -gt $max_file_list_length ]] ; then - file_list=${file_list:0:$max_file_list_length} - if [[ $max_file_list_length -gt 0 ]] ; then - file_list="${file_list% *} ..." - fi - fi + if [[ ${#file_list} -gt $max_file_list_length ]] ; then + file_list=${file_list:0:$max_file_list_length} + if [[ $max_file_list_length -gt 0 ]] ; then + file_list="${file_list% *} ..." + fi + fi head_local="(${vcs_info}$vcs_color${file_list}$vcs_color)" @@ -563,34 +549,34 @@ parse_vcs_status() { } - trap - DEBUG >& /dev/null - trap '[[ $BASH_COMMAND != prompt_command_function ]] && set_shell_title $BASH_COMMAND' DEBUG >& /dev/null + trap - DEBUG >& /dev/null + trap '[[ $BASH_COMMAND != prompt_command_function ]] && set_shell_title $BASH_COMMAND' DEBUG >& /dev/null ###################################################################### PROMPT_COMMAND prompt_command_function() { - rc="$?" + rc="$?" - if [[ "$rc" == "0" ]]; then - rc="" - else - rc="$rc_color$rc$colors_reset$bell " - fi + if [[ "$rc" == "0" ]]; then + rc="" + else + rc="$rc_color$rc$colors_reset$bell " + fi - set_shell_title "$PWD/" - parse_vcs_status + set_shell_title "$PWD/" + parse_vcs_status - # if cwd_cmd have back-slash, then assign it value to cwd - # else eval cmd_cmd, cwd should have path after exection - eval "${cwd_cmd/\\/cwd=\\\\}" + # if cwd_cmd have back-slash, then assign it value to cwd + # else eval cmd_cmd, cwd should have path after exection + eval "${cwd_cmd/\\/cwd=\\\\}" - PS1="$colors_reset$rc$head_local$label$color_who_where$dir_color$cwd$tail_local$dir_color> $colors_reset" - - unset head_local tail_local pwd + PS1="$colors_reset$rc$head_local$label$color_who_where$dir_color$cwd$tail_local$dir_color> $colors_reset" + + unset head_local tail_local pwd } - PROMPT_COMMAND=prompt_command_function + PROMPT_COMMAND=prompt_command_function - unset rc id tty modified_files file_list + unset rc id tty modified_files file_list -# vim: set syntax=sh: +# vim: set ft=sh ts=8 sw=8 et: -- cgit v1.2.3