turn off py2 builds, that worked all right with all the tags
[infrastructure.git] / scripts / flab-sync.sh
index c132ec9..a2366fb 100755 (executable)
@@ -12,13 +12,20 @@ COMMAND=$(basename $0)
 DEFAULT_WORKDIR=/Users/parmentelat/git/sfa-flab-sync
 UPSTREAMREPO=ssh://thierry@git.onelab.eu/git/sfa.git
 FLABREPO=ssh://thierry@git.f-lab.fr/git/sfa.git
-TOTRACK="generic senslab"
-AGAINST=master
+# a very old commit for tracking upstream repo in case we re-create this local repo
+EPOCH=dc275f2
+
+# drop generic for now
+#SYNC_SPECS="master:senslab2 master:generic"
+SYNC_SPECS="master:senslab2"
 
 GIT_OPTIONS=""
 
+function step () {
+    echo "====================" step "$@"
+}
 function msg () {
-    echo "====================" "$@"
+    echo "==========" "$@"
 }
 
 
@@ -27,56 +34,129 @@ function failure () {
     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
-    git clone $FLABREPO $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
 }
 
 function merge_master_in_local_branches () {
-    # start with pulling the upstream master onto flab
-    cd $WORKDIR
-    # better safe than sorry
-    git checkout master
-    msg pulling master from onelab
-    git pull $GIT_OPTIONS $UPSTREAMREPO refs/heads/master:refs/heads/master
-    msg pushing master to flab
-    git push $GIT_OPTIONS $FLABREPO refs/heads/master:refs/heads/master
-
-    # manage our branches
-    for branch in $TOTRACK; do
-       cd $WORKDIR
-        # update the local branch for changes from flab chaps
-        # this is expected to be fast-forward
-       msg pulling $branch from flab
-       git pull $GIT_OPTIONS $FLABREPO refs/heads/$branch:refs/heads/$branch
+    step "merge_master_in_local_branches"
+
+    runcd $WORKDIR
+
+    # manage our branches: merge master into generic and generic into senslab
+    for merge in $SYNC_SPECS; do
+       # typically master
+       what=$(echo $merge | cut -d: -f1)
+       # typically senslab2
+       where=$(echo $merge | cut -d: -f2)
+       runcd $WORKDIR
         # also pull the latest master in the mix - we already have it at hand
         # this OTOH may not be fast forward
-       git checkout $branch
-       msg locally merging master in $branch
-       git merge $GIT_OPTIONS master
+       runcheckout $where
+        # update the local branch for changes from flab chaps
+        # this is expected to be fast-forward
+       msg pulling $where from flab
+       run git pull $GIT_OPTIONS flab refs/heads/$where:refs/heads/$where
+       msg locally merging $what in $where
+       run git pull $GIT_OPTIONS . $what
         # push back
-       msg pushing back $branch onto flab
-       git push $GIT_OPTIONS $FLABREPO refs/heads/$branch:refs/heads/$branch
+       if [ -n "$PUSH" ] ; then
+           msg pushing back $where onto flab
+           run git push $GIT_OPTIONS $FLABREPO refs/heads/$where:refs/heads/$where
+       fi
     done
 }
 
 function usage () {
     echo "Usage: $COMMAND [options]"
     echo "Options"
-    echo "-d dir : use this dir as a workdir for merging"
+    echo " -d dir : use this dir as a workdir for merging"
     echo "         please use a *dedicated* space"
+    echo " -r : restart from a fresh workdir"
+    echo " -m : master only"
+    echo " -p : does pushes"
+    echo " -s : skip pushes"
+    echo " -i : interactive"
     echo " -n : dry-run"
     echo " -v : verbose"
     exit 1
 }
 
+# default is not to push
+PUSH=
 function main () {
-    while getopts "d:nv" opt; do
+    while getopts "d:rmspinv" opt; do
        case $opt in 
            d) WORKDIR=$OPTARG; shift ;;
-           n) GIT_OPTIONS="$GIT_OPTIONS -n" ;;
-           v) set -x ; GIT_OPTIONS="$GIT_OPTIONS -v" ;;
+           r) RESTART_FROM_SCRATCH=true ;;
+           m) MASTER_ONLY=true ;;
+           s) PUSH=;;
+           p) PUSH=true;;
+           i) INTERACTIVE=true ;;
+           n) GIT_OPTIONS="$GIT_OPTIONS --dry-run" ;;
+           v) set -x ; GIT_OPTIONS="$GIT_OPTIONS --verbose" ;;
             *) usage;;
        esac
     done
@@ -85,7 +165,10 @@ function main () {
 
     trap failure ERR INT 
 
+    [ -n "$RESTART_FROM_SCRATCH" ] && trash_workdir
     check_or_create_workdir
+    update_local_master
+    [ -n "$MASTER_ONLY" ] && return
     merge_master_in_local_branches
  
 }