Skip track checks for merge-commit.
[git-scripts.git] / .bash-scm
blob4da4499146215b13e1e709a4709b35a8bcb36852
2 # Some bash code to get information about the current SCM repository.
4 # Usage: add ". .bash-scm" into your .bashrc
6 # Description of the functions:
8 # $(current_scm_info)
10 #    This can be used to display the current branch or revision inside the
11 #    bash prompt by adding $(current_scm_info) into the PS1 string.
13 # $(tab_title)
15 #    Information to display as the tab title. To avoid having a too long
16 #    string this output the name of the repository (if any) and the current
17 #    working directory. If outside a repository then the last two
18 #    directories are output. It is possible to pass one agurment true/false
19 #    to tab_title which is to output the hostname as prefix followed by
20 #    ':'. So the full format is:
22 #    host:[repository] dir
25 ####################################
26 #  Git
29 function git_root() {
30     git_dir=$(git rev-parse --git-dir 2> /dev/null) || return
31     result=$(dirname $git_dir)
32     if [ "$result" = "." ]; then
33         echo $PWD
34     else
35         echo $result
36     fi
39 function git_repository_name() {
40     echo $(basename "$(git_root)")
43 function git_current_branch() {
44     local result git_dir git_state
45     result=$(git symbolic-ref HEAD 2>/dev/null)
46     result=${result##refs/heads/}
47     git_dir=$(git rev-parse --git-dir 2> /dev/null) || return
49     if test -d "$git_dir/rebase-merge"; then
50         git_state=" - rebase - "
51     elif test -f "$git_dir/rebase-apply"; then
52         git_state=" - am - "
53     elif test -f "$git_dir/BISECT_LOG"; then
54         git_state=" - bisect - "
55     fi
57     echo "$result$git_state"
60 ####################################
61 #  Subversion
64 function svn_root() {
65     LAST=$PWD
66     while [[ ! "$PWD" = "/" && -d $PWD/.svn ]]; do
67         LAST=$PWD
68         cd ..
69     done
70     echo $LAST
73 function svn_repository_name() {
74     echo $(basename "$(svn_root)")
77 function svn_revision() {
78     if [[ -d .svn ]] ; then
79         echo "r$(LANG=C svn info | \
80          sed -n -e '/^Revision: \([0-9]*\).*$/s//\1/p')"
81     fi
84 ####################################
85 #  CVS
88 function cvs_repository_name() {
89     local result=$(< CVS/Repository)
90     echo "${result%%/*}"
93 function cvs_repository() {
94     if [[ -f CVS/Repository ]] ; then
95         echo "$(cvs_repository_name)"
96     fi
99 ####################################
100 #  Bazaar
103 function bzr_repository_name() {
104     echo $(basename "$(bzr info 2> /dev/null | awk '/shared repository/{print $3}')")
107 function bzr_current_branch() {
108     echo $(basename "$(bzr info 2> /dev/null | awk '/parent branch/{print $3}')")
111 ####################################
112 #  Helpers
115 function get_scm() {
116     while [[ ! "$PWD" = "$HOME" && ! "$PWD" = "/" ]]; do
117         if [[ -d .git ]]; then
118             echo GIT; return;
119         elif [[ -d .svn ]]; then
120             echo SVN; return;
121         elif [[ -d CVS/Root ]]; then
122             echo CVS; return;
123         elif [[ -d .bzr ]]; then
124             echo BZR; return;
125         fi
126         cd ..
127     done
128     echo ""
131 function current_scm_info() {
132     local info=""
133     local vcs=""
134     local SCM=$(get_scm)
136     if [ -z $SCM_INFO_FORMAT ]; then
137         SCM_INFO_FORMAT="(%s)"
138     fi
141     case "$SCM" in
142         GIT)
143             info="$(git_current_branch)";
144             if [[ -d $(git_root)/.git/svn ]]; then
145                 vcs="git-svn";
146             else
147                 vcs="git";
148             fi;
149             ;;
150         SVN)
151             info=$(svn_revision);
152             vcs="svn";
153             ;;
154         CVS)
155             info=$(cvs_repository);
156             vcs="cvs";
157             ;;
158         BZR)
159             info=$(bzr_current_branch);
160             vcs="bzr";
161             ;;
162         "")
163             return
164             ;;
165     esac;
167     printf $SCM_INFO_FORMAT "${vcs}'${info}";
170 function tab_title() {
171     local SCM=$(get_scm)
172     local cdir=$(basename "$PWD")
173     local info=""
175     if [[ "$1" == "true" ]]; then
176         HNAME="$(hostname):";
177     fi;
179     case "$SCM" in
180         GIT)
181             info="[$(git_repository_name)] "
182             ;;
183         SVN)
184             info="[$(svn_repository_name)] "
185             ;;
186         CVS)
187             info="[$(cvs_repository_name)] "
188             ;;
189         BZR)
190             info="[$(bzr_repository_name)] "
191             ;;
192         "")
193             info=$(basename $(dirname "$PWD"))/
194             ;;
195     esac;
197     echo "${HNAME}${info}${cdir}"