mechanicker icon

git pre-receive hook for mirroring

mechanicker | PRO | 07/18/20 07:22:17 PM UTC | 0 ⭐ | 1185 👁️ | Never ⏰ | []
Bash |

1.29 KB

|

None

|

0 👍

/

0 👎

#!/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