summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README2
-rw-r--r--git-prompt.conf54
-rwxr-xr-xgit-prompt.sh714
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="<detached:`git name-rev --name-only HEAD 2>/dev/null`"
+ if [[ "$detached" ]] ; then
+ branch="<detached:`git name-rev --name-only HEAD 2>/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: