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 () {
84 pushd $REPO_DIR > /dev/null
85 BRANCHES=$(git branch -r | grep $PUSH_FROM | grep -v HEAD | sed "s/.*\///g" | grep -v master)
88 run "git push $PUSH_TO master:master" ${REPO_DIR}
89 for BRANCH in $BRANCHES ; do
90 run "git push $PUSH_TO $BRANCH:$BRANCH" ${REPO_DIR}
96 FAILED=0 # reset previous failure if any
98 NAME=$(basename ${arg} | sed s/.git$//g)
100 REPO_DIR=${LOCAL_MIRROR_DIR}/${NAME}
101 MIRROR_REPO=${MIRROR_GIT}/${GIT_NAME}
102 MASTER_REPO=${MASTER_GIT}/${GIT_NAME}
105 # if there is no remote repository it may be that we only have
106 # the repository locally and don't need to mirror
107 git ls-remote $MIRROR_REPO &> /dev/null
108 if [ $? -eq 0 ]; then
109 if [ -d ${REPO_DIR} ]; then
110 msg "pulling from ${NAME}"
111 run "git fetch origin --tags" ${REPO_DIR}
112 run "git fetch origin" ${REPO_DIR}
113 merge_all_branches $NAME origin $REPO_DIR
114 if [ $? -ne 0 ]; then
115 error "git-mirror.sh failed" "Can not fetch from ${MASTER_REPO}" $REPO_DIR
118 msg "mirroring ${NAME} for the first time"
119 run "git clone ${MIRROR_REPO}" ${LOCAL_MIRROR_DIR}
120 run "git remote add local_master ${MASTER_REPO}" ${REPO_DIR}
123 msg "pushing ${NAME} to local master"
124 run "git fetch local_master --tags" ${REPO_DIR}
125 run "git fetch local_master" ${REPO_DIR}
126 merge_all_branches $NAME local_master $REPO_DIR
127 if [ $FAILED -ne 0 ]; then
128 pushd ${REPO_DIR} > /dev/null
129 STATUS_OUT=$(git status)
131 error "git-mirror.sh failed on ${MIRROR_REPO}" "STATUS:\n$STATUS_OUT \n\n------------\n FAILED COMMANDS:\n$FAILED_CMDS" $REPO_DIR
133 run "git push --tags local_master" ${REPO_DIR}
134 push_all_branches $NAME local_master origin $REPO_DIR
136 # success, remove previous check file if any
137 CHECK_FILE=$REPO_DIR/$NOTIFIED_FILE
145 function failure () {
146 msg "Received signal - cleaning up $RUNNING_FILE and aborting"
151 while getopts ":hq" opt
159 echo "Usage: $0 [-q] REPONAME*"
163 echo "Invalid option: -$OPTARG" >&2
169 # is the stamp older than an hour ?
172 is_old=$(find $RUNNING_FILE -mmin +$GRACE 2> /dev/null)
173 if [ -n "$is_old" ] ; then
174 msg "$RUNNING_FILE is older than $GRACE minutes - removing"
178 if [ -f $RUNNING_FILE ] ; then
179 msg "Found $RUNNING_FILE - another git-mirror seems to be running. Aborting... "