sfa-1.0-8 build script
[infrastructure.git] / scripts / git-mirror.sh
index 5da27f0..b28a725 100755 (executable)
@@ -1,9 +1,14 @@
 #!/bin/bash
 
+ADMINS="Talip-Baris.Metin@inria.fr Thierry.Parmentelat@inria.fr"
 MIRROR_GIT="git://git.planet-lab.org"
 MASTER_GIT="/git"
 LOCAL_MIRROR_DIR="/git-mirror"
 QUIET=0
+FAILED=0
+FAILED_CMDS=""
+NOTIFIED_FILE="NOTIFIED_ADMINS"
+RUNNING_FILE=$LOCAL_MIRROR_DIR/RUNNING_MIRROR
 
 function msg () {
     if [ $QUIET -eq 0 ]
@@ -13,7 +18,20 @@ function msg () {
 }
 
 function error () {
-    echo "[ERROR] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx $@"
+    SUBJECT=$1
+    MSG=$2
+    CHECK_FILE=$3/$NOTIFIED_FILE
+
+    if [ -f $CHECK_FILE ]
+    then
+        return
+    fi
+
+    for admin in $ADMINS
+    do
+        echo -e "$MSG" | mail -s "$SUBJECT" $admin
+    done
+    touch $CHECK_FILE
 }
 
 function run () {
@@ -28,22 +46,35 @@ function run () {
 
     pushd ${REPO} > /dev/null
     eval $COMMAND
+    if [ $? -ne 0 ]
+    then
+        FAILED=1
+        FAILED_CMDS="$FAILED_CMDS\n$COMMAND" 
+    fi
     popd > /dev/null
 }
 
+function run_ignore_errors () {
+    OLD_FAILED=$FAILED
+    OLD_FAILED_CMDS=$FAILED_CMDS
+    run "$1" "$2"
+    FAILED=$OLD_FAILED
+    FAILED_CMDS=$OLD_FAILED_CMDS
+}
+
 function merge_all_branches () {
     NAME=$1
     REMOTE=$2
     REPO_DIR=$3
 
-    pushd $REPO_DIR
+    pushd $REPO_DIR > /dev/null
     BRANCHES=$(git branch -r | grep $REMOTE | grep -v HEAD | sed "s/.*\///g" | grep -v master)
     popd > /dev/null
 
     run "git checkout master" ${REPO_DIR}
     run "git merge --ff $REMOTE/master" ${REPO_DIR}
     for BRANCH in $BRANCHES ; do
-        run "git branch $BRANCH $REMOTE/$BRANCH" ${REPO_DIR}
+        run_ignore_errors "git branch $BRANCH $REMOTE/$BRANCH" ${REPO_DIR}
         run "git checkout $BRANCH" ${REPO_DIR}
         run "git merge --ff $REMOTE/$BRANCH" ${REPO_DIR}
     done
@@ -54,7 +85,7 @@ function push_all_branches () {
     REMOTE=$2
     REPO_DIR=$3
 
-    pushd $REPO_DIR
+    pushd $REPO_DIR > /dev/null
     BRANCHES=$(git branch -r | grep $REMOTE | grep -v HEAD | sed "s/.*\///g" | grep -v master)
     popd > /dev/null
 
@@ -66,12 +97,15 @@ function push_all_branches () {
 
 function mirror () {
     for arg in "$@" ; do
+        FAILED=0   # reset previous failure if any
+
         NAME=$(basename ${arg} | sed s/.git$//g)
         GIT_NAME=${NAME}.git
         REPO_DIR=${LOCAL_MIRROR_DIR}/${NAME}
         MIRROR_REPO=${MIRROR_GIT}/${GIT_NAME}
         MASTER_REPO=${MASTER_GIT}/${GIT_NAME}
 
+
         # if there is no remote repository it may be that we only have
         # the repository locally and don't need to mirror
         git ls-remote $MIRROR_REPO &> /dev/null
@@ -85,7 +119,7 @@ function mirror () {
                 merge_all_branches $NAME origin $REPO_DIR
                 if [ $? -ne 0 ]
                 then
-                    error "Can not fetch from ${MASTER_REPO}"
+                    error "git-mirror.sh failed" "Can not fetch from ${MASTER_REPO}" $REPO_DIR
                 fi
             else
                 msg "mirroring ${NAME} for the first time"
@@ -97,12 +131,19 @@ function mirror () {
             run "git fetch local_master --tags" ${REPO_DIR}
             run "git fetch local_master" ${REPO_DIR}
             merge_all_branches $NAME local_master $REPO_DIR
-            if [ $? -ne 0 ]
+            if [ $FAILED -ne 0 ]
             then
-                error "Can not fetch from ${MIRROR_REPO}"
+                pushd ${REPO_DIR} > /dev/null
+                STATUS_OUT=$(git status)
+                popd > /dev/null                
+                error "git-mirror.sh failed on ${MIRROR_REPO}" "STATUS:\n$STATUS_OUT \n\n------------\n FAILED COMMANDS:\n$FAILED_CMDS" $REPO_DIR
             else
                 run "git push --tags local_master" ${REPO_DIR}
                 push_all_branches $NAME local_master $REPO_DIR
+
+                # success, remove previous check file if any
+                CHECK_FILE=$REPO_DIR/$NOTIFIED_FILE
+                rm -f $CHECK_FILE
             fi
         fi
     done
@@ -126,6 +167,18 @@ do
   esac
 done
 
-shift $((OPTIND-1))
-mirror $@
+
+if [ -f $RUNNING_FILE ]
+then
+    if [ $QUIET -eq 0 ]
+    then
+        echo "Another git-mirror is running. Aborting... " $RUNNING_FILE
+    fi
+else
+    shift $((OPTIND-1))
+    touch $RUNNING_FILE
+    mirror $@
+    rm -f $RUNNING_FILE
+fi
+