#!/bin/bash if [ $# -eq 1 ]; then if [ "$1" == "--help" ]; then >&2 echo \ 'Usage: gitolite-sync [options] Synchronize the configured git repositories. Options: #HELPTEXT# #' exit elif [ "$1" == "--version" ]; then echo '#VERSION#' exit fi fi if [ $# -ne 0 ]; then >&2 echo 'too many arguments' exit 1 fi . "#ETCDIR#/gitolite-sync.conf" if [ ${#repository_dirs[@]} -eq 0 ]; then >&2 echo 'no repository_dirs defined' exit 1 fi for repository_dir in "${repository_dir[@]}"; do if [ -z "${repository_dir}" ] || [ ! -d "${repository_dir}" ]; then >&2 printf 'cannot find "%s"\n' \ "${repository_dir}" exit 1 fi done for repository_dir in "${repository_dir[@]}"; do find "${repository_dir}" \ -type d \ -name '*.git' \ -printf '%p\n' \ -prune \ | while read -r path; do >&2 printf 'synchronizing "%s" ...\n' \ "${path}" remotes=$( git -C "${path}" remote -v \ | grep "${remote_regex}" \ | awk '{print $1}' \ | sort -u ) if [ -z "${remotes}" ]; then >&2 printf 'Repository "%s" has no backup remotes.\n' \ "${path}" continue fi for remote in ${remotes}; do git -C "${path}" fetch "${remote}" -p done branches=$( git -C "${path}" branch --all \ | sed ' s,^.\sremotes/[^/[:space:]]\+/,, t d ' ) if [ -n "$(git -C "${path}" tag -l)" ]; then has_tags=true else has_tags=false fi if [ -z "${branches}" ] && ! ${has_tags}; then >&2 printf 'Repository "%s" has no branches and no tags.\n' \ "${path}" continue fi for remote in ${remotes}; do if ${has_tags}; then git -C "${path}" push "${remote}" --tags fi if [ -z "${branches}" ]; then continue fi for branch in ${branches}; do if ! git -C "${path}" branch \ | sed 's/^.\s//' \ | grep -qxF "${branch}"; then git -C "${path}" branch "${branch}" --track "${remote}/${branch}" fi git -C "${path}" pull --ff-only "${remote}" "${branch}" 2>/dev/null git -C "${path}" push "${remote}" "${branch}" done done done done