+function step () {
+ echo "====================" step "$@"
+}
+function msg () {
+ echo "==========" "$@"
+}
+
+
+function failure () {
+ echo Emergency exit -- Bailing out
+ exit 1
+}
+
+function runcd () {
+ to=$1; shift
+ msg "Going to directory $to"
+ cd $to
+}
+
+function runcheckout () {
+ branch=$1; shift
+ msg "Checking out branch $branch"
+ git checkout $branch
+}
+
+function run () {
+ if [ -z "$INTERACTIVE" ] ; then
+ "$@"
+ else
+ echo -n "** Run" "$@ " "[y]/n/q ? "
+ read _answer
+ case x"$_answer" in
+ x|xy*) echo Running "$@" ; "$@" ;;
+ xq*) echo Exiting ; exit 0 ;;
+ *) echo Skipped ; return ;;
+ esac
+ fi
+}
+
+function trash_workdir () {
+ if [ -d $WORKDIR ] ; then
+ step "trash_workdir"
+ msg "Cleaning up $WORKDIR"
+ run rm -rf $WORKDIR
+ fi
+}
+
+function check_or_create_workdir () {
+ [ -d $WORKDIR ] && return
+ step "check_or_create_workdir"
+ msg Restarting with a brand new workdir $WORKDIR
+ run git clone $FLABREPO $WORKDIR
+ runcd $WORKDIR
+ run git remote rename origin flab
+ # create branch upstreammaster as the tracking branch for upstream
+ run git checkout -b upstreammaster $EPOCH
+ run git remote add -t upstreammaster -m master upstream $UPSTREAMREPO
+}
+
+function update_local_master () {
+ step "update_local_master"
+ runcd $WORKDIR
+ # pull onelab master onto upstreammaster - should be fast-forward
+ runcheckout upstreammaster
+ msg "pulling upstreammaster from upstream"
+ run git pull $GIT_OPTIONS upstream refs/heads/master:refs/heads/upstreammaster
+ # pull flab master onto master -
+ runcheckout master
+ msg "pulling master from flab"
+ run git pull $GIT_OPTIONS flab refs/heads/master:refs/head/master
+ # merge upstream upon local
+ msg "locally merging upstream into (flab) master"
+ run git pull $GIT_OPTIONS . upstreammaster
+ if [ -n "$PUSH" ] ; then
+ msg pushing master back to flab
+ run git push $GIT_OPTIONS flab refs/heads/master:refs/heads/master
+ fi
+}
+