Include SVN prompt.
[profile.git] / .profile.d / svn-completion.bashrc
diff --git a/.profile.d/svn-completion.bashrc b/.profile.d/svn-completion.bashrc
new file mode 100644 (file)
index 0000000..3ccc627
--- /dev/null
@@ -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
+}