X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=.profile.d%2Fsvn-completion.bashrc;fp=.profile.d%2Fsvn-completion.bashrc;h=3ccc6273aa6f51a9c2d85f8942a5d20c6162d369;hb=69660d7ffcf12c1da215713e613f759e4abf2bec;hp=0000000000000000000000000000000000000000;hpb=3c2f9e59a2f2d1297ac9d05aa9c64a78d8c554e8;p=profile.git diff --git a/.profile.d/svn-completion.bashrc b/.profile.d/svn-completion.bashrc new file mode 100644 index 0000000..3ccc627 --- /dev/null +++ b/.profile.d/svn-completion.bashrc @@ -0,0 +1,65 @@ +function __svn_uuid() { + svn info 2>/dev/null | sed -n 's/^Repository UUID: //p' + return $? +} + +function __svn_dir() { + local last="$1"; shift + local uuid=$(__svn_uuid) + + if [ -n "$last" -a ! "$uuid" = "$last" ]; then + echo "$OLDPWD" + return 0 + fi + last="$uuid" + + cd .. + if [ "$PWD" = "$OLDPWD" ]; then + return 1 + fi + + __svn_dir "$last" + return $? +} + +function __svn_url() { + local url=$(svn info "$1" 2>/dev/null | sed -n 's/^URL: //p') + [ $? -gt 0 ] && return 1 + if [ "${url##*/}" = "trunk" ]; then + url="${url%%/trunk}" + fi + echo "${url##*/}" + return 0 +} + +function __svn_ps1() { + local base="$(__svn_dir)" + [ -z "$base" ] && return + + local ps1=$(__svn_url "$base") + if [ $? -gt 0 ]; then + return + fi + + if [ -n "${SVN_PS1_SHOWDIRTYSTATE-}" ]; then + local depth= + if [ -n "${SVN_PS1_DEPTH-}" ]; then + depth="--depth=$SVN_PS1_DEPTH" + fi + flags=$(svn status $depth "$base" 2>/dev/null | cut -c 1 | sort | uniq) + if [ -n "$flags" ]; then + if [ ! "${flags/[~!?]/}" = "$flags" ]; then + ps1="$ps1*" + fi + if [ ! "${flags/[ACDMR]/}" = "$flags" ]; then + ps1="$ps1+" + fi + fi + fi + + if [ -n "${1-}" ]; then + printf "$1" "$ps1" + else + printf " (%s)" "$ps1" + fi +}