#!/usr/bin/env bash
# Time-stamp: <2020-07-20 08:35:15 dhruva>
#------------------------------------------------------------------------------
# git repository mirroring based on pre-receive hook
#
# Inspired by:
# https://docs.gitlab.com/ee/user/project/repository/repository_mirroring.html
#------------------------------------------------------------------------------
set -e
# Circumvent push to mirror from quarantine directory
unset GIT_QUARANTINE_PATH
error=0
# Perfrom rollback if previous failed to ensure mirror and primary are in-sync
function rollback()
{
if [ -f ./rollback.sh ]; then
echo "executing rollback"
chmod +x ./rollback.sh
./rollback.sh
rm -f rollback.sh
fi
}
# Recover from failed previous push
rollback
# Disable bailing on error since we want to rollback
set +e
while read oldrev newrev refname; do
mirror_cmd="git push --quiet --force ../mirror.bare ${newrev}:${refname}"
echo ${mirror_cmd} >> rollback.sh
eval ${mirror_cmd} 2>&1
error=$?
if [ ${error} != 0 ]; then
echo "failed to mirror repository, will attempt rollback"
break
fi
done < "${1:-/dev/stdin}"
# Restore bailing on error since we want to preserve rollback file on error
set -e
if [ ${error} != 0 ]; then
rollback
fi
rm -f rollback.sh
exit ${error}
Comments