#!/usr/bin/env bash Git() { echo "git $@" git $@ if [ "$?" != "0" ]; then echo "GIT RETURNED ERROR!" exit 1 fi } Git_may_fail() { git $@ } Git_branch() { echo "$(Git -C "$dir" status)" | grep 'On branch' | sed 's/On branch //' } gitk_start() { if [ -n "$DISPLAY" ]; then gitk --all & gitk_started="1" fi } dance() { echo echo br="$(Git_branch)" echo "$dir" cd "$dir" st="$(Git status)" mods="$(echo "$st" | grep 'modified:')" stline="$(echo "$st" | grep '\(behind\|ahead\|up-to-date\|diverged\)')" echo "$br" echo "$stline" if [ -z "$mods" -a -n "$(echo "$stline" | grep up-to-date)" ]; then return 0 fi gitk_start if [ -n "$(echo "$stline" | grep behind)" ]; then echo "Behind. git merge? (empty = no, 'ok' = yes)" read ok if [ "x$ok" = xok ]; then Git merge fi elif [ -n "$(echo "$stline" | grep ahead)" ]; then echo "Ahead. commit to new branch? (enter name, empty = no)" read wipbranch if [ -n "$wipbranch" ]; then Git checkout -b "$wipbranch" Git_may_fail commit -am wip #Git push --set-upstream origin "$wipbranch" Git checkout "$br" fi echo "$br: git reset --hard origin/$br ? (empty = no, 'ok' = yes)" read ok if [ "x$ok" = xok ]; then Git reset --hard "origin/$br" fi return 0 elif [ -n "$(echo "$stline" | grep diverged)" ]; then echo "Diverged. git reset --hard origin/$br ? (empty = no, 'ok' = yes)" read ok if [ "x$ok" = xok ]; then wipbranch="neels/wip_$(date +%Y%m%d_%H%M)" Git checkout -b "$wipbranch" Git_may_fail commit -am wip Git checkout "$br" Git reset --hard "origin/$br" fi elif [ -z "$(echo "$stline" | grep up-to-date)" ]; then echo "Nothing to do." echo "$st" fi if [ -n "$mods" ]; then echo "Local mods" echo "$mods" echo echo "commit to new branch? (enter name, empty = no)" read wipbranch if [ -n "$wipbranch" ]; then Git checkout -b "$wipbranch" Git_may_fail commit -am wip #Git push --set-upstream origin "$wipbranch" Git checkout "$br" return 0 fi echo "commit to this branch $br ? (empty = no, 'ok' = yes)" read ok if [ "x$ok" = xok ]; then Git commit -am wip #Git push return 0 fi fi } kill_gitk() { if [ "$gitk_started" = "1" ]; then kill %1 gitk_started="0" fi } basedir="$(pwd)" gitk_started="0" for gitdir in */.git ; do cd "$basedir" dir="$(dirname "$gitdir")" orig_branch="$(Git_branch)" kill_gitk dance cd "$basedir" if [ "$orig_branch" != master ]; then kill_gitk git -C "$dir" checkout master || continue dance cd "$basedir" pwd git -C "$dir" checkout "$orig_branch" fi # if [ "$dir" = "openbsc" ]; then # kill_gitk # Git checkout "sysmocom/iu" # dance # fi sleep .1 done kill_gitk echo echo ./st # vim: shiftwidth=2 expandtab