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 "==========" "$@"
}
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
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
}