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
16 echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx $@"
23 CHECK_FILE=$3/$NOTIFIED_FILE
32 echo -e "$MSG" | mail -s "$SUBJECT" $admin
40 COMMAND="$1 &> /dev/null"
47 pushd ${REPO} > /dev/null
52 FAILED_CMDS="$FAILED_CMDS\n$COMMAND"
57 function run_ignore_errors () {
59 OLD_FAILED_CMDS=$FAILED_CMDS
62 FAILED_CMDS=$OLD_FAILED_CMDS
65 function merge_all_branches () {
70 pushd $REPO_DIR > /dev/null
71 BRANCHES=$(git branch -r | grep $REMOTE | grep -v HEAD | sed "s/.*\///g" | grep -v master)
74 run "git checkout master" ${REPO_DIR}
75 run "git merge --ff $REMOTE/master" ${REPO_DIR}
76 for BRANCH in $BRANCHES ; do
77 run_ignore_errors "git branch $BRANCH $REMOTE/$BRANCH" ${REPO_DIR}
78 run "git checkout $BRANCH" ${REPO_DIR}
79 run "git merge --ff $REMOTE/$BRANCH" ${REPO_DIR}
83 function push_all_branches () {
88 pushd $REPO_DIR > /dev/null
89 BRANCHES=$(git branch -r | grep $REMOTE | grep -v HEAD | sed "s/.*\///g" | grep -v master)
92 run "git push $REMOTE master:master" ${REPO_DIR}
93 for BRANCH in $BRANCHES ; do
94 run "git push $REMOTE $BRANCH:$BRANCH" ${REPO_DIR}
100 FAILED=0 # reset previous failure if any
102 NAME=$(basename ${arg} | sed s/.git$//g)
104 REPO_DIR=${LOCAL_MIRROR_DIR}/${NAME}
105 MIRROR_REPO=${MIRROR_GIT}/${GIT_NAME}
106 MASTER_REPO=${MASTER_GIT}/${GIT_NAME}
109 # if there is no remote repository it may be that we only have
110 # the repository locally and don't need to mirror
111 git ls-remote $MIRROR_REPO &> /dev/null
114 if [ -d ${REPO_DIR} ]
116 msg "pulling from ${NAME}"
117 run "git fetch origin --tags" ${REPO_DIR}
118 run "git fetch origin" ${REPO_DIR}
119 merge_all_branches $NAME origin $REPO_DIR
122 error "git-mirror.sh failed" "Can not fetch from ${MASTER_REPO}" $REPO_DIR
125 msg "mirroring ${NAME} for the first time"
126 run "git clone ${MIRROR_REPO}" ${LOCAL_MIRROR_DIR}
127 run "git remote add local_master ${MASTER_REPO}" ${REPO_DIR}
130 msg "pushing ${NAME} to local master"
131 run "git fetch local_master --tags" ${REPO_DIR}
132 run "git fetch local_master" ${REPO_DIR}
133 merge_all_branches $NAME local_master $REPO_DIR
136 pushd ${REPO_DIR} > /dev/null
137 STATUS_OUT=$(git status)
139 error "git-mirror.sh failed on ${MIRROR_REPO}" "STATUS:\n$STATUS_OUT \n\n------------\n FAILED COMMANDS:\n$FAILED_CMDS" $REPO_DIR
141 run "git push --tags local_master" ${REPO_DIR}
142 push_all_branches $NAME local_master $REPO_DIR
144 # success, remove previous check file if any
145 CHECK_FILE=$REPO_DIR/$NOTIFIED_FILE
153 while getopts ":hq" opt
161 echo "USAGE: $0 [-q] REPONAME*"
165 echo "Invalid option: -$OPTARG" >&2
171 if [ -f $RUNNING_FILE ]
175 echo "Another git-mirror is running. Aborting... " $RUNNING_FILE