]> git.wh0rd.org - home.git/blame - .bin/git-rb-all
git-rb-all: add more features
[home.git] / .bin / git-rb-all
CommitLineData
ba2e5f1f
MF
1#!/bin/bash
2# Helper to rewrite all local branches.
3
4rb_one() {
5 local b=$1
c7a7c928 6 shift
ba2e5f1f 7
c7a7c928 8 printf "${BRACKET}### ${GREEN}${b}${NORMAL}"
fc774894
MF
9 if ! git config --local "branch.${b}.merge" >/dev/null; then
10 echo " -> skipping due to missing merge branch"
11 else
12 echo
5730a476 13 git checkout -q "${b}" || return
c7a7c928
MF
14 git rebase "${opts[@]}" | sed -e '/^Fast-forwarded/d' -e "s:^:${BAD}:" -e "s:$:${NORMAL}:"
15 if [[ ${PIPESTATUS[0]} -ne 0 ]] ; then
fc774894
MF
16 git rebase --abort
17 fi
ba2e5f1f
MF
18 fi
19}
20
21usage() {
22 cat <<EOF
c7a7c928 23Usage: rb-all [-q]
ba2e5f1f
MF
24EOF
25 exit 1
26}
27
28main() {
c7a7c928
MF
29 local opts=(-q)
30 while [[ $# -ne 0 ]] ; do
31 case $1 in
32 -q|-v|-n|--no-stat|--stat) opts+=( "$1" );;
33 *) usage ;;
34 esac
35 shift
36 done
37
38 [[ -z ${GOOD} ]] && eval "$(bash-colors --env)"
ba2e5f1f 39
fa1a0920
MF
40 # Switch to the top dir in case the working dir doesn't exist in every branch.
41 cd "$(git rev-parse --show-toplevel)" || return
42
c7a7c928
MF
43 # Skip if rebase is in progress.
44 if [[ -e .git/rebase-merge/interactive ]] ; then
45 printf "${BAD}skipping due to active rebase${NORMAL}\n"
46 exit 1
47 fi
48
ba2e5f1f
MF
49 local orig b branches
50 orig=$(git rev-parse --abbrev-ref HEAD) || return
51
c7a7c928 52 branches=( $(git for-each-ref --format='%(refname:short)' 'refs/heads/*') )
ba2e5f1f 53 for b in "${branches[@]}" ; do
c7a7c928 54 rb_one "${b}" "${opts[@]}"
ba2e5f1f
MF
55 done
56
57 git checkout -q "${orig}"
58}
59main "$@"