+
+ basedir=${basedir}/..
+ realbasedir="$(vcs_realpath ${basedir})"
+ done
+
+ [[ ${realbasedir} == "/" ]] && return 1
+ vcs_comm[basedir]=${realbasedir}
+ return 0
+}
+
+# Git is powerfull
+git_detect(){
+ if check_command git && git rev-parse --is-inside-work-tree &> /dev/null; then
+ vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1
+ if [[ -d ${vcs_comm[gitdir]}/svn ]] ; then vcs_comm[overwrite_name]='git-svn'
+ elif [[ -d ${vcs_comm[gitdir]}/refs/remotes/p4 ]] ; then vcs_comm[overwrite_name]='git-p4' ; fi
+ return 0
+ fi
+ return 1
+}
+
+# Mercurial isn't
+hg_detect(){
+ check_command hg || return 1
+ vcs_comm[detect_need_file]=store
+ detect_by_dir '.hg'
+ return $?
+}
+
+# .svn in each directories
+svn_detect() {
+ check_command svn || return 1
+ [[ -d ".svn" ]] && return 0
+ return 1
+}
+
+bzr_detect(){
+ check_command bzr || return 1
+ vcs_comm[detect_need_file]=branch/format
+ detect_by_dir '.bzr'
+ return $?
+}
+
+cdv_detect(){
+ check_command cdv || return 1
+ vcs_comm[detect_need_file]=format
+ detect_by_dir '.cdv'
+ return $?
+}
+
+cvs_detect(){
+ check_command svn || return 1
+ [[ -d "./CVS" ]] && [[ -r "./CVS/Repository" ]] && return 0
+ return 1
+}
+
+darcs_detect(){
+ check_command darcs || return 1
+ # darcs diff seems a good choice since big diff is not the
+ # common state
+ darcs diff 2> /dev/null || return 1
+ vcs_comm[basedir]=$(darcs show repo |awk '{if($1 == "Root:") print $2}')
+ return 0
+}
+
+# Find git's branch
+git_getbranch (){
+ local gitbranch gitdir=$1 tmp actiondir
+ local gitsymref='git symbolic-ref HEAD'
+
+ # In certain circumstances, we have to take into account
+ # actions
+ actiondir=''
+ for tmp in "${gitdir}/rebase-apply" \
+ "${gitdir}/rebase" \
+ "${gitdir}/../.dotest"; do
+ if [[ -d ${tmp} ]]; then
+ actiondir=${tmp}
+ break
+ fi
+ done
+ if [[ -n ${actiondir} ]]; then
+ gitbranch="$(${gitsymref} 2> /dev/null)"
+ [[ -z ${gitbranch} ]] && [[ -r ${actiondir}/head-name ]] \
+ && gitbranch="$(< ${actiondir}/head-name)"
+
+ # MERGE_HEAD state
+ elif [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
+ gitbranch="$(eval $gitsymref 2> /dev/null)"
+ [[ -z ${gitbranch} ]] && gitbranch="$(< ${gitdir}/MERGE_HEAD)"
+
+ # rebase
+ elif [[ -d "${gitdir}/rebase-merge" ]] ; then
+ gitbranch="$(< ${gitdir}/rebase-merge/head-name)"
+
+ # dotest
+ elif [[ -d "${gitdir}/.dotest-merge" ]] ; then
+ gitbranch="$(< ${gitdir}/.dotest-merge/head-name)"
+
+ # Normal case