X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fflab-sync.sh;h=a2366fb374e89209c4eb4b3dd6346a0c665de863;hb=0f9d55936cdd62bb3b3d338ad3373a7de3b2b6a6;hp=ad25021ee6c4a442763f00fb174db7ebf5576ece;hpb=e1962aba9a8c942d4d36325a6b8b377df0c7384d;p=infrastructure.git diff --git a/scripts/flab-sync.sh b/scripts/flab-sync.sh index ad25021..a2366fb 100755 --- a/scripts/flab-sync.sh +++ b/scripts/flab-sync.sh @@ -12,54 +12,163 @@ 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 "==========" "$@" +} + + +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 +} + function merge_master_in_local_branches () { - # start with pulling the upstream master onto flab - cd $WORKDIR - git pull $GIT_OPTIONS $UPSTREAMREPO refs/heads/master:refs/heads/master - 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 - 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 - 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 - 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 [ -n "$WORKDIR" ] || WORKDIR=$DEFAULT_WORKDIR + 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 }