Skip to content

Instantly share code, notes, and snippets.

@ctwise
Created August 8, 2008 19:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ctwise/4618 to your computer and use it in GitHub Desktop.
Save ctwise/4618 to your computer and use it in GitHub Desktop.
_bold=$(tput bold)
_normal=$(tput sgr0)
__vcs_dir() {
local vcs base_dir sub_dir ref
sub_dir() {
local sub_dir
sub_dir=$(stat -f "${PWD}")
sub_dir=${sub_dir#$1}
echo ${sub_dir#/}
}
git_dir() {
base_dir=$(git-rev-parse --show-cdup 2>/dev/null) || return 1
if [ -n "$base_dir" ]; then
base_dir=`cd $base_dir; pwd`
else
base_dir=$PWD
fi
sub_dir=$(git-rev-parse --show-prefix)
sub_dir="/${sub_dir%/}"
ref=$(git-symbolic-ref -q HEAD || git-name-rev --name-only HEAD 2>/dev/null)
ref=${ref#refs/heads/}
git_svn_url=$(git-config svn-remote.svn.url 2>/dev/null)
if [ -n "$git_svn_url" ]; then
vcs="git-svn"
alias pull="git-svn fetch"
alias commit="git commit -a"
alias push="commit && git-svn dcommit"
alias revert="git checkout"
else
vcs="git"
alias pull="git pull"
alias commit="git commit -a"
alias push="commit && git push"
alias revert="git checkout"
fi
base_dir="$(basename "${base_dir}")"
}
svn_dir() {
[ -d ".svn" ] || return 1
base_dir="."
while [ -d "$base_dir/../.svn" ]; do base_dir="$base_dir/.."; done
base_dir=`cd $base_dir; pwd`
sub_dir="/$(sub_dir "${base_dir}")"
ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }')
vcs="svn"
base_dir="$(basename "${base_dir}")"
alias pull="svn up"
alias commit="svn commit"
alias push="svn ci"
alias revert="svn revert"
}
cvs_dir() {
[ -d "CVS" ] || return 1
base_dir="."
while [ -d "$base_dir/../CVS" ]; do base_dir="$base_dir/.."; done
base_dir=`cd $base_dir; pwd`
sub_dir="/$(sub_dir "${base_dir}")"
if [ -e "CVS/Tag" ]; then
ref="$(cut -c 2- CVS/Tag)"
else
ref="trunk"
fi
vcs="cvs"
base_dir="$(basename "${base_dir}")"
alias pull="cvs update"
alias commit="cvs commit"
alias push="cvs commit"
alias revert=""
}
accurev_dir() {
base_dir=$(accurev info 2> /dev/null | grep ^Depot:) || return 1
base_dir=$(accurev info 2> /dev/null | grep ^Depot: | cut -f 3-)
ref=$(accurev info 2> /dev/null | grep ^Workspace/ref: | cut -f 2-)
top=$(accurev info 2> /dev/null | grep ^Top: | cut -f 3-)
sub_dir="/$(sub_dir "${top}")"
vcs="accurev"
alias pull="accurev update"
alias commit="accurev promote"
alias push="accurev promote"
alias revert=""
}
cvs_dir || svn_dir || accurev_dir || git_dir
if [ -n "$vcs" ]; then
__vcs_prefix="($vcs)"
__vcs_base_dir="${base_dir/$HOME/~}"
__vcs_ref="[$ref]"
__vcs_sub_dir="${sub_dir}"
alias st="$vcs status"
alias d="$vcs diff"
alias up="pull"
else
unalias st 2> /dev/null
unalias d 2> /dev/null
unalias up 2> /dev/null
unalias pull 2> /dev/null
unalias commit 2> /dev/null
unalias push 2> /dev/null
unalias revert 2> /dev/null
__vcs_prefix=''
__vcs_base_dir_temp=`basename "$PWD"`
if [ "$PWD" == "$HOME" ]; then
__vcs_base_dir="~"
else
__vcs_base_dir="`basename "$PWD"`"
fi
__vcs_ref=''
__vcs_sub_dir=''
fi
}
PROMPT_COMMAND=__vcs_dir
PS1='\[\033]0;\u@\h:\w\007\]\u:$__vcs_prefix\[${_bold}\]${__vcs_base_dir}\[${_normal}\]${__vcs_ref}\[${_bold}\]${__vcs_sub_dir}\[${_normal}\]\$ '
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment