3 ADMINS="Talip-Baris.Metin@inria.fr Thierry.Parmentelat@inria.fr"
4 MIRROR_GIT="git://git.planet-lab.org"
6 LOCAL_MIRROR_DIR="/git-mirror"
10 NOTIFIED_FILE="NOTIFIED_ADMINS"
11 RUNNING_FILE=$LOCAL_MIRROR_DIR/RUNNING_MIRROR
14 if [ $QUIET -eq 0 ] ; then
15 echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" "$@"
22 CHECK_FILE=$3/$NOTIFIED_FILE
24 if [ -f $CHECK_FILE ]; then
28 for admin in $ADMINS; do
29 echo -e "$MSG" | mail -s "$SUBJECT" $admin
35 if [ $QUIET -eq 1 ]; then
36 COMMAND="$1 &> /dev/null"
43 pushd ${REPO} > /dev/null
47 FAILED_CMDS="$FAILED_CMDS\n$COMMAND"
52 function run_ignore_errors () {
54 OLD_FAILED_CMDS=$FAILED_CMDS
57 FAILED_CMDS=$OLD_FAILED_CMDS
60 function merge_all_branches () {
65 pushd $REPO_DIR > /dev/null
66 BRANCHES=$(git branch -r | grep $REMOTE | grep -v HEAD | sed "s/.*\///g" | grep -v master)
69 run "git checkout master" ${REPO_DIR}
70 run "git merge --ff $REMOTE/master" ${REPO_DIR}
71 for BRANCH in $BRANCHES ; do
72 run_ignore_errors "git branch $BRANCH $REMOTE/$BRANCH" ${REPO_DIR}
73 run "git checkout $BRANCH" ${REPO_DIR}
74 run "git merge --ff $REMOTE/$BRANCH" ${REPO_DIR}
78 function push_all_branches () {
83 pushd $REPO_DIR > /dev/null
84 BRANCHES=$(git branch -r | grep $REMOTE | grep -v HEAD | sed "s/.*\///g" | grep -v master)
87 run "git push $REMOTE master:master" ${REPO_DIR}
88 for BRANCH in $BRANCHES ; do
89 run "git push $REMOTE $BRANCH:$BRANCH" ${REPO_DIR}
95 FAILED=0 # reset previous failure if any
97 NAME=$(basename ${arg} | sed s/.git$//g)
99 REPO_DIR=${LOCAL_MIRROR_DIR}/${NAME}
100 MIRROR_REPO=${MIRROR_GIT}/${GIT_NAME}
101 MASTER_REPO=${MASTER_GIT}/${GIT_NAME}
104 # if there is no remote repository it may be that we only have
105 # the repository locally and don't need to mirror
106 git ls-remote $MIRROR_REPO &> /dev/null
107 if [ $? -eq 0 ]; then
108 if [ -d ${REPO_DIR} ]; then
109 msg "pulling from ${NAME}"
110 run "git fetch origin --tags" ${REPO_DIR}
111 run "git fetch origin" ${REPO_DIR}
112 merge_all_branches $NAME origin $REPO_DIR
113 if [ $? -ne 0 ]; then
114 error "git-mirror.sh failed" "Can not fetch from ${MASTER_REPO}" $REPO_DIR
117 msg "mirroring ${NAME} for the first time"
118 run "git clone ${MIRROR_REPO}" ${LOCAL_MIRROR_DIR}
119 run "git remote add local_master ${MASTER_REPO}" ${REPO_DIR}
122 msg "pushing ${NAME} to local master"
123 run "git fetch local_master --tags" ${REPO_DIR}
124 run "git fetch local_master" ${REPO_DIR}
125 merge_all_branches $NAME local_master $REPO_DIR
126 if [ $FAILED -ne 0 ]; then
127 pushd ${REPO_DIR} > /dev/null
128 STATUS_OUT=$(git status)
130 error "git-mirror.sh failed on ${MIRROR_REPO}" "STATUS:\n$STATUS_OUT \n\n------------\n FAILED COMMANDS:\n$FAILED_CMDS" $REPO_DIR
132 run "git push --tags local_master" ${REPO_DIR}
133 push_all_branches $NAME local_master $REPO_DIR
135 # success, remove previous check file if any
136 CHECK_FILE=$REPO_DIR/$NOTIFIED_FILE
144 function failure () {
145 msg "Received signal - cleaning up $RUNNING_FILE and aborting"
150 while getopts ":hq" opt
158 echo "Usage: $0 [-q] REPONAME*"
162 echo "Invalid option: -$OPTARG" >&2
168 # is the stamp older than an hour ?
171 is_old=$(find $RUNNING_FILE -mmin +$GRACE 2> /dev/null)
172 if [ -n "$is_old" ] ; then
173 msg "$RUNNING_FILE is older than $GRACE minutes - removing"
177 if [ -f $RUNNING_FILE ] ; then
178 msg "Found $RUNNING_FILE - another git-mirror seems to be running. Aborting... "